ボンジニアの備忘録

凡人エンジニア、通称ボンジニアによる備忘録です。勉強した内容を書いていきます。ジャンル問わずです!間違っていたら指摘をお願いします!

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)