AI Chatbot: LINE ID
https://liff.line.me/1645278921-kWRPP32q/?accountId=854dadlt
①ChatGPTの準備:
OpenAIのAPIを使用してChatGPTと連携します。これにはAPIキーが必要で、OpenAIのウェブサイトで取得できます。
②LINE公式アカウントの作成:
LINE Developersのウェブサイトにアクセスし、新しいプロバイダーとチャンネルを作成します。この過程で、チャネルアクセストークンとチャネルシークレットが生成され、これらは後で必要になります。
③GoogleAppsScript(GAS)プロジェクトの作成:
新規GASプロジェクトを作成し、以下の関数を含むスクリプトを作成します。
doPost:
LINEからのwebhookイベントを受け取ります。メッセージイベントの場合、ユーザーからのメッセージを取得し、それをOpenAIのChatGPTに送信します。ChatGPTからの応答を受け取ったら、それをLINEのユーザーに返します。
④ChatGPTへのリクエスト:
この関数はOpenAIのAPIにリクエストを送信し、GPTからの応答を受け取ります。
LINEとGASの連携:LINE Developersコンソールでwebhook URLを設定します。これはGASプロジェクトの公開URLになります。
const GPT_TOKEN = 'chatGPT APIキー'; //ChatGPTのAPIキーを入れてください
const LINE_TOKEN = 'LINEMessengerAPI キー'; // LINEのAPIキーを入れてください
const LINE_ENDPOINT = "https://api.line.me/v2/bot/message/reply";
const GPT_ENDPOINT = 'https://api.openai.com/v1/chat/completions';
const MODEL_NAME = 'gpt-3.5-turbo';
const MODEL_TEMP = 0.5;
const MAX_TOKENS = 256;
// LINEからPOSTリクエストが渡されてきたときに実行される処理
function doPost(e) {
// LINEからPOSTされるJSON形式のデータをGASで扱える形式(JSオブジェクト)に変換
const json = JSON.parse(e.postData.contents);
// LINE側へ応答するためのトークンを作成(LINEからのリクエストに入っているので、それを取得する)
const reply_token = json.events[0].replyToken;
if (typeof reply_token === 'undefined') {
return;
}
// LINEから送られてきたメッセージを取得
const user_message = json.events[0].message.text;
// 改行で区切って配列にする
const user_msgarray = user_message.split(/\r\n|\n/);
// LINEのメッセージをChatGPTに投げるメッセージにセットする
const messages = [{ "role": "user", "content": user_msgarray[0] }]
const headers = {
'Authorization': 'Bearer ' + GPT_TOKEN,
'Content-type': 'application/json',
};
// リクエストオプション
const options = {
'method': 'POST',
'headers': headers,
'payload': JSON.stringify({
'model': MODEL_NAME, // 使用するGPTモデル
'max_tokens': MAX_TOKENS, // レスポンストークンの最大値(最大4,096)
'temperature': MODEL_TEMP, // 応答の多様性(0-1)※数値が大きいほどランダムな応答になる
'messages': messages
})
};
// HTTPリクエストでChatGPTのAPIを呼び出す
const res = JSON.parse(UrlFetchApp.fetch(GPT_ENDPOINT, options).getContentText());
// ChatGPTから返却されたメッセージを応答メッセージとしてLINEに返す
lineReply(json, res.choices[0].message.content.trimStart());
}
// LINEへの応答
function lineReply(json, replyText) {
// 応答用のメッセージを作成
const message = {
"replyToken": json.events[0].replyToken,
"messages": [{
"type": "text", // メッセージのタイプ(画像、テキストなど)
"text": replyText
}] // メッセージの内容
};
// LINE側へデータを返す際に必要となる情報
options = {
"method": "post",
"headers": {
"Content-Type": "application/json; charset=UTF-8", // JSON形式を指定、LINEの文字コードはUTF-8
"Authorization": "Bearer " + LINE_TOKEN // 認証タイプはBearer(トークン利用)、アクセストークン
},
"payload": JSON.stringify(message) // 応答文のメッセージをJSON形式に変換する
};
// LINEへ応答メッセージを返す
UrlFetchApp.fetch(LINE_ENDPOINT, options);
}