LINEでメッセージを入力するとRaspberryPiから画像が送信されるプログラムとその様子
LINENotify、LINEDevelopers、ngrokを用いてLINEで特定のメッセージを入力するとRaspberryPiから画像が送信されるプログラムとその様子について。
画像はRaspberryPiに繋げたUSBカメラで撮影したもので、LINEで特定のメッセージが入力されるとUSBカメラを起動します。
プログラミング言語はPythonを使っています。
目次
参考サイト
これらのサイトを参考に作成しました。
https://fabcross.jp/category/make/sorepi/20200831_raspi_tadaima.html
https://datacoach.me/data/tips/python-linebot/#ngrok
https://note.com/tamurasann/n/n0ff5642fa9bd
https://hakengineer.xyz/2017/10/10/post-425/
LINEに画像が送信されるまでの流れ
手順1 RaspberryPi側で操作
まず、RaspberryPiのターミナル(LXTerminal)を開いて下のコマンドを実行
$ ./ngrok authtoken Your Authtoken
Your Authtokenの部分にはngrokに記載されているYour Authtokenを入れる

手順2 RaspberryPi側で操作
続いて、同じターミナルで下のコマンドを実行してhttpsから始まるURLをコピー
$ ./ngrok http 8080
無料プランは$ ./ngrok http 8080のコマンドを実行する度にURLが変わります。

手順3 LINE Developers側で操作
LINE DevelopersのMessaging APIにあるWebhook URLのEdit(編集)をクリックして、先ほどコピーしたhttpsから始まるURLを貼り付けてから、URLの末尾に/callbackをつけてupdateをクリック
上画像のURLの場合↓
https://33bad44cf610.ngrok.io/callback

手順4 RaspberryPi側で操作
$ ./ngrok http 8080を入力したターミナルは閉じずに、新しく別のターミナルを開いて下のコマンドを実行
$ python3 プログラム名
私の場合はプログラム名がLINE_pic03_4.pyなので、$ python3 LINE_pic03_4.py を実行しました

手順5 LINE側で操作
LINE Developersで作成したチャンネルに“確認”または“チェック”の特定のメッセージを入力してしばらくすると、”OK”のメッセージとRaspberryPiに繋げているUSBカメラで撮影した画像がLINE Notifyに送られてくる
LINE Notifyの使い方はこちら「RaspberryPiからスマホのLINEにメッセージを送信する方法」の投稿で紹介しています。
LINE Developersで作成したチャンネル↓
”てきとう”という名前で作成しました

スマホのLINEで友達追加した様子↓
※公式アカウントに入っている

プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import requests import cv2 import datetime from argparse import ArgumentParser from flask import Flask, request, abort from linebot import LineBotApi,WebhookHandler from linebot.exceptions import InvalidSignatureError from linebot.models import MessageEvent, TextMessage, TextSendMessage app = Flask(__name__) #LINE Developersに書かれてあるChannel secretとChannel access tokenを""で囲んで挿入 channel_secret = "チャンネルシークレット" channel_access_token = "チャンネルアクセストークン" line_bot_api = LineBotApi(channel_access_token) handler = WebhookHandler(channel_secret) #LINE DevelopersのWebhookに指定したURLにリクエストを送信して、問題がなければhandleに定義されている関数を呼ぶ @app.route("/callback", methods=['POST']) def callback(): signature = request.headers['X-Line-Signature'] body = request.get_data(as_text=True) app.logger.info("Request body: " + body) try: handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' #LINEで入力したメッセージに合わせて処理をする @handler.add(MessageEvent, message=TextMessage) def handle_message(event): messe = event.message.text #"確認" または "チェック"のメッセージを入力した場合"OK"のメッセージを送信して、 #撮影してからLINE Notifyで画像を送信 if messe == "確認" or messe == "チェック": line_bot_api.reply_message( event.reply_token, TextSendMessage("OK")) #画像の名前(撮影した日付と時刻.png) name = "LINE_pic/raspic" + datetime.datetime.today().strftime('%Y%m%d_%H%M%S') + ".png" #USBカメラを起動 capture = cv2.VideoCapture(0) #撮影できれば変数retにTrueが入る ret, image = capture.read() if ret == True: cv2.imwrite(name, image)# 撮影した画像を保存 token = 'LINE Notifyで発行されたトークン' url = 'https://notify-api.line.me/api/notify'#LINE NotifyのAPIのURL ms_data="画像の送信"#メッセージ内容 send_data = {'message': ms_data}#メッセージ headers = {'Authorization': 'Bearer ' + token}#トークン名 files = {'imageFile': open(name, 'rb')}#画像ファイルのオープン #送信 res = requests.post(url, data=send_data, headers=headers, files=files) print(res)#メッセージがが送れたかどうかの結果を表示 else:#"確認" または "チェック"以外のメッセージを入力した場合 line_bot_api.reply_message( event.reply_token, TextSendMessage('"確認"または"チェック"を入力してください')) if __name__ == "__main__": arg_parser = ArgumentParser( usage='Usage: python ' + __file__ + ' [--port ] [--help]' ) arg_parser.add_argument('-p', '--port', default=8080, help='port')#8000だとできなかった arg_parser.add_argument('-d', '--debug', default=False, help='debug') options = arg_parser.parse_args() app.run(debug=options.debug, port=options.port) |
opencvのインストールはこちらhttps://qiita.com/masaru/items/658b24b0806144cfeb1cのサイトを参考にしました。
LINEでメッセージと画像のやり取りをしている様子
”確認”または”チェック”のメッセージやそれ以外のメッセージを入力して、正しく実行されるか試しています。

LINE Notifyに画像が送信されてきた様子↓
USBカメラで撮影した画像が暗かったので”確認”または”チェック”のメッセージを入力して”OK”が返信される度にUSBカメラを動かして良く写るようにしています。

メルカリで買った安いUSBカメラを使っているからなのか、それともラズパイに取り付けるカメラじゃないからなのか、原因はわからないが暗く写ってしまう
本当は下のような画像を撮影してLINEに送信したい
※この画像↓はスマホで撮影しました

LINEを開いた様子↓

LINE NotifyとLINE Developersで作成したチャンネル(”てきとう”)でメッセージと画像のやり取りが行われています。
電気代やRaspberryPiとカメラを固定するのに手間はかかるけど
鍵のかけ忘れやガス、火の確認。他にもペットの様子などを確認したいときにLINEで特定のメッセージを入力するとUSBカメラで撮影した画像が送信されます。
専用のデバイスを買った方が早いし楽だけど、一応RaspberryPiでも作れる。
動かなかったときにやったこと
●RaspberryPiのPythonのデフォルトをpython2.7からpython3に変更https://www.souichi.club/raspberrypi/python3-default/
●httpsから始まるURLの末尾に/callbackを付け忘れの確認
●プログラムが8000になっていたので8080に変更
●flaskとline-bot-sdkのインストールのし忘れ
自分はpip3でインストールしました
$ pip3 install flask
$ pip3 install line-bot-sdk
次に改善すること
●RaspberryPiのフォルダにある撮影した画像の名前は、撮影した日付と時刻になっているのですが、LINE Notifyに送信した画像の名前は撮影した日付と時刻になっていない
●LINE Notifyで画像を送信しないで、LINE Developersだけでメッセージの応答と画像の送信をする