LINE の管理画面を使った LINE BOT の作り方 を説明しましたが、もっと高機能なものを作るには LINE が提供する Messaging API を使います。
LINE Messaging API の設定
LINE Developers のアカウント
LINE Messaging API を使うには LINE Developers のアカウントが必要です。
LINE Developers で「コンソールにログイン」を押してください。「LINEアカウントでログイン」に進めばふだん使っている LINE アカウントで入れます。
プロバイダーを作る
これから作るサービスの提供者を表す名前を登録します。緑色の「新規プロバイダー作成」ボタンを押して適切な名前を設定してください。過去に作ったプロバイダーがあれば、そのプロバイダー名をクリックして使うか、「作成」ボタンで作ることもできます。
チャネルを作る
チャネルとは、LINE の機能を利用するための通信路のようなものです。初期状態では下のような Messaging API のアイコンが表示されていますのでクリックします。
次に表示されるページで各項目を埋めていきます。任意項目は飛ばして構いません。
- チャネルの種類は “Messaging API” です。
- プロバイダーは使用するプロバイダー名を選択します。
- その他、必須項目を入力し、規約に同意したら「作成」ボタンを押します。
友達に追加する
チャネルの管理画面で「Messaging API設定」のタブを選択するとQRコードが表示されます。これをスマホで読み取って友達に追加してください。
トークンを取得する
QRコードのさらに下の方に「チャネルアクセストークン」という項目があります。ここで「チャネルアクセストークン(長期)」を発行してください。”長期” のアクセストークンには期限がありません。
ユーザーIDを確認する
チャネルの画面の「チャネル基本設定」タブを選び、下のほうにスクロールすると「あなたのユーザーID」が表示されていますのでこれを確認します。
動作確認
ターミナルから curl コマンドを実行します。<チャネルトークン> と <ユーザーID> はそれぞれ上で設定・調べた内容に置き換えてください。
1 2 3 4 |
$ curl -i -X POST https://api.line.me/v2/bot/message/push \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer <チャネルアクセストークン>' \ -d '{ "to": "<ユーザーID>", "messages": [{ "type": "text", "text": "Hello, world" }] }' |
スマホで友達になったトークルームを見てください。メッセージが届いているはずです。
外部のシステムから LINE の画面にメッセージを送ることが可能なことを確認できました。
AWS Lambda を設定
次は LINE の背後で応答を返すシステムを作ります。無償で簡単に使えるサーバーがあればそこに API を実装するのが定石ですが、Heroku が有償化されてからは使えるサーバー環境が無くなってしまいました。
そこで、AWS の Lambda を使って実装することにします。AWS Lambda が初めての場合は こちら を参考にして基本的な使い方を理解してください。
レイヤーを作る
まず、Lambda のレイヤーにアップロードする zip ファイルをパソコンのローカル環境で作ります。使用する Python のバージョン、ライブラリのバージョンは先行例などを調べて決めてください。今回は LINE と OpenAI(ChatGPT)を使うことを想定して次の環境にしました。pip コマンドがバージョン不整合のエラーを出すので使用するバージョンを調整した結果この様になりました。
- Python 3.11.6
- pip install fastapi==0.99.0 openai
- pip install line-bot-sdk==3.0.3
- pip install requests pprints
この環境を zip して Lambda にアップロードし、レイヤーを作ります。
Lambda 関数を作る
Lambda 関数を作って、「関数URL」を設定します。ここで一旦 LINE のコンソールに戻ります。LINE コンソールのチャネルの画面に戻って「Messaging API設定」のタブを選び、次のように設定します。
- 「Webhookの利用」をオン
- 「Webhook設定」の「Webhook URL」に、Lambda の関数URLを入力する。ここで「検証」ボタンを押すと Lambda が反応しているかどうか確認できます。
- 「エラーの統計情報」をオン
- 「応答メッセージ」はオフ
Lambda 関数の、「設定」タブをクリックし、左側のメニューから「環境変数」を選びます。ここにLINE のユーザーIDとトークンを保存します。
- キー(1): LINE_CHANNEL_ACCESS_TOKEN
- 値(1): LINE のコンソールで作った「チャネルアクセストークン」
- キー(2): LINE_CHANNEL_SECRET
- 値(2): LINE のコンソールで確認した「あなたのユーザーID」
Lambda 関数に次のようなソースコードを入力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import os import json import requests from pprint import pprint def lambda_handler(event, context): channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN') channel_secret = os.getenv('LINE_CHANNEL_SECRET') #---------------------------- # LINEへメッセージをPUSH送信 #---------------------------- pushmessage = [ {'type':'text','text':'こんにちは'}, {'type':'text','text':'さようなら'} ] payload = {'to': channel_secret, 'messages': pushmessage} # カスタムヘッダーの生成(dict形式) headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + channel_access_token} # headersにカスタムヘッダーを指定 r = requests.post("https://api.line.me/v2/bot/message/push", headers=headers, data=json.dumps(payload)) print("LINE Status :" + r.text) # Debug return |
実行すると LINE 画面に「こんにちは」「さようなら」と表示されるはずです。AWS から LINE への通信が確認できました。
次はこのようにソースコードを変更します。受信した内容をそのまま送り返す処理になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import os import json import requests from pprint import pprint def lambda_handler(event, context): channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN') #------------------------------- # 受信したLINEメッセージを解析 #------------------------------- bodyjson = json.loads(event['body']) messagetext = bodyjson['events'][0]['message']['text'] print("messagetext: " + messagetext) replyToken = bodyjson['events'][0]['replyToken'] print("replyToken: " + replyToken) #------------------------------- # 受診した内容をそのまま送り返す #------------------------------- resmessage = [ {'type':'text','text':messagetext} ] payload = {'replyToken': replyToken, 'messages': resmessage} # カスタムヘッダーの生成(dict形式) headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + channel_access_token} # headersにカスタムヘッダーを指定 r = requests.post("https://api.line.me/v2/bot/message/reply", headers=headers, data=json.dumps(payload)) print("LINE Status :" + r.text) # Debug return |
関数をデプロイしたら、スマホの LINE 画面から何かメッセージを送ってください。オウム返しにメッセージが返ってくるはずです。
ChatGPT と会話する
オウム返しする BOT ができましたので、次は LINE から送られたメッセージを ChatGPT に転送し、ChatGPT の回答内容を LINE に送り返すようにしてみます。こうすれば LINE 画面で ChatGPT を会話するアプリを実現できます。
ChatGPT の使い方は こちら を参照して使い方を理解しておいてください。また、この機能の実装のために API キーを作ってください。作った API キーを Lambda 関数の環境変数に設定します。
- キー(3): OPENAI_API_KEY
- 値(3): ChatGPT の API キー
ソースコードはこのようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
import os import json import requests from pprint import pprint from openai import OpenAI def lambda_handler(event, context): channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN') #------------------------------- # 受信したLINEメッセージを解析 #------------------------------- bodyjson = json.loads(event['body']) messagetext = bodyjson['events'][0]['message']['text'] print("messagetext: " + messagetext) replyToken = bodyjson['events'][0]['replyToken'] print("replyToken: " + replyToken) #------------------------------- # ChatGPTにメッセージを送る #------------------------------- client = OpenAI( api_key=os.environ.get("OPENAI_API_KEY"), ) chat_completion = client.chat.completions.create( messages=[ { "role": "user", "content": messagetext, } ], model="gpt-3.5-turbo", ) print(chat_completion.choices[0].message.content) #------------------------------- # ChatGPTの回答をLINEに送る #------------------------------- resmessage = [ {'type':'text','text': chat_completion.choices[0].message.content} ] payload = {'replyToken': replyToken, 'messages': resmessage} # カスタムヘッダーの生成(dict形式) headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + channel_access_token} # headersにカスタムヘッダーを指定 r = requests.post("https://api.line.me/v2/bot/message/reply", headers=headers, data=json.dumps(payload)) print("LINE Status :" + r.text) # Debug return |
オウム返しではなく ChatGPT が返事してくれるはずです。応答がなかったら Lambda 関数の「設定」→「一般設定」のタイムアウトを少し長く設定してください。デフォルトは3秒ですが ChatGPT の応答が間に合わないことがあるからです。