Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
101
Help us understand the problem. What is going on with this article?
@shimajiri

Python + HerokuでLINE BOTを作ってみた

勉強のためにオウム返しbotを作ってみました。

まずはLine developersに登録する。

アプリ名 →任意のアプリ名
アプリ説明 →説明文
プラン →Developer Trial
大業種 →個人
小業種 →個人(その他)
メールアドレス →自分のメールアドレス

利用規約に同意して作成。

チャネル基本設定->メッセージ送受信設定のアクセストークンの再発行ボタンを押下。

Bot情報のLINEアプリへのQRコードで友達登録しておく。

Flaskとline-bot-sdkをインストール

$ pip3 install flask
$ pip3 install line-bot-sdk

https://github.com/line/line-bot-sdk-python
にオウム返ししてくれるBotのサンプルがあるのですが、
これをそのまま使うと上手く行かないので、
こちらのサイト様からmain.pyを参考にさせて頂きました。

main.py

from flask import Flask, request, abort
import os

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

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("/")
def hello_world():
    return "hello world!"

@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"))
    app.run(host="0.0.0.0", port=port)

Heroku(ヘロク)に登録する。

HerokuはPaas(パース)とよばれる、アプリケーションを実行するためのプラットフォームで、
アプリケーションを作成して簡単に動かすことが出来ます。

Herokuコマンドラインインタフェース(CLI)をインストールします。CLIを使用して、アプリケーションの管理と拡張、アドオンのプロビジョニング、アプリケーションログの表示、およびアプリケーションのローカルでの実行を行います。

プラットフォーム用のインストーラをダウンロードして実行します。

$ heroku login

heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/browser/XXXX
Logging in... done
Logged in as XXXX@XXXX

アプリケーションの登録


$ heroku create {自分のアプリケーション名}

Creating ● XXXX... done
https://XXXX.herokuapp.com/ | https://git.heroku.com/XXXX.git

環境変数の設定

$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの文字列" --app {自分のアプリケーション名}
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの文字列" --app {自分のアプリケーション名}

設定の確認

$ heroku config --app {自分のアプリケーション名}

Webhookの設定

管理画面からWebhookの設定をします。

Webhook送信:利用する

Webhook URL:https://<自分のアプリケーション名>.herokuapp.com/callback

接続確認が表示されれば完了です。

設定ファイルの作成とデプロイ

設定ファイルに記載するためにPythonとFlaskのバージョンを調べておきます。

$ flask --version

同じディレクトリに作成
main.py →ソースコード
runtime.txt →Pythonのバージョンを記載
requirements.txt →インストールするライブラリの記載
Procfile →プログラムの実行方法を定義

runtime.txt
python-3.7.0
requirements.txt
Flask==1.0.2
line-bot-sdk==1.8.0

Procfile
web: python main.py

変更した内容を反映する

$ git add .
$ git commit -am "make it better"
$ git push heroku master

上手くデプロイ出来たか確認する

$ heroku open

Hello Worldが表示されたら正常にデプロイされています。

ログ確認

heroku logs --tail

詰まったところ

Procfileを作成した際に他二つが.txtだったので、
間違えて.txtで作成してしまっていました。
拡張子の無いファイルを作成するときは、名前を付ける時にダブルクォートで囲んで保存します。

Webhook URLの設定で接続確認をしたところエラーが出ていました。

Webhookが無効なHTTPステータスコードを返しました(期待されるステータスコードは200です)

原因は分からなかったのですが、
オウム返しは上手く行っていました。

ちなみに...

ログの、

WARNING: Do not use the development server in a production environment.

この部分で注意されていますが、今回は試すだけなので無視して大丈夫です。
公開するときはちゃんとサーバーを立てろということですね。

参考

https://qiita.com/akiko-pusu/items/dec93cca4855e811ba6c
https://qiita.com/tomboyboy/items/122dfdb41188176e45b5
https://uepon.hatenadiary.com/entry/2018/07/27/002843

101
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
shimajiri
株式会社LbercScripts代表。 某情報通信企業でのIT営業を経てプログラマーを志し、現在はプログラマーと代表を兼任。 自身の勉強&趣味でQiitaに記事を書いている。Python,Java,JavaScript,C#,Perl,Ruby on Rails,PHP,C#,Scalaなど。最近はゲーム製作中。
lberc
ITで暮らしを豊かにするものを創造していく企業、エルバークグループです。ウェアラブルデバイスを制御するモバイルアプリやWebAPIの開発、サーバー構築、モバイルアプリの第三者検証業務を請け負っています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
101
Help us understand the problem. What is going on with this article?