【押ボタンでLINE送信】高齢者向けの押ボタン式LINE投稿装置を作った(②LINEメッセージ送信編)
前回は電子回路を組む部分を紹介したので、今回はLINEメッセージ送信編です。
前回の記事はこちら。 yoshy-toshy.hateblo.jp
作り方
すでに前回の目標(ボタンを押すとコンソール上にメッセージが表示される状態)が完成した前提で説明します。
本記事での目標
ボタンを押すと、LINEメッセージが送信されるところまでを作ります。
自分の個人アカウント(あなたが普段プライベートで使っているアカウント)でLINEメッセージを送信するわけではなく、ボット用のアカウントを作り、そのボットにメッセージを送信させる仕組みです。
おおまかな流れ
下記の流れで作成します。
- ボット用アカウントの作成
- プログラムの修正
- アクセストークンの設定
- 宛先のUser IDの設定
- プログラムの実行
1. ボット用アカウントの作成
まず、公式ドキュメント(以下URL)に載っている手順で、チャネルを作成します。 作成したチャネル名はそのままボットの名前になります。
https://developers.line.biz/ja/docs/messaging-api/getting-started/
作成が終わると以下のようになります。
作成したチャネルをクリックして下の方にスクロールすると、友達追加用のQRコードが表示されているので、自分のスマートフォンで読み取って友達になっておきます。
2. プログラムの修正
前回のコードでは、ボタンを押したときにprint(self.text)
でコンソールにメッセージを表示する処理を実行していましたが、今回のコードでは、_send()
というメソッドを作り、LINEにself.text
のメッセージを送信する処理に書き換えます。
下記が修正版のコードです。Raspberry Piの任意のディレクトリに「line.py」というファイル名で保存します。
import RPi.GPIO as GPIO import time import os import json import urllib.request LINE_ACCESS_TOKEN=os.environ.get("LINE_ACCESS_TOKEN") LINE_USER_ID=os.environ.get("LINE_USER_ID") BUTTON_MESSAGE={} BUTTON_MESSAGE[6]="こんにちは" BUTTON_MESSAGE[13]="ありがとう" BUTTON_MESSAGE[19]="さよなら" BUTTON_MESSAGE[26]="また会いましょう" class Button: gpio=None before=False now=False token="" to="" text="" def __init__(self,gpio,token,to,text): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) self.gpio=gpio self.token=token self.to=to self.text=text def _send(self): data = {"to" : self.to, "messages" : [{"type" : "text", "text" : self.text}]}; headers = {"Content-Type" : "application/json; charset=UTF-8", "Authorization" : "Bearer " + self.token}; req = urllib.request.Request("https://api.line.me/v2/bot/message/push", json.dumps(data).encode(), headers) urllib.request.urlopen(req) def check_and_send(self): self.now=GPIO.input(self.gpio) if self.before==False and self.now ==True: self._send() self.before=self.now if __name__ == '__main__': GPIO.setmode(GPIO.BCM) buttons=[] for key in BUTTON_MESSAGE: button=Button(key,LINE_ACCESS_TOKEN,LINE_USER_ID,BUTTON_MESSAGE[key]) buttons.append(button) try: while True: for button in buttons: button.check_and_send() time.sleep(0.05) except KeyboardInterrupt: GPIO.cleanup()
LINEのPUSH API(メッセージを送るAPI)は、「アクセストークン」「宛先のUser ID」「メッセージの内容」をPOSTリクエストとしてhttps://api.line.me/v2/bot/message/push
に送ると実行されます。このうち、「アクセストークン」「宛先のUser ID」についてはコード中に書くのではなく、環境変数として定義したものを参照するようにしています。
次節以降で各環境変数の設定の方法を説明します。
3. アクセストークンの設定
アクセストークンとは、作成したアカウントのAPIを利用するための合言葉のようなもので、アカウントごとに固有の文字列が付与されます。このアクセストークンを添えてAPIを叩く(例のURLにPOSTリクエストを投げる)と、今回作成したアカウントに任意のメッセージを送らせることができます。
LINE APIにおいて、アクセストークンは「チャネル基本設定」の「アクセストークン(ロングターム)」の「再発行」ボタンを押すと取得することができます。
取得したアクセストークンをLINE_ACCESS_TOKEN
という名前で環境変数として保存します。
たとえば、取得したアクセストークンがXXXXYYYYZZZZ
という文字列だった場合、以下のようなコマンドで設定できます。(以下のコマンドで設定した環境変数は、ターミナルを閉じると無効になります)
$ echo LINE_ACCESS_TOKEN=XXXXYYYYZZZZ
ちなみに、LINE APIに限った話ではないのですが、アクセストークンは他人の目の触れない場所で管理する必要があります。たとえば、もしアクセストークンをコードの中に書き込んでGithubの公開リポジトリなどにうっかりプッシュしてしまった場合、悪意あるプログラマがAPI経由でアカウントを操作できてしまいます。コード中に直接書き込んでも動くことは動きますが、セキュリティ的にはタブー行為なので、今回のように環境変数として保持するようにします。
4. 宛先のUser IDの設定
ボタンを押した際にメッセージを送る宛先として、自分の個人アカウントのUser IDを使用します。
「チャネル基本設定」の「その他」の「Your User ID」に載っている文字列が、自分の個人アカウントのUser IDです。(アカウント検索などに使うIDとは別物です)
User IDはLINE_USER_ID
という名前で環境変数として保存します。
たとえば、自分のUser IDがUUURRRSSS
という文字列だった場合、以下のようなコマンドで設定できます。(以下のコマンドで設定した環境変数は、ターミナルを閉じると無効になります)
$ echo LINE_USER_ID=UUURRRSSS
5. プログラムの実行
ここまでで、ボット用アカウントが自分の個人アカウント宛にメッセージを送信する処理が完成しました。
以下のコマンドを実行し、プログラムを起動します。
$ python3 line.py
ボタンを押すと、以下のようにボット用アカウントから自分宛にメッセージが送信されるはずです。
送信されない場合、ボット用アカウントを友達登録していない可能性があるので、すでに説明したとおり、QRコードから友達登録してください。
次回予告
次回は、ボット宛に送信されたLINEメッセージを自分のサーバで受け取り、任意の画面表示を(半ば強引に)実現する方法を紹介します。
また、自分宛ではなく特定のグループ宛にメッセージを投稿するように変更を加える方法もあわせて説明します。