10
4

PythonでLINEチャットボットを作る

Last updated at Posted at 2024-10-02

過去に作った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)
10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4