LoginSignup
9
10

More than 3 years have passed since last update.

herokuを定期的に自動deployして、ペットの様子を監視できるLINE botを作った

Posted at

はじめに

義姉夫婦が旅行に行く間、ウサギ(そらちゃん)を預かることになった。
旅行中もお義姉さんがそらちゃんを近くに感じられるように、
メッセージを送ったら、そらちゃんの現在の様子を確認できるbotを作った。

こんな人向け

  • LINEmessagingAPIを使って開発したい人
  • LINEmessagingAPIとHerokuを連携してみたい人
  • line-bot-sdk-pythonを使用して開発をしてみたい人

様相技術

  • Python
  • line-bot-sdk-python
  • heroku
  • macOS
  • Android
  • Selenium

方法

だいたいこんな感じ
udsuds.png

  1. droidcamで兎を常時撮影
  2. 5分毎に映像のスクショを撮影
  3. Herokuにdeploy
  4. 義姉がメッセージを送った場合に、最新の画像が送信される

目次

LINE チャネルの作成

私が以前作成した記事を参照してください
※ フィードバックくれると嬉しいです。

Herokuアプリの作成

下記よりHeroku CLIをインストール
https://devcenter.heroku.com/ja/articles/heroku-cli

Heroku loginをする(ブラウザが立ち上がります)

$heroku login

HerokuCLIでアプリを作成する

$heroku create {app名}    
Creating ⬢ {app名}... done
https://{app名}.herokuapp.com/ | https://git.heroku.com/{app名}.git

ローカルのファイルとHerokuアプリの連携

$mkdir {app名}
$cd {app名}
$git init
$heroku git:remote -a {app名}

※ これで、git push heroku masterすれば、deployされる

カメラの準備

  • AndroidのPlayStoreでdroidcamと検索すれば、インストールできます
    droidcam
  • アプリを立ち上げて、記載されているIPアドレスをブラウザに入力すれば映像が確認できるはずです。

画像を返却するためのアプリを作成する

$cd {app名}
$pip3 install line-bot-sdk
$mkdir static

ファイル作成

下記ファイルを作成する

main.py
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, ImageSendMessage
)
import os

app = Flask(__name__)
#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
APP_NAME = os.environ["APP_NAME"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        ImageSendMessage(
            original_content_url='https://' + APP_NAME + '.herokuapp.com/static/image.png',
            preview_image_url='https://' + APP_NAME + '.herokuapp.com/static/image.png'
        ))


if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)
requirements.txt
Flask==0.12.2
line-bot-sdk==1.5.0
Procfile
web: python main.py
runtine.txt
python-3.7.3

環境変数設定

$heroku config:set APP_NAME={app名} YOUR_CHANNEL_ACCESS_TOKEN={LINEチャネルのアクセストークン} YOUR_CHANNEL_SECRET={LINEチャネルのシークレット}

動作確認

staticフォルダに任意のimage.pngを格納。

$git add .
$git commit -m "hoge"
$git push heroku master

Webhook設定

作成したLINEチャネル > Messaging API設定 > Webhook URLに
「https://{app名}.herokuapp.com/callback」を指定する。

対象チャネルにメッセージを送ると、画像が返却されるはずです。

droidcamから画像を作成する

今回はdroidcamの映像をブラウザで開いて、スクショを撮ることで画像を作成した。

↓こんなかんじ
3207.jpg

chrome webDriverのインストール

Seleniumを使用して、スクショを撮るのでchrome webDriverをインストールする必要がある。
こちらからダウンロードされているバージョンのwebDriverをインストールしてください
解凍後、chromedriverを/usr/local/binに移動します。

コンソールでchromedriverを実行した際に下記のようになればOKです。

% chromedriver      
Starting ChromeDriver 89.0.4389.23 (61b08ee2c50024bab004e48d2b1b083cdbdac579-refs/branch-heads/4389@{#294}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

seleniumのインストール

下記でOKです。

pip3 install selenium

build用のスクリプトを作成する

main.pyと同じ階層に下記のファイルを追加してください。
※ 設定値は環境によって変更してください

build.py
! /bin/sh
import cv2
import os
import time
import subprocess
from selenium import webdriver

wd= '{main.pyが存在するディレクトリ}'
driver = webdriver.Chrome()
driver.get('{droidcamのURL}')
driver.set_window_size(1250, 1036)
driver.execute_script("document.body.style.zoom='90%'")
time.sleep(2)
driver.save_screenshot(wd + "/static/image.png")
driver.quit()

os.chdir(wd)
cmd = '/usr/local/bin/git add .;/usr/local/bin/git commit -m "hoge";/usr/local/bin/git push heroku master'
subprocess.call(cmd, shell=True)

動作確認

下記を実行すると、画像が更新されherokuにdeployが行われるはずです。

python build.py

定期実行用にcronを設定

crontab -e

下記のように設定します。

PATH={自分環境のPATHの値}
*/5 * * * * * /usr/bin/python3 {フルパス}/build.py

おわりに

はじめてheroku触れたのでよかった。
誰かの参考になれば幸いです。
雑に書いたので、何でもいいのでフィードバックもらえると嬉しいです。

この記事で正解出してそうなので、真似してやってみる。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10