【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

LINE botの作成 〜作成・デプロイ・起動まで〜

はじめに

LINE botを作りたくなったので練習がてら、オウム返しのLINE botに挑戦。

その時のメモ、日記。

環境

  • Ubuntu 18.04.3 LTS
  • Python 3.6.8
  • Flask==1.1.1
  • line-bot-sdk==1.15.0
  • Heroku

必要なパッケージのインストール

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

目標

出来上がりはこのようになります。

LINEのQRコードリーダーで以下のQRコードを読み込んでください。 なにかコメントするとオウム返ししてくれます。

f:id:AIProgrammer:20200419010113p:plain

登録

LINE Developers

LINE botのアカウントを作成するため、LINE Developersに登録する。

1.今すぐ始めようをクリック。

f:id:AIProgrammer:20200419010133p:plain

2.ログイン

ログインをする。既に持っているIDでも問題ない。 他の人に自分のLINEが知られることはない。あくまでもLINE botと利用するためのログイン。 f:id:AIProgrammer:20200419010150p:plain

3.LINE botアカウント作成

ログインするとこのような画面になる。 f:id:AIProgrammer:20200419010158p:plain

3-1.チャネルの種類はbotなので「Messagin API」を選択

f:id:AIProgrammer:20200419010206p:plain

3-2.botの提供元であるプロバイダ名を設定

なんでもOK. f:id:AIProgrammer:20200419010214p:plain

3.3.その他の設定

下の項目を設定して「作成」ボタンをクリック。

  • チャネルアイコン
  • チャネル名
  • チャネル説明
  • 大業種
  • 小業種
  • メールアドレス

f:id:AIProgrammer:20200419010223p:plain

4.チャネルシークレットとチャネルアクセストークンの取得

4.1. 「チャネル基本設定」タブを選択

f:id:AIProgrammer:20200419010232p:plain

4.2.「チャネルシークレット」欄から「発行」ボタンを押し、IDを取得。後ほど[YOUR_CHANNEL_SECRET]として利用。

f:id:AIProgrammer:20200419010242p:plain

4.3. 次に、「Messaging API設定」タブを選択

f:id:AIProgrammer:20200419010252p:plain

4.4. 「チャネルアクセストークン」欄から「発行」ボタンを押し、IDを取得。後ほど[YOUR_CHANNEL_ACCESS_TOKEN]として利用。

f:id:AIProgrammer:20200419010259p:plain

Heroku

1. アカウント登録

こちらのリンクからHerokuのアカウント登録をする。 f:id:AIProgrammer:20200419010307p:plain

2. Set up

Heroku CLIのSet upをする。 端末で以下のコマンドを打ち込む。 参考はこちら

$ sudo snap install heroku --classic

ログインをする。以下のコマンドを実行するとブラウザが立ち上がるのでそこでHerokuにログイン。以下のような感じのメッセージがでれば成功。

$ heroku login
heroku: Press any key to open up the browser to login or q to exit
 ›   Warning: If browser does not open, visit
 ›   https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com

実装

オウムがえしのコード作成

line-bot-sdk-pythonにあるコードを使用します。 ["YOUR_CHANNEL_ACCESS_TOKEN"]と["YOUR_CHANNEL_SECRET"]はここでは自分のものに置き換えず、そのままで大丈夫です。

main.py

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__)

# 環境変数取得
# not should be chnged chracters.
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へのデプロイ

必要なファイルの準備

Herokuで必要となるファイルは以下の3つです。

  • Procfile (Herokuで実行するコマンド)
  • requirements.txt (main.pyを動かす上で必要なパッケージ)
  • runtime.txt (使用する言語とバージョン)

Procfile

web: python3 main.py

requirements.txt

Flask==1.1.1                
line-bot-sdk==1.15.0

runtime.txt

python-3.6.8

ログイン

端末からHerokuへ、ログインしてください。

$ heroku login
heroku: Press any key to open up the browser to login or q to exit
 ›   Warning: If browser does not open, visit
 ›   https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com

アプリの作成

Herokuにアプリを作成します。

$ heroku create <app_name>
Creating ⬢ <app_name>... done
https://<app_name>.herokuapp.com/ | https://git.heroku.com/<app_name>

環境変数の設定

「4.チャネルシークレットとチャネルアクセストークンの取得」で取得したチャネルアクセストークン[YOUR_CHANNEL_ACCESS_TOKEN]とチャネルシークレット[YOUR_CHANNEL_SECRET]をHerokuの環境変数として設定する。

# LINE botのチャネルアクセストークンを使用
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="<Access Token>" --app <app_name>

# LINE botのチャネルシークレットを使用
$ heroku config:set YOUR_CHANNEL_SECRET="<Channel Secret>" --app <app_name>

Webhookの設定

「3.LINE botアカウント作成」で作成したアカウントページに戻って、Messagin API設定タブをクリック。 f:id:AIProgrammer:20200419010354p:plain

Webhook設定欄のWebhookの利用をオンにする。

f:id:AIProgrammer:20200419010416p:plain

さらに、WebhookURLに以下を記載。

Webhook URL:https://<app_name>.herokuapp.com/callback

デプロイの実行

Pythonプログラム(main.py)と設定ファイルデプロイします。

# 初期化(initialize)
$ git init

# commitするファイルを追加
$ git add .

# commit
$ git commit -m "new commit"

# deploy
$ git push heroku master

LINE botでの実行結果

いい感じに返してくれました。

f:id:AIProgrammer:20200419010457p:plain

[番外編]つまづいたところ

git commitで「Please tell me who you are.」

git commitでお前誰だと怒られる。 gitの初期設定ができていないようです。

$ git commit -m "new commit"
*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '○@○Air2.(none)')

メールアドレスとアカウント名を設定してあげるとエラーが無くなる。 私の場合は、Githubで作成したメールアドレスとアカウント名を使用しました。

$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"

設定した、メールアドレスとアカウント名等はこのコマンドから確認できます。

$ git config --list

push時にdoes not appear to be a git repository

デプロイするさいに、repositoryがないと怒られました。 gitがリモートのリポジトリを探せていないようです。

$ git push heroku master

fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

リモートリポジトリ先を確認すると、<app_name>ところが"heroku create <app_name>"で作成したものと異なっていた。

$ git remote -v
heroku  https://git.heroku.com/<app_name>.git (fetch)
heroku  https://git.heroku.com/<app_name>.git (push)

リモートリポジトリ先の変更は以下のコマンドでできる。

$ git remote set-url heroku {ここに変更するURLを貼り付け}
# ex.) git remote set-url heroku https://git.heroku.com/<app_name>.git

仮に、"git remote -v"でなにも出力されない場合。 "git remote add"してやる。

$ git remote add heroku https://git.heroku.com/<app_name>.git

「メッセージありがとうございます...」という自動返信がついてくる。

オウムがえしと共に自動返信のメッセージがついてくる。 こちらは、LINE botアカウントの「Massaging API設定」タブから応答メッセージの編集から変更できる。

f:id:AIProgrammer:20200419010521p:plain

「Massaging API設定」タブから応答メッセージの編集を押す。 f:id:AIProgrammer:20200419010536p:plain

詳細設定から応答メッセージの応答メッセージ設定を選択。 f:id:AIProgrammer:20200419010547p:plain

不要な応答メッセージのステータスをオフにする。 f:id:AIProgrammer:20200419010555p:plain

main.pyを編集したときの更新

オウムがえしのコードを書き換えてmain.pyを更新した場合。デプロイし直す必要がある。 1.main.pyの更新。

$ git status
ブランチ master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   main.py

no changes added to commit (use "git add" and/or "git commit -a")

2.git addする。

$ git add .

3.git commitする。

# -aでGit 管理下のファイルをすべてをコミットする
$ git commit -am "modified main.py"
[master d3cfd15] modified main.py and git add.
 1 file changed, 1 insertion(+)

4.デプロイする

$ git push heroku master

まとめ

LINE botを作成するために、種々の登録から、ファイルの作成、Herokuでデプロイをした。 将来的には、株価予測AIが判定した結果を定期的にLINEで通知するシステムを構築したい。



頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓