過去に作ったLINEチャットボットを今風にリメイクしたものを投稿します。
環境:
ローカル、Linux(Ubuntu)、python3.12.6
1.LINE Developersアカウントの作成:
https://developers.line.biz/ja/ にアクセスしてアカウントを作成する。
(今回はビジネスアカウントを作成)
2.プロバイダーの作成
コンソールにログインし、「新規プロバイダー作成」を選択。
3.チャットボット(LINEチャネル)の作成
チャネル設定から MessageAPI を選択して各種設定する
※執筆時点でLINE公式アカウントの作成が必要になっているため、画面の指示に従う。
4.Message API設定
LINE公式アカウントを作成して、MessageAPIを有効にする。詳しくは以下を参照。
https://developers.line.biz/ja/docs/messaging-api/getting-started/
有効にしたら、URLとアクセストークンを取得する。
また、Webhookを使うのでそちらも有効にする。
5.Pythonプロジェクトのセットアップ
必要なライブラリをインストールする。LINEのSDK(line-bot-sdk)を使用する。
pip install line-bot-sdk
6.Pythonコードの記述
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
app = Flask(__name__)
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')
@app.route("/callback", methods=['POST'])
def callback():
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
app.logger.info("Request body: " + 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()
7.Webhook URLの設定とボットのテスト
Flaskを実行する。ローカル実行ではngrokを使うと良いと思う。
公開URLを取得してLINE Developer コンソールでWebhook URLとして設定する。
※ngrokについては今回は割愛
LINEアプリで友だち追加したチャットボットにメッセージを送信して動作確認を行う。
以上で基本的なLINEチャットボットの作成は完了。
カスタマイズしたい場合、例えば以下の機能があるが詳細はドキュメントを参照願いたい。
リッチメニュー、プッシュメッセージの送信、データベースの導入など…
実務的には、AWSの場合、APIGateway、Lambda、S3を使うのが現実出来ではあると思うので、Lambdaのコードを以下に追記しておく。
import json
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')
def lambda_handler(event, context):
# eventオブジェクトからリクエストされた本文と署名を取得
body = event['body'] # リクエストの本文
signature = event['headers']['x-line-signature'] # LINEからの署名
# Webhookからのイベントを処理
try:
handler.handle(body, signature)
except InvalidSignatureError:
return {
'statusCode': 403,
'body': json.dumps('Invalid signature. Please check your channel access token/channel secret.')
}
return {
'statusCode': 200,
'body': json.dumps('OK')
}
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text)