#はじめに
Seleniumを使ってみたの続き(?)にあたります。
ゆくゆくは活用したいと思いますが今のところはオウム返しするだけです。
初めて触ったので間違いがあればご指摘いただけると幸いです。
#環境
- OS X 10.11.1
- Python 3.6.3
- Heroku
#Line developers 登録&設定
まずはLine developersに登録していきます。
リンク先の今すぐはじめようをクリック
プロバイダ名(Botの提供元になる名前)を登録します。
確認→作成で作成できます。
今回はbot作成なのでMessaging APIを選択します。
アプリ名 任意のアプリ名
アプリ説明 任意のアプリ説明
プラン Developer Trial
大業種 個人
小業種 個人(その他)
メールアドレス 自分のメールアドレス
もう少し!基本設定からアクセストークンの再発行を実施します。
このアクセストークンは後ほど使います。
#実装
まず、flaskとline-bot-sdkをインストールします。
$ pip3 install flask
$ pip3 install line-bot-sdk
いよいよPythonで実装していきます!
ここにBotのサンプルがあるのでコピペしてちょこっといじります。
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
import os
app = Flask(__name__)
#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
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:
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()
port = int(os.getenv("PORT", 5000))
app.run(host="0.0.0.0", port=port)
#Herokuの設定
アカウント登録は済んでいる前提で進めます。
Pythonをクリック。
Download the Heroku CLI for MacOSをクリックしてダウンロード。
ダウンロードしたファイルをダブルクリックしてインストールを進めます。
無事にコマンドラインを使えるようになりましたのでここからはコマンドラインを使います。
まずはherokuにログインします。メールアドレスとパスワードを入力。
$ heroku login
Enter your Heroku credentials:
Email: XXX@XXX
Password: ***
アプリケーションを登録します。コマンドラインからcreateで作れます。
https://<アプリケーション名>.herokuapp.comをWebhookで使います。
$ heroku create <アプリケーション名>
環境変数の設定をします。
Channel Secretとアクセストークンを設定しておきます。
$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの欄の文字列" --app <アプリケーション名>
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの欄の文字列" --app <アプリケーション名>
#設定ファイルの作成、デプロイ
下記のように設定ファイルを作成します。
python-3.6.3
Flask==0.12.2
line-bot-sdk==1.5.0
web: python main.py
Pythonのプログラムと設定ファイルデプロイします。
$ git init
$ git add .
$ git commit -m "new commit"
$ git push heroku master
無事にpushできたらもう少し!
できないときは設定ファイルを見直すと上手くいくかも。
自分の場合はrequirements.txtにanaconda等が含まれていてエラーになりました。
#Webhookの設定
https://developers.line.me/console/ に戻り、Webhookの設定をします。
Webhook送信:利用する
Webhook URL:https://<アプリケーション名>.herokuapp.com/callback
#実験
チャンネル基本設定の画面からLineアプリへのQRコードを読み込み友達登録します。
→適当にメッセージを送ってオウム返しされたらOK!
ちゃんと返ってきたら完成です。
駄目ならログを見て頑張りましょう。(何回もやりました)
$ heroku logs --tail -a <アプリケーション名>
#詰まったところ
https://github.com/line/line-bot-sdk-python から取ってきたサンプルそのままで動かそうとしたところエラーが発生しました。どうやらHerokuは動的にポート番号を生成するとのこと…
その結果ポートを割り当てられずタイムアウトが発生していた模様。(間違ってたらごめんなさい)
$ heroku logs --tail -a <アプリケーション名>
中略
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
それがこの部分になります。
port = int(os.getenv("PORT", "5000"))
app.run(host="0.0.0.0", port=port)
#参考リンク
下記の記事を参考にさせていただきました。ありがとうございます。
LINE Messaging API + Python + Heroku でLINE Botを作る
LINE BOT をとりあえずタダで Heroku で動かす
0.4.0 to 0.4.1 Introduced WebServer Issue #491
Node.jsのアプリをHerokuにデプロイするときポート番号に気をつけなくちゃいけない