6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GAS×ChatGPT×LINE公式 AIチャットbotの作り方

Last updated at Posted at 2023-07-16

AI Chatbot: LINE ID
https://liff.line.me/1645278921-kWRPP32q/?accountId=854dadlt

S__3072011.jpg

S__3072013.jpg

①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);
}
6
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
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?