はじめに
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
Quickstart — Flask Documentation (0.12.x)
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.
訳: –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を貼り付けます。
作成したチャンネルにメッセージを送信して、メッセージがオウム返しされれば成功です。
以上です。お疲れさまでした。
コメント