💬

LINE BotでChatGPTと会話する

2024/05/20に公開

概要

この記事ではGoogle Apps Script(以下GAS)を用いてChatGPTとLINE Botを繋げる記事です。
それぞれのAPIの設定方法を解説をします。この記事ではソースコードの中身までは詳しく触れません。ですので、ソースコードの詳しい解説が知りたい場合にはLINE BotでChatGPTと会話する(ソースコード編)を確認してください。
シーケンス図で書くと下記のようなものです。

Google Apps Script(GAS)のセットアップ

GASのセットアップを行ってきます。今回はこのGASを中心にOpenAIやChatGPTのAPIを叩いていきます。[1]

Googleスプレッドシートにアクセスしてスプレッドシートを作ります。

ツールからApps Scriptを選択して、クリックしましょう。

このような画面になったらセットアップは完了です。

OpenAIのセットアップ

OpenAIのセットアップを行っていきます。GASとOpenAIを繋げるために、OpenaAIからAPIキーを受け取ってGAS側にAPIキーとして設定します。

OpenAIのwebサイトにアクセスします。[2]

『Create Access Key』をクリックして新しいアクセスキーを発行します。

基本的にはデフォルトの設定のままです。

発行したAPIキーをコピーしましょう。

GASにコピーしたAPIキーを貼り付けましょう。

LINEのセットアップ

LINE APIの設定を行っていきます。GASとLINEを繋げるために、LINEのWebhookにGASのURLを設定したり、LINEのチャンネルアクセストークンをGASに設定していきます。

プロバイダーのセットアップ

LINE Developers にアクセスします。[3]

プロバイダーを作成しましょう。プロバイダーというのはLINEのAPIを使うときの一つの塊のようなものです。

プロバイダーに任意の名前をつけて作成します。

『Messaging API』をクリックします。

適当にフォームの内容を入力して『作成』をクリックします。


同意して進めます。

下記のような画面が出れば作成成功です。

『Messaging API 設定』をクリックしましょう。

LINEがインストールされたスマートフォンでQRコードを読み取りましょう。友達追加ができます。

Webhookの設定

『新しいデプロイ』を選択

『Webアプリ』を選択

『アクセスを許可』を『全員』に変更してデプロイしましょう。

URLがコピーしましょう

LINE APIのWebhook URLを編集して、URLをコピーして『更新』を押しましょう。

検証を押して『成功』と出たら成功です。



Webhookの利用をオンしましょう。

『あいさつメッセージ』と『応答メッセージ』の無効化

『編集』をクリックします。

『あいさつメッセージ』と『応答メッセージ』を無効にします。

チェンネルアクセストークンの設定


チャンネルアクセストークンをコピーしましょう

『LINE_CHANNEL_ACCESS_TOKEN』をプロパティとして追加して先ほどのチャンネルアクセストークンをペーストしましょう。

ソースコードを書いてデプロイ

今回のソースコードです。ソースコードの詳細はLINE BotでChatGPTと会話する(ソースコード編)を参照してください。

const LINE_CHANNEL_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('LINE_CHANNEL_ACCESS_TOKEN');
const OPENAI_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('OPENAI_ACCESS_TOKEN');

const LINE_ENDPOINT = 'https://api.line.me/v2/bot/message/reply';
const OPENAI_API_URL = 'https://api.openai.com/v1/chat/completions';

// LINEからのPOSTリクエストを処理
function doPost(e) {
  try {
    const json = JSON.parse(e.postData.contents);
    const replyToken = json.events[0].replyToken;
    const userMessage = json.events[0].message.text;

    if (typeof replyToken === 'undefined') {
      throw new Error('Reply token is undefined');
    }

    const replyMessage = getChatGptResponse(userMessage);
    sendLineReply(replyToken, replyMessage);

    return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    Logger.log('Error in doPost: ' + error.message);
    return ContentService.createTextOutput(JSON.stringify({'content': 'error'})).setMimeType(ContentService.MimeType.JSON);
  }
}

// OpenAIのChatGPTにメッセージを送信し、応答を取得
function getChatGptResponse(message) {
  const messages = [{'role': 'user', 'content': message}];
  const headers = {
    'Authorization': 'Bearer ' + OPENAI_ACCESS_TOKEN,
    'Content-type': 'application/json'
  };
  const options = {
    'muteHttpExceptions': true,
    'headers': headers,
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'gpt-3.5-turbo',
      'max_tokens': 2048,
      'temperature': 0.9,
      'messages': messages
    })
  };

  try {
    const response = UrlFetchApp.fetch(OPENAI_API_URL, options);
    const jsonResponse = JSON.parse(response.getContentText());
    return jsonResponse.choices[0].message.content;
  } catch (error) {
    Logger.log('Error in getChatGptResponse: ' + error.message);
    return 'Sorry, I couldn\'t process your request.';
  }
}

// LINEにメッセージを返信
function sendLineReply(replyToken, message) {
  const payload = {
    'replyToken': replyToken,
    'messages': [{
      'type': 'text',
      'text': message
    }]
  };
  const headers = {
    'Content-Type': 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN
  };
  const options = {
    'method': 'POST',
    'headers': headers,
    'payload': JSON.stringify(payload)
  };

  try {
    UrlFetchApp.fetch(LINE_ENDPOINT, options);
  } catch (error) {
    Logger.log('Error in sendLineReply: ' + error.message);
  }
}

ソースコードをコピーアンドペーストしてデプロイします。

デプロイを管理をクリックします。

『新しいバージョン』としてデプロイします。

『アクセスを承認』というボタンが出てくるのでボタンをクリックして、Googleアカウントでログインしていきます。

途中で下記のような画面が出ると思いますが進めていきます。


このような画面になったらデプロイ完了です。

動作検証

このように動作したら完成です!!

脚注
  1. Googleアカウントが必要です。 ↩︎

  2. OpenAIの課金設定をしていない場合は課金設定が必要です。 ↩︎

  3. LINEアカウントが必要です。 ↩︎

Discussion