LINE Messaging API + line-bot-sdk による Python でのチャットボット作成と,同等機能をもつ Web アプリケーションを同時に作成し,heroku へデプロイ,継続的インテグレーションで master への push で自動デプロイさせました。
コードの詳細等はそもそもゴー ☆ ジャスをつくるを LINE Bot と Web アプリ化したリポジトリがあるので,そちらを参照すること。
atsukoba/GorgeousApp
キミのハートに、レボ☆リューション!. Contribute to atsukoba/GorgeousApp development by creating an account on GitHub.
heroku の下準備
まず,テキスト処理系のモノを heroku にデプロイするならばMeCab
+mecab-python
等の形態素解析器を入れたい。ので,buildpack を複数入れられるheroku-buildpack-multi
を選択し,python と linuxbrew の buildpack を入れることで MeCab 等のbrew install
を可能にする
まず heroku cli。
brew tap heroku/brew && brew install heroku heroku create --buildpack https://github.com/heroku/heroku-buildpack-multi
.buildpack
へは以下を
https://github.com/heroku/heroku-buildpack-python.git
https://github.com/sunny4381/heroku-buildpack-linuxbrew.git
linuxbrew 用の.celler
に
mecab
mecab-ipadic
と書いておき,requirements.txt
も適切にかけば環境が整う。
以下を参照すると良い。(sklearn を動かすために buildpack-multi で conda を入れている)
heroku で python+django+scikit-learn+mecab(1)
LINE Developers / Messaging API の設定
各種アクセストークン等取得しておく。 以下が多分文字通りわかりやすい。
LINE BOT の作り方を世界一わかりやすく解説(1)【アカウント準備編】
flask で API を書く
LINE bot 用のテンプレート (app.py) があり,それを使う。そこでは/callback
へのPOST
に対して返答を行うので,それに加えて,最低限ルートへのGET
, POST
の処理を書いておく。(flask.render_template()
でテンプレート HTML を返すようにしておく)
ここで,テキスト処理用のモジュールを読んでおいて,POST
で入力されたテキストに対しての返答をJSON
で受け取り,jinja2
で扱えるようにrender_template
に渡してあげる。
linebot.LineBotAPI
とlinebot.WebhookHandler
のインスタンス化に必要なCHANNEL_ACCESS_TOKEN
とCHANNEL_SECRET
は環境変数に入れておき,os.environ.get
で取得する。heroku 上では管理画面から登録し,ローカルでのテストではテキトーに何か入れておく。
app.run(debug=True)
で API のテストをする。
Jinja2 を書く
テキスト処理なので,最低限入力ボックスと出力結果の UI はほしい。ので,HTML と CSS を書く。flask
の app と同階層にtemplate/
を作成し,そこに html を書いていく。
普通に
<form action="/" method="POST"> <input type="text" name="input" /> </form>
のように記入すればPOST
できるし,Jinja
内では,2 重ブラケット内で
<div id="data"> {{ data["key] }} </div>
render_template()
内に渡されたキーワード変数がそのまま辞書としてアクセスできる。
ただ,二重ブラケット内で素の Python が書けるわけではない(とくにループやデータのキャストとか)ので,以下等を参照すると良い。
python のためのテンプレートエンジン「Jinja2」便利な機能
templates/
と同階層にstatic/
を作成しておけば,そこに css や js を書いてフロントをすこしいじれる。私はここでsass/
内に sass を書き,css/style.css
へコンパイルすることで,
<link rel="stylesheet" href="/static/css/style.css" />
のようにいつもどおり head から読んで使っている。
heroku と GitHub の連携
heroku で動かすために,Procfile
を書く。
wsgi としてgunicorn
を用いるのが楽で,ポピュラーというか flask だと必須か。
process type はweb
に設定し,gunicorn を起動する。
web: gunicorn app.app:app --log-file=-
アプリケーションのインスタンスflask.Flask
を指定してあげる。
アプリケーションモジュール:アプリケーションインスタンス/関数
という指定方法。
Gunicorn - Python WSGI HTTP Server for UNIX
その後は GitHub 上にリモートレポジトリを作成し,heroku のダッシュボード上で認証・連携をする。この時に GUI でconfig vars
から LINE から発行されたアクセストークン等を登録できる。
あとは,普通に git push すれば,デプロイが走る。
デプロイ中のログに加え Python からlogging
やprint
で出力した内容もダッシュボードのログから確認できるため,そこで逐一チェックすればまあ動くものは作れるはず。