raspberryPi + Flask + ngrokでLINE botを作成してみる

RaspberryPi

はじめに

RaspberryPi + Flask + ngrokでLINEbotを作成していきます。

事前準備

  • LINEチャンネルの作成
  • raspberryPiOSのインストール
  • ngrokの導入

わからなければ各自ググってください。
raspberryPiOSのインストールと、ngrokの導入に関してはこのブログの記事にしてあります。
参照してください。

必要なライブラリをRaspberryPiにインストールする

Pythonのパッケージ管理ツール「pip」を使用して、必要なライブラリをインストールしていきます。Flaskおよびline-bot-sdkをインストールしてきます。

Flaskとは?

Flask(フラスク)は、プログラミング言語Python用の、軽量なウェブアプリケーションフレームワークである。

Flask - Wikipedia

超小規模なWebアプリケーションを作成する際に使用されるFWです。
Pythonが動く環境であれば動くと思います。知らんけど。

詳細はFlask公式ドキュメントをご確認ください。

line-bot-sdk-pythonとは

その名の通り、line-botをpythonで開発するためのSDKです。

詳細はline-bot-sdk-pythonのGitHubを確認してください。

Documentがしっかり作られているので、読めば大概のことはわかります。
俺もこういうしっかりとした開発がしたいぜ…

pipのインストール

まずはpipの確認。
RASPBERRY PI OSにはデフォルトでpythonとpipがインストールされているはずです。

下記のコマンドでpipがインストールされているかどうか確認できます。

$ python -v
$ pip -V

上記コマンドで確認できなかった場合、パッケージマネージャを使用してインストールをしてください。

$ sudo apt-get install python
$ sudo apt-get install python-pip

pipを使用して必要なライブラリをインストールする

下記コマンドを実行して、pythonにライブラリをインストールします。

# flask
$ pip install flask
# line-bot-sdk
$ pip install line-bot-sdk

プログラムを作成する

LINE-botで使用するプログラムをFlaskで作成していきます。

まずはディレクトリと実行ファイルを作成します。

$ mkdir line-bot
$ vi line-bot/app.py

line-bot-sdk-pythonの公式ドキュメントのサンプルプログラムをコピペします。
リンクを開くのすらだるい人は下記のコードを使ってください。

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_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:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))


if __name__ == "__main__":
    app.run()

※YOUR_CHANNEL_ACCESS_TOKENとYOUR_CHANNEL_SECRETは各環境に合わせてください。

作成したプログラムを常時実行する

nohupを使用して作成したプログラムを常時実行します。

# flask runコマンドで起動するスクリプトを設定する
$ export FLASK_APP=/home/pi/line-bot/app.py
# nohupで起動、標準出力、エラー出力は闇の彼方に…
$ nohup flask --host=0.0.0.0 --port=5000 >/dev/null 2>/dev/null &

--host=0.0.0.0について

host=0.0.0.0を指定しないと、外部からアクセスができません。

Externally Visible Server
If you run the server you will notice that the server is only accessible from your own computer, not from any other in the network. This is the default because in debugging mode a user of the application can execute arbitrary Python code on your computer.

If you have the debugger disabled or trust the users on your network, you can make the server publicly available simply by adding --host=0.0.0.0 to the command line:

flask run --host=0.0.0.0
This tells your operating system to listen on all public IPs.

Quickstart — Flask Documentation (0.12.x)

訳: --host=0.0.0.0を追加するとlocalhost以外の端末からアクセスできるようになるよ。

ngrokで世界に公開する

ngrokでローカルの5000ポートを全世界に公開します。

$ ngrok http 5000
ngrok by @inconshreveable                                                                                                                     (Ctrl+C to quit)
                                                                                                                                                              
Session Status                online                                                                                                                          
Account                       nekonisi (Plan: Free)                                                                                                           
Version                       2.3.40                                                                                                                          
Region                        United States (us)                                                                                                              
Web Interface                 http://127.0.0.1:4040                                                                                                           
Forwarding                    http://****.ngrok.io -> http://localhost:5000                                                                    
Forwarding                    https://****.ngrok.io -> http://localhost:5000                                                                   
                                                                                                                                                              
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                                     
                              0       0       0.00    0.00    0.00    0.00          

これで世界中に公開されている…はず。

Fowardingに記載されているhttps://~をコピーします。

動作確認

LINE Developersのコンソールから、Webhook URLにコピーしたURLを貼り付けます。

Webhookの設定

作成したチャンネルにメッセージを送信して、メッセージがオウム返しされれば成功です。

メッセージ

以上です。お疲れさまでした。

コメント

タイトルとURLをコピーしました