見出し画像

【LINE✖️ChatGPT】GASでLINEとChatGPT「Function Calling」を連携して自動メール送信機能の構築


はじめに


こんにちは。じゅんです。
X:https://twitter.com/junichikawaAI
前回の記事で、GPTsとGoogleカレンダーを連携させる方法についてご紹介しました。今回は、さらにその範囲を広げ、Google Apps Script(GAS)を活用して、LINEメッセージから直接メールを送信する機能を実装してみたいと思います。この方法を利用すれば、例えば「2024年に行くべき場所3箇所を××××@gmail.comに送信して」とLINEでメッセージを送るだけで、指定のメールアドレスに内容が送信されるようになります。

この記事では、GASを準備し、LINE DevelopersでLINEアカウントを作成、そして実際にLINEからメールを送信する機能を実装する方法をステップバイステップで解説します。

この記事の対象者:

  • 簡単なLINEbot を作りたい方

  • OpenAI APIを使用して開発したい方

  • Function Callingを使用して何ができるか知りたい方

手順① GASを準備する


1. Google Driveに新しいスクリプトを作成
以下のページに移動し、GASを作成します。
https://script.google.com/home

2. プロジェクトの設定
プロジェクトに名前を付けます。画面上部の「無題のプロジェクト」をクリックし、「LINEボットとGmail連携」など、プロジェクトの内容を示す名前を入力します。

3. スクリプトの準備
以下のコードをエディタに貼り付けます。このコードは、LINEからのメッセージを受信し、Gmailの送信を実行するためのものです。

// 定数の定義
const scriptProperties = PropertiesService.getScriptProperties();
const OPENAI_API_KEY = scriptProperties.getProperty('OPENAI_API_KEY');
const CHANNEL_ACCESS_TOKEN = scriptProperties.getProperty('CHANNEL_ACCESS_TOKEN');
const LINE_REPLY_URL = 'https://api.line.me/v2/bot/message/reply';
const CHAT_GPT_URL = "https://api.openai.com/v1/chat/completions";
const CHAT_GPT_VERSION = "gpt-3.5-turbo-0613"; // ChatGPTのバージョン指定

// WebhookからのPOSTリクエストを処理する
function doPost(e) {
  if (!e.postData.contents) {
    console.log('No post data.');
    return;
  }

  const json = JSON.parse(e.postData.contents);
  if (!json.events || json.events.length === 0) {
    console.log('No events found.');
    return;
  }

  const event = json.events[0];
  if (event.type !== 'message' || event.message.type !== 'text') {
    console.log('Unsupported event type.');
    return;
  }

  const replyToken = event.replyToken;
  const messageText = event.message.text;

  // LINEメッセージを処理して応答を生成
  const chatGPTResponse = processLineMessage(messageText);

  // LINEに応答を送信
  sendLineResponse(replyToken, chatGPTResponse);
}

// LINEメッセージを処理してChatGPTからの応答を取得
function processLineMessage(messageText) {
  let returnText;
  const requestOptions = {
    method: "post",
    headers: {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + OPENAI_API_KEY
    },
    payload: JSON.stringify({
      model: CHAT_GPT_VERSION,
      messages: [{"role": "user", "content": messageText}],
      functions: [{
        name: "send_email",
        description: "Send email",
        parameters: {
          type: "object",
          properties: {
            email: {type: "string", description: "メールアドレス"},
            body: {type: "string", description: "本文"},
            subject: {type: "string", description: "件名"}
          },
          required: ["email", "body", "subject"],
        },
      }],
      function_call: "auto"
    })
  };

  const response = UrlFetchApp.fetch(CHAT_GPT_URL, requestOptions);
  const responseData = JSON.parse(response.getContentText());

  return handleChatGPTResponse(responseData);
}

// ChatGPTの応答を処理
function handleChatGPTResponse(responseData) {
  const choice = responseData.choices[0].message;
  if (choice.function_call) {
    const functionName = choice.function_call.name;
    const functionArguments = JSON.parse(choice.function_call.arguments);
    if (functionName === 'send_email') {
      return sendEmail(functionArguments.email, functionArguments.body, functionArguments.subject);
    }
  } else {
    return choice.content.trim();
  }
}

// メールを送信して応答メッセージを生成
function sendEmail(email, body, subject) {
  // メール送信処理
  MailApp.sendEmail(email, subject, body);
  // 応答メッセージのフォーマット
  return `以下のメールを送信しました。\n宛先:${email}\nタイトル:${subject}\n本文:${body}`;
}

// LINEに応答メッセージを送信
function sendLineResponse(replyToken, message) {
  const headers = {
    "Content-Type": "application/json; charset=UTF-8",
    "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN,
  };

  const payload = JSON.stringify({
    replyToken: replyToken,
    messages: [{type: "text", text: message}],
  });

  const options = {
    method: "post",
    headers: headers,
    payload: payload,
  };

  const response = UrlFetchApp.fetch(LINE_REPLY_URL, options);
  if (response.getResponseCode() !== 200) {
    console.log('Failed to send message to LINE:', response.getContentText());
  }
} 

4. スクリプトプロパティの設定

  • スクリプトエディタのメニューから「プロジェクトの設定」>「スクリプト プロパティ」を選択します。

  • 「スクリプト プロパティを編集」を選択し、「スクリプト プロパティを追加」をクリックし、OPENAI_API_KEYCHANNEL_ACCESS_TOKENの二つのプロパティ名と、それぞれの値を入力します。これらは、OpenAIとLINEプラットフォームへの認証に使用されます。

5. Google Apps Scriptのデプロイ

  • 「デプロイ」のドロップボタンを開き、「新しいデプロイ」を選択します。

  • 「⚙️」を選択し、ウェブアプリを選択します。

  • 以下の情報を設定欄に入れます。
    新しい説明文:適当な文章
    次のユーザとして実行:
    自分
    アクセスできるユーザー:
    全員

  • デプロイが完了すると、生成されたウェブアプリケーションのURLが表示されます。このURLは、LINE Messaging APIのWebhook URLとして使用するので保存しておきます。

以上で、Google Apps Scriptの準備は完了です。この基盤を使って、LINEボットからのメッセージに基づいてGmailを送信する機能を実装していきます。

手順② LINE DevelopersでLINEアカウントを作成する


LINE Developersプラットフォームを使って、LINEボットを作成し、ユーザーとのコミュニケーションを自動化します。ここでは、LINEアカウントの作成からボットの設定までの手順を詳しく解説します。

ステップ1: LINE Developersアカウントの作成

  1. LINE Developersの公式サイト(https://developers.line.biz/)にアクセスします。

  2. 「ログイン」をクリックし、LINEアカウントでログインします。まだアカウントを持っていない場合は、LINEアプリをダウンロードしてアカウントを作成してください。

  3. 初めてログインする場合は、利用規約に同意し、必要な情報を入力してアカウント設定を完了させます。

ステップ2: プロバイダの作成

  1. ダッシュボード上で「新規プロバイダ作成」をクリックします。

  2. プロバイダ名を入力し、「確認」をクリックします。プロバイダは、複数のLINEボットやLINEログインサービスを管理するための単位です。

ステップ3: LINEボットの作成

  1. 作成したプロバイダのダッシュボードで、「新規チャネル作成」を選択します。

  2. 「Messaging API」を選択し、「作成」をクリックします。

  3. 必要な情報(チャネル名、チャネル説明、カテゴリ、サブカテゴリ、プライバシーポリシーのURLなど)を入力し、「作成」をクリックします。これで、LINEボットの基本設定が完了します。

ステップ4: LINEボットの設定

  1. 作成したボットの設定ページに移動し、「Messaging API設定」タブを開きます。

  2. Webhook送信を「利用する」に設定し、WebhookのURLにGoogle Apps Scriptで公開したウェブアプリケーションのURLを入力します。

  3. 「アクセストークン(長期)」を生成し、このトークンをGoogle Apps ScriptのスクリプトプロパティのCHANNEL_ACCESS_TOKENに保存します。

  4. また、応答メッセージなどの設定を無効にします。

ステップ5: LINE公式アカウントの友だち追加

  1. LINEアプリで、ボットのLINE公式アカウントを友だちに追加します。これにより、実際にボットと対話を始めることができます。

これで、LINE DevelopersでのLINEアカウント作成とボットの基本設定が完了しました。これらのステップにより、ユーザーはLINE経由でメッセージを送信し、設定したGoogle Apps Scriptを介して自動的にGmailを送信する仕組みを利用できるようになります。

実際に試してみる


実際に、「2024年に行くべき場所3箇所を××××@gmail.comに送信して」とLINEでメッセージを送るだけで、指定のメールアドレスに内容が送信されるようになります。

また、「2024年に行くべき場所3箇所を教えて。」と送ると、メールは送信されずに実際に回答してくれます。

コードの解説


定数の定義

  • scriptProperties: スクリプトのプロパティを取得し、APIキーやアクセストークンなどのセキュアな情報を管理します。

  • OPENAI_API_KEYCHANNEL_ACCESS_TOKEN: OpenAIとLINEプラットフォームからのアクセスに必要な認証情報です。

  • LINE_REPLY_URLCHAT_GPT_URL: LINEとOpenAIのエンドポイントURLです。

  • CHAT_GPT_VERSION: 使用するChatGPTのバージョンを指定します。

doPost関数

  • LINEプラットフォームからのWebhookリクエストを処理します。この関数は、LINEユーザーからのメッセージを受け取った際に自動的に実行されます。

  • 受け取ったイベント(メッセージ)がテキストタイプかどうかを確認し、適切な処理を行います。

processLineMessage関数

  • LINEから受け取ったメッセージを処理し、ChatGPTに問い合わせを行うためのリクエストを準備します。

  • requestOptionsオブジェクトには、ChatGPTへのPOSTリクエストに必要な情報が含まれています。

  • ChatGPTからの応答を受け取り、さらに処理を行います。

handleChatGPTResponse関数

  • ChatGPTからの応答を処理します。メール送信の呼び出しをチェックし、必要に応じて対応するアクションを実行します。

  • この例では、send_email関数が呼び出され、メール送信の処理が行われます。

sendEmail関数

  • MailApp.sendEmailメソッドを使用して、指定された宛先にメールを送信します。

  • 送信後、ユーザーに通知するための応答メッセージを生成します。

sendLineResponse関数

  • 処理結果をLINEユーザーに返信するために、LINEプラットフォームへPOSTリクエストを送信します。

  • この関数は、応答メッセージをLINEのメッセージングAPIを通じてユーザーに送り返すために使用されます。

全体のフロー

  1. ユーザーがLINEボットにメッセージを送信します。

  2. GASがそのメッセージを受け取り、ChatGPT APIを通じて処理を行います。

  3. 必要に応じて、メール送信などのアクションが実行されます。

  4. 処理結果(メール送信の通知など)がユーザーにLINE経由で返信されます。

終わりに


この記事を参考にご自身でOpenAIのAPIを使用したLINE Botの開発する際の一助になれば、幸いです。

最後までご精読いただき、ありがとうございました。

Image Credit: Open AI Inc. and LY Corporation


この記事が参加している募集

GPTsつくってみた

この記事が気に入ったらサポートをしてみませんか?