【押ボタンでLINE送信】高齢者向けの押ボタン式LINE投稿装置を作った(②LINEメッセージ送信編)

f:id:yoshy_toshy:20190929174252p:plain

前回は電子回路を組む部分を紹介したので、今回はLINEメッセージ送信編です。

前回の記事はこちら。 yoshy-toshy.hateblo.jp

作り方

すでに前回の目標(ボタンを押すとコンソール上にメッセージが表示される状態)が完成した前提で説明します。

本記事での目標

ボタンを押すと、LINEメッセージが送信されるところまでを作ります。

f:id:yoshy_toshy:20190929160709g:plain

自分の個人アカウント(あなたが普段プライベートで使っているアカウント)でLINEメッセージを送信するわけではなく、ボット用のアカウントを作り、そのボットにメッセージを送信させる仕組みです。

おおまかな流れ

下記の流れで作成します。

  1. ボット用アカウントの作成
  2. プログラムの修正
  3. アクセストークンの設定
  4. 宛先のUser IDの設定
  5. プログラムの実行
1. ボット用アカウントの作成

まず、公式ドキュメント(以下URL)に載っている手順で、チャネルを作成します。 作成したチャネル名はそのままボットの名前になります。

https://developers.line.biz/ja/docs/messaging-api/getting-started/

作成が終わると以下のようになります。

f:id:yoshy_toshy:20190929032952p:plain

作成したチャネルをクリックして下の方にスクロールすると、友達追加用のQRコードが表示されているので、自分のスマートフォンで読み取って友達になっておきます。

f:id:yoshy_toshy:20190929022534p:plain

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において、アクセストークンは「チャネル基本設定」の「アクセストークン(ロングターム)」の「再発行」ボタンを押すと取得することができます。

f:id:yoshy_toshy:20190929031834p:plain

取得したアクセストークンを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

ボタンを押すと、以下のようにボット用アカウントから自分宛にメッセージが送信されるはずです。

f:id:yoshy_toshy:20190929171503p:plain

送信されない場合、ボット用アカウントを友達登録していない可能性があるので、すでに説明したとおり、QRコードから友達登録してください。

次回予告

次回は、ボット宛に送信されたLINEメッセージを自分のサーバで受け取り、任意の画面表示を(半ば強引に)実現する方法を紹介します。

f:id:yoshy_toshy:20190919045039p:plain

また、自分宛ではなく特定のグループ宛にメッセージを投稿するように変更を加える方法もあわせて説明します。