【ChatGPT × Slack】ChatGPTとSlackを連携させてみた！

# はじめに
最近、SlackとChatGPTの連携ができることを知りました。そこで、SlackでChatGPTを使えると業務に活かせるのではないか？と考えたため、SlackAPIとGoogle Apps Scriptを使った連携方法を参考にしつつ実際に試してみたため紹介します。

完全無料だと利用上限も決まっているため短期的でしか使えませんが、課金前提だと長期的にSlackでChatGPTを活用できると考えられます。

連携するための所要時間としては、約20分～1時間（長くても）で完了できると思います。
# 実装
SlackAPIとGoogle Apps Script（以後GAS）を使い無料で連携させる方法です。

主な手順は以下の5つです。
1\. GASでイベント受信用URLを作成する
2\. SlackBotsを作成する
3\. APIKeyを作成する
4\. GASからSlackにメッセージを送信する
5\. 任意のチャンネルにSlackBotsを追加する
# GASでイベント受信用URLを作成する
GASにアクセス後、「新しいプロジェクトを作成」クリックしプロジェクトを作成します。

プロジェクトを作成すると、元々あるコードを消し、以下のコードで上書きします。
```javascript
function doPost(e) {
  //受信データをパース
  const params = JSON.parse(e.postData.getDataAsString());
  //Challenge認証用
  if (params.type === 'url_verification') {
    return ContentService.createTextOutput(params.challenge);
  }
  return;
}
```
# プロジェクトをデプロイしてURLを発行する
以下の手順で、SlackBotsのイベント送信先URLを作成します。

1\.「デプロイ」をクリックし「新しいデプロイ」を選択する
2\.「種類の選択（歯車マーク）」をクリックし「ウェブアプリ」を選択する
3\.「アクセスできるユーザー」を「全員」に設定し、「デプロイ」をクリックする
4\.「URL」をメモに残しておく
# OpenAIでアカウントを作成する
以下の手順でアカウントを作成します。

1\. OpenAIにアクセスして「API」「SIGN UP」を順にクリックする。
2\. 画面に従って設定する。（メールアドレスやパスワード、電話番号等）
# APIKeyを作成する
以下の手順でAPIKeyを取得します。

1\.作成したアカウントでOpenAIにログイン。
2\.右上にある「アカウント名」「View API keys」を順にクリックする。
3\. APIkeysをコピーしメモに残しておく。
# GASからSlackにメッセージを送信する
#### SlackAPI向けライブラリの読み込み
最初に作成したGASプロジェクトを開き、以下の手順でライブラリを読み込みます。

1\.「ライブラリのプラスマーク」をクリックする
2\.「スクリプトID」に「SlackAppのスクリプトID」をコピペして「検索」をクリックする
3\.「追加」をクリックする
SlackAppのスクリプトIDは以下です。

`1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq`

# スクリプトプロパティの設定
スクリプトプロパティを設定する前に、Slackを開き「App」に追加されているSlackBotsのメンバーIDを取得しておきます。

以下の手順で、スクリプトプロパティを設定します。

1\.「サイドバーの歯車マーク」をクリックする
2\.「スクリプトプロパティを追加」をクリックする
3\.「プロパティ」と「値」をそれぞれ設定する　※スクリプトプロパティ割当テーブル参照
4\.「括弧マーク」をクリックしてエディタ画面に戻る

|プロパティ|値|
|:--------|:-----------|
|slackBotToken|SlackBotsを作成したときに取得した「Bot User OAuth Token」|
|openApiKey|OpenAPIで取得した「APIKey」|
|slackBotId|SlackBotsの「メンバーID」|

※スクリプトプロパティ割当テーブル
# 再デプロイ
まず最初にデプロイしたコードを消し、以下のコードに上書きします。
```javascript
function doPost(e) {
  //受信データをパース
  const json = JSON.parse(e.postData.getDataAsString());
  //Challenge認証用
  if (json.type === 'url_verification') {
    return ContentService.createTextOutput(json.challenge);
  }
  //イベント再送回避
  //キャッシュに積まれていれば処理済
  //未処理の場合はキャッシュに積む（有効期間5m）
  const event_id = json.event_id;
  const cache = CacheService.getScriptCache();
  const isProcessed = cache.get(event_id);
  if (isProcessed)　return;
  cache.put(event_id, true, 601);
  //サブタイプが設定されたイベント
  if('subtype' in json.event) return;
  //ChatGPTBotが送信した場合
  //ChatGPTで応答メッセージを作成し、Slackに送信する
  const botId = PropertiesService.getScriptProperties().getProperty('slackBotId');
  if (json.event && json.event.user !== botId) {
    const channel = json.event.channel;
    const text = json.event.text;
    const message = requestChatGPT(text);
    sendSlack(channel, message);
  }
  return;
}
//SlackBotsを通してメッセージを送信する
function sendSlack(channel, message) {
  const slackToken = PropertiesService.getScriptProperties().getProperty('slackBotToken');
  const slackApp = SlackApp.create(slackToken);
  slackApp.postMessage(channel, message);
}
//ChatGPTにテキストを送信し、応答メッセージを取得する
function requestChatGPT(message) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('openApiKey');
  const apiUrl = 'https://api.openai.com/v1/completions';
  //リクエストデータの設定
  const headers = {
    'Authorization':'Bearer '+ apiKey,
    'Content-type': 'application/json'
  };
  const options = {
    'headers': headers,
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'text-davinci-003',
      'max_tokens' : 256,
      "temperature": 0,
      'prompt': message})
  };
  //リクエストを送信し、結果取得
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
  const resMessage = response.choices[0].text;
  return resMessage;
}
```
次の手順で再デプロイします。再デプロイの方法を間違えるとSlackBotsを作成するときに設定したURLと別のURLになり、動かなくなるので注意してください。

1\.「デプロイ」をクリックし「デプロイを管理」を選択する
2\.「鉛筆マーク」をクリックする
3\.「バージョンの三角マーク」をクリックし、「新バージョン」を選択する
4\.「デプロイ」をクリックする
5\. 警告が出るので「アクセスを承認」をクリックする
6\.「Allow」をクリックする
# 任意のチャンネルにSlackBotsを追加する
以下の手順で、任意のチャンネルにSlackBotsを追加します。

1\.「チャンネル名」をクリックする
2\.「インテグレーション」タブの「アプリを追加する」をクリックする
3\. 作成したアプリの「追加」をクリックする

以上で完了です。
# 動作確認
Slackでメンションをつけて質問を投げ、ちゃんと応答が返ってきたら完成です。
# 最後に
連携をする上で設定を全て完了してもSlackでChatGPTから返信がなく、その原因を見つけることに時間が掛かってしまいました。

動作しない原因は、OpenAIのAPIkeyを取得後に他の設定に日数を掛けてしまったことによるAPIkeyの無料利用期間の期限切れでした、、、

解決策としては、以下の2点があげられます。

* メールのアカウントを作り直す
* OpenAIで課金する

皆様も動作確認時に動かなければぜひAPIKeyの期限を確認してみてください。

ご覧いただきありがとうございました！