ChatGPTを使ったLineボットを作る

ChatGPTに任せて、LINEボット+ChatGPT+GAS+スプレットシートを利用して作ってみたいと思います。

まず、ChatGPTに問いかけ

GAS (Google Apps Script)を用いて、LINEボットとChatGPT、スプレッドシートを連携するプロジェクトは面白そうですね。ここでは、その基本的な流れを説明します。ただし、GASやLINEボット、そしてChatGPTにはそれぞれ設定が必要ですので、それぞれの公式ドキュメンテーションをよく読んで設定を行うことを強く推奨します。
まずはじめに、GASとLINEボットの連携から始めましょう。以下にサンプルコードを記載します。詳細はコメントを参照してください。

答え

// LINE Developersの管理画面から取得したチャンネルトークンを設定します。
var CHANNEL_ACCESS_TOKEN = 'Your-Channel-Access-Token';
// doPostは、LINEからのPOSTリクエストをハンドリングします。
function doPost(e) { // LINEのイベントデータを取得します。 var json = JSON.parse(e.postData.contents); // イベントデータ内のメッセージを取り出し、GAS側で処理します。 json.events.forEach(function(event) { handleEvent(event); }); // 正常に処理が終了したことをLINEに伝えます。 return ContentService.createTextOutput(JSON.stringify({'status': 'ok'})) .setMimeType(ContentService.MimeType.JSON);
}
// handleEventは、LINEからの各イベントを処理します。
function handleEvent(event) { // テキストメッセージの場合の処理を行います。 if (event.type === 'message' && event.message.type === 'text') { // メッセージテキストを取得します。 var text = event.message.text; // メッセージの応答処理を行います。 // ここでは元のテキストをそのまま返す例を示します。 reply(event.replyToken, text); }
}
// replyは、LINEへの返信を行います。
function reply(token, text) { // リクエストパラメータを設定します。 var url = 'https://api.line.me/v2/bot/message/reply'; var headers = { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }; var postData = { 'replyToken': token, 'messages': [{ 'type': 'text', 'text': text, }], }; // HTTPリクエストを実行します。 UrlFetchApp.fetch(url, { 'headers': headers, 'method': 'post', 'payload': JSON.stringify(postData), });
}

次に、ChatGPTを導入する部分です。OpenAIのAPIを使ってChatGPTとのやり取りを行います。OpenAI APIを使用するためのアクセストークンは、OpenAIの公式ウェブサイトから取得します。以下にサンプルコードを記載します。

// OpenAI APIのアクセストークンを設定します。
var OPENAI_API_TOKEN = 'Your-OpenAI-API-Token';
// chatGptを使ってメッセージを生成します。
function generateMessageWithChatGpt(prompt) { // リクエストパラメータを設定します。 var url = 'https://api.openai.com/v1/engines/davinci-codex/completions'; var headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + OPENAI_API_TOKEN, }; var postData = { 'prompt': prompt, 'max_tokens': 150, }; // HTTPリクエストを実行します。 var response = UrlFetchApp.fetch(url, { 'headers': headers, 'method': 'post', 'payload': JSON.stringify(postData), }); // レスポンスからメッセージテキストを取り出します。 var responseJson = JSON.parse(response.getContentText()); var messageText = responseJson.choices[0].text.trim(); return messageText;
}

また、スプレッドシートとの連携は以下のように行うことができます。

// メッセージと応答をスプレッドシートに記録します。
function logToSpreadsheet(inputText, outputText) { // スプレッドシートを開きます。 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName('Sheet1'); // 最終行にデータを追加します。 var lastRow = sheet.getLastRow(); sheet.getRange(lastRow + 1, 1).setValue(inputText); sheet.getRange(lastRow + 1, 2).setValue(outputText);
}