🌐

ChatGPTのAPIとチャットワーク繋げてみた

2023/03/11に公開

「最近流行りのChatGPTとチャットワークとの連携できないですか?」と社内要望があり、丁度無料分のクレジットがあるタイミングだったので、なんとかしてみた。

導入結果

まずは出来上がりを。
社内エンジニアに公開したところ、色々遊んでくれました。

私たちツンデレっていう謎ワード。色々しゃべってくれて楽しい!
ってところで実際こういうことしたい方は更に下の方見ていってくれれば。

使うもの

  • ChatGPT(厳密にはOpenAI)のAPI
  • チャットワーク
  • GAS(GoogleAppsScript)

こんだけ。

設計

設計はこんな感じ。

チャットワーク側のトリガとなるものなんかあったよな…と思ってましたが、webhookがありました。よかった。
指定のルームIDの窓における発言をトリガとしてGAS実行させた。

方法

チャットワークのAPIトークン発行

まずはチャットワーク側から。
これはチャットワーク側の説明みてもらったほうが早いので割愛。以下参照いただければ。
チャットワーク APIトークンを発行する

これは後で使うのでメモ。

OpenAIアカウント作成

キー発行にはChatAPT開発元のOpenAIにサインアップする必要あり。
以下のURLから登録をば。
https://platform.openai.com/signup

OpenAI APIキー発行

作成したら以下のURLからログイン。
https://platform.openai.com/login

右上のメニューから「View API keys」を選択。

API keysのページに行くので、そこで「Create new secret key」を押すとキーが発行される。
※このキーは一度しか表示されないのでちゃんとメモっとく必要あり

GAS作成

GASはGoogleのアカウントを持ってれば使える。

スクリプト作成

こちらから新しいスクリプトを作成。
https://script.google.com/home

ライブラリの追加

「チャットワークAPIそのまま叩く」でもいいですが、今回はChatWorkClient使わせてもらう。
ライブラリの「+」ボタン →ライブラリの追加 と進み、
スクリプトID:1nf253qsOnZ-RcdcFu1Y2v4pGwTuuDxN5EbuvKEZprBWg764tjwA5fLav
といれて検索を押すと、ChatworkClientが見つかるのでそれを追加。

スクリプトの中身作成

実際にそのスクリプトの中身を作成。
{XXXXX}ってとこはチャットワークのAPIトークンだったりだとかOpenAIAPIキーに置き換えてもらえればOK。
チャットワークのwebhook前に送信テストしたければ、messageとroomIdを直接指定してあげればOK。

function doPost(e) {
  // チャットワークのwebhookからの情報取得
  var data = JSON.parse(e.postData.contents);
  var message = data.webhook_event.body;
  var roomId = data.webhook_event.room_id;
  // chatGPT宛かチェック
  if(message.indexOf("@chatgpt")){
    return;
  }
  // ChatGPTへリクエスト
  var gptMsg = requestChatCompletion(message);
  // チャットワークへ送信
  sendChatworkMessage(roomId,gptMsg);
}

/**
 * チャットワークへのメッセージ送信
 */
function sendChatworkMessage(room_id,message) {
  //Chatwork API Tokenを定数として定義
  const token = '{チャットワークのAPIトークン}';
  // ChatworkAPIクライアント作成
  const client = ChatWorkClient.factory({token: token});
  //ChatworkAPIクライアントからメッセージ投稿
  client.sendMessage({
        room_id: room_id,
        body: "[info][title]チャットGPTからの返信[/title]"+ message + "[/info]"
  });
}

/**
 * ChatGPT APIへのリクエスト
 */
function requestChatCompletion(message) {
  //スクリプトプロパティに設定したOpenAIのAPIキーを取得
  const apiKey = '{OpenAI APIキー}';
  //ChatGPTのAPIのエンドポイントを設定
  const apiUrl = 'https://api.openai.com/v1/chat/completions';
  //ChatGPTに投げるメッセージを定義(ユーザーロールの投稿文のみ)
  const messages = [{'role': 'user', 'content': message}];
  //OpenAIのAPIリクエストに必要なヘッダー情報を設定
  const headers = {
    'Authorization':'Bearer '+ apiKey,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  //ChatGPTモデルやトークン上限、プロンプトをオプションに設定
  const options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'gpt-3.5-turbo',
      'max_tokens' : 1024,
      'temperature' : 0.9,
      'messages': messages})
  };

  try{
    //OpenAIのChatGPTにAPIリクエストを送り、結果を変数に格納
    const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
    // エラーチェック
    if(Object.keys(response).indexOf('error') !== -1){
      return "エラーメッセージ:" + response.error.message;
    }
    //ChatGPTのAPIレスポンスをログ出力
    console.log(response);
    console.log(response.choices[0].message.content);
    return response.choices[0].message.content;
  }catch(e) {
    return "OpenAIのAPIでエラー"
  }
}

スクリプトのデプロイ

GASのコード画面右上にデプロイボタンがあるので、そこから「新しいデプロイ」を選択。

  • 種類の選択:ウェブアプリ
  • 設定
    • 説明:お好きな説明文を
    • 次のユーザーとして実行:自分
    • アクセスできるユーザー:全員
      とする。

この設定にしてるのは、実際に実行するのがチャットワークのwebhookからになるから。

デプロイが完了するとこういうポップアップがでるので、ウェブアプリのURLをコピってメモ。

チャットワークのwebhook設定

これが最後の工程。
チャットワークにwebhookを追加する。

まずは右上のところからサービス連携を選択。

webhookのところから新規作成。

以下のように設定。

  • Webhook名:なんでもOK
  • WebhookURL:さっきメモったGASデプロイ時のウェブアプリのURL
  • イベント:ルームイベント選択、メッセージ作成にチェック、ルームID指定

これで一通り設定完了。

実行してみる

指定したチャットの窓にて頭に「@chatgpt」をつけて発言。

こんな感じに返ってきてくれます。

注意点

無料タイミングじゃないと普通にお金かかるので注意!(それでも安いけど)
無料枠超えたら普通に料金かかるので、使うかどうかはご相談の上で。

別垢を無料じゃないタイミングでとってしまって

You exceeded your current quota, please check your plan and billing details.

割当分超えてるから課金請求部分チェックして!ってエラーでた。悲しみ。

実際やってみて

AI系がかなりいろいろでてきて、色んなところで連携できたら楽しみでもあり恐くもあり。
とりあえず触ってってAIとも仲良くしていきましょい。

Discussion