Python + FlaskによるLINE BOTの開発(Heroku使用)
備忘録的に書いていきます。
今日は「LINE BOT」を作ります!
なんでPythonかというとPHPで作ったことはあったのです。
今後LINE BOTに機械学習的な要素を入れたいなぁと思ったので
Pythonを選びました。今絶賛勉強中の言語のため、基本的な書き方すらわかってない
状態ですが、興味がある人は見ていってください。
今回の構成は以下です。
言語:Python 3.5.1
フレームワーク:Flask
サーバ:Heroku(アドオン:Fixie)
PythonのフレームワークはFlaskを使いました。
Flaskは軽量なフレームワークらしく、非常に簡単にWebアプリが作れるという特徴があると
耳にしたので、使ってみよう!と思いました。一番有名で世界中に使われているDjangoという
フレームワークもありますが、ちょっと学習コスト高そうだったので今回はやめました。
サーバーにはHerokuを使用しています。IBM Bluemixでしたっけ?これも使いたいなぁと
思いましたが、いつでも移行できるだろ!と思ったのでいつも使ってるHerokuにしました。
ただFixieが無料の分だと月に500リクエストしかないためその後は既読無視になるそうですw
まずBotの「Hello World」的なオウム返しBotを作成しました。
アカウント作って・・なんやかんやって部分はネットで調べたらわかると思うので割愛させていただきます。
プログラムは以下です。
隠したい設定ファイルは別途「config.ini」ファイルを作ってそこから呼び出すようにしています。
config.ini
[settings] X-Line-ChannelID:XXXXXXXXX X-Line-ChannelSecret:XXXXXXXX X-Line-Trusted-User-With-ACL:MID proxy:http://XXXXXXXXXXX
botapp.py
from flask import Flask,request import requests import json import configparser inifile = configparser.SafeConfigParser() inifile.read("./config.ini") LINEBOT_API_EVENT ='https://trialbot-api.line.me/v1/events' LINE_HEADERS = { 'Content-type': 'application/json; charset=UTF-8', 'X-Line-ChannelID':inifile.get("settings","X-Line-ChannelID"), 'X-Line-ChannelSecret':inifile.get("settings","X-Line-ChannelSecret"), 'X-Line-Trusted-User-With-ACL':inifile.get("settings","X-Line-Trusted-User-With-ACL") } def post_event(to, content): msg = { 'to': [to], 'toChannel': 1383378250, 'eventType': "138311608800106203", 'content': content } proxy = {'https':inifile.get("settings","proxy")} r = requests.post(LINEBOT_API_EVENT, headers = LINE_HEADERS, data = json.dumps(msg), proxies=proxy) def post_text(to, text): content = { 'contentType':1, 'toType':1, 'text':text, } post_event(to, content) app = Flask(__name__) @app.route("/callback", methods=['POST']) def callback(): messages = request.json['result'] for message in messages: text = message['content']['text'] response = text post_text(message['content']['from'], response) return '' if __name__ == "__main__": app.run(host = '0.0.0.0', port = 443, threaded = True, debug = True)