こちらの記事を見て作りたいLinebotが思い浮かんだので、pythonでLinebotを作ろうと決めました
まずはLine developersに記載されているサンプルコードを元に、おうむ返しをするLinebotを作っていきます
コピペでいける!
って書いてあったのですが、結構沼にハマったので、そこもあわせて解説していきたいと思います
この記事でわかること
- Linebotの作り方
- Herokuの使い方
筆者について
2021年から本格的にpython学習を始め、今ではpythonによる収益5桁
主にデータ解析やデスクトップアプリ、業務効率化・自動化などを中心に作成中
また大学院時代には、R言語とpythonを使って統計処理を行っていたため、pythonを使ったデータ分析の知識が豊富
Contents
pythonでLinebotを作成する

pythonでLinebotを作成するのに必要なのは、Flaskです
今回初めてFlaskに触れましたが、Djangoに比べて簡潔なので理解しやすいです
あとはLine developersに登録して、Messaging APIを取得、HerokuにデプロイすればOKです
Line developersの登録
まずはLine developersに登録していきます
まずはTOPページのMessaging APIをクリック

今すぐはじめようをクリックして、Lineにログインします

アドレス打つのはめんどくさいので、QRコードでログイン




認証を突破すると、以下のような画面に移ります


赤枠内は基本的に入力していきます
- チャネル名
- チャネル説明
- 大業種
- 小業種
- メールアドレス
- プライバシーポリシーURL(任意)
- サービス利用規約URL(任意)
任意以外を全て入力したら、2つあるチェックボックスにチェックを入れて、作成

OKをクリックでチャネルが作成されます

Messaging API設定で応答メッセージと挨拶メッセージをオフにして、Webhook設定をオンにします


その下にあるWebhookの利用もクリックしておくと、botを使用することができます

チャネルの基本設定などが行うことができますが、ひとまずAPI登録はこれで終了です
Flaskの準備
pythonのコードを書いていく前に、Flaskとline bot sdkをインストールします
pip install flask
pip install line-bot-sdk
#condaやhomebrewを使っている場合には、それに応じて
これでLinebotのコードを書く準備ができました
pythonコードと設定ファイルの準備
まずはソースコード
ソースコードは変える部分がないので、このままコピペでOKです
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__)
ACCESS_TOKEN = os.environ["ACCESS_TOKEN"]
CHANNEL_SECRET = os.environ["CHANNEL_SECRET"]
line_bot_api = LineBotApi(ACCESS_TOKEN)
handler = WebhookHandler(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:
print("Invalid signature. Please check your channel access token/channel secret.")
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__":
port = int(os.getenv("PORT", 5000))
app.run(host="0.0.0.0", port=port, debug=True)
ACCESS_TOKEN = os.environ[“ACCESS_TOKEN”]
CHANNEL_SECRET = os.environ[“CHANNEL_SECRET”]
line_bot_api = LineBotApi(ACCESS_TOKEN)
handler = WebhookHandler(CHANNEL_SECRET)
僕がハマったのはここで、上二つだけだとエラーになりますので、両方とも記載します
サンプルコードには記載しているので、コピペで大丈夫です
次に設定ファイルです
今回必要な設定ファイルは3つ
- runtime.txt : 使用するPythonのバージョンを記入
- requirements.txt : インストールするライブラリを記入
- Procfile : プログラムの実行方法を記入
Procfileは.txtの拡張子は入りません
ここもエラーになりやすい部分なので、気をつけましょう
runtime.txtは使用するpythonのバージョンを指定します
python-3.10.5
requirements.txtでは使用するライブラリを入力していきます
コマンド入力でもいけますが、余計なものもたくさん入るので、手打ちでいいと思います
僕はコマンドで作ったら、以下のようにいらないものたくさんになりました
この状態でも問題なくLinebotを作ることはできます
aiohttp==3.8.1
aiosignal==1.2.0
async-timeout==4.0.2
attrs==22.1.0
certifi==2022.6.15
charset-normalizer==2.1.0
click==8.1.3
Flask==2.2.2
frozenlist==1.3.0
future==0.18.2
gunicorn==20.1.0
heroku==0.1.4
idna==3.3
importlib-metadata==4.11.4
itsdangerous==2.1.2
Jinja2==3.1.2
line-bot-sdk==2.3.0
MarkupSafe==2.1.1
multidict==6.0.2
python-dateutil==1.5
requests==2.28.1
urllib3==1.26.11
Werkzeug==2.2.2
yarl==1.8.1
zipp==3.8.1
最後にProcfileです
Procfileは以下のように入力します
web: python main.py
これでpythonのコードと設定ファイルの準備が終わりました
設定ファイルなどは以下のように保存をしておきます
LineBot
├── Procfile
├── main.py
├── runtime.txt
└── requirements.txt
あとはHerokuに登録して、デプロイしていくだけです
Herokuの登録
続いてHerokuに登録して、デプロイしていきます
まずはHerokuに登録しましょう
登録方法はここで詳細に解説しているので、そちらを参考にしてください
herokuの登録ができたら、新しいアプリを作っていきます
HerokuのダッシュボードからNewをクリックし、Create new appをクリック

App nameを決めます

App nameはなんでも大丈夫ですが、他の人が使っているとエラーになります
問題なくApp nameを入力できたら、それ以外はいじらずに、Create appをクリックします
これで新しいアプリが完成したので、Herokuのダッシュボードに戻って、今作ったApp nemeをクリックしましょう
新しいアプリの設定画面に移ります

ここで、Settingと書いてある部分をクリックします
ビルドパックというものをpythonにする必要があるので、Add buildpackをクリックし、pythonを選択します

これでOK
環境変数の設定
Linebotを使うには、Channel SecretとアクセストークンをHerokuに登録する必要があります
ターミナルで、
heroku config:set ACCESS_TOKEN="アクセストークンの欄の文字列" --app アプリケーション名
heroku config:set CHANNEL_SECRET="Channel Secretの欄の文字列" --app アプリケーション名
を入力します
入力後はHerokuのsettingからも編集することができます

アクセストークンとChannel Secretはこちら


ターミナルでの操作
あとはpythonのコードをHerokuのデプロイしていくだけです
まずはターミナルでLinebotのディレクトリに移動します
移動するには以下のようにcdを使用します
cd Linebotを保存しているディレクトリのパス名
次にHerokuのログイン
heroku login
何かしらのキーを押せと求められるので、Enterキーを一度押せば、ログインできます
あとはデプロイしていくだけです
git init
git remote add heroku https://git.heroku.com/herokuに登録したapp neme.git
git add .
git commit -am "make it better"
git push heroku master
これでOKです
2行目のURLはHerokuのsettingからも確認することができます

デプロイが終わったらLine developersに戻り、Messaging API設定にあるQRコードを読み込み、友達追加します
その後、Webhookが機能しているかを確認するために、Webhookの検証をクリック

以下のように成功と出ればOKです

Linebotにテキストメッセージを送れば、おうむ返ししてくれます
ご覧の通り、何度もtry & errorの末、ようやくおうむ返ししてくれました


エラーが出た時の対処方法

僕は全然すんなりいかなかったのですが、ようやく完成したコードを掲載しているので、多分スムーズにいくと思います
ただ、エラーが出たら困るので、そこの対処方法について記載していきます
コードや設定ファイルのミス
ありがちなのが、コードや設定ファイルを作るときに余計な文字が無意識に入ってしまうこと
僕はProcfile作るときに
web: python main.py
にするべき部分を
web: python mainm.py
としており、沼にハマりました
エラーが出た場合には、コードや設定ファイルを読み返すのがいいです
よくわからないエラー
よくわからないからエラーになるんですけど、コードや設定ファイルは問題なかった場合はターミナルで、
heroku logs --tail -a App name(Herokuの登録したやつ)
と入力して、リアルタイムでログを見ることができます
ログをさかのぼって読んでいき、ERRORと書かれている部分を見つけます
見つけたらあとはそこを修正すればOKです
pythonの技術を高める
pythonの技術を高めることで、さまざまなものを作ることができ、エンジニアとしての道も拓けていきます
独学で学べないこともないですが、やはり学び始めはプログラミンスクールで体系的にしっかりと学んだほうがいいと思います
収益化までの時間短縮やわからないことを気軽に質問することができる環境など、費用はかかりますが、それ以上の恩恵を受けることができます
こちらの記事ではおすすめのpythonが学べるプログラミングスクールを紹介しています
いずれも無料体験などができるので、一度体験してみるのがいいです
