1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

slack bot x chatgpt x GAS

Last updated at Posted at 2023-03-20

備忘録向け。
botをメンションして使いたかったので、zapierじゃなくこちらでやってみた。

slack app作って、ポチポチする必要あり。

GASは下記

function doPost(e)
{
  // slack appsのEvent Subscriptionsのchallenge。同期する時に利用。
  var params = JSON.parse(e.postData.getDataAsString());
  if('challenge' in params)
  {
    return ContentService.createTextOutput(params.challenge);
  }

  // textを取得
  var textSlack = params.event.text.substr(0, params.event.text.length);

  // chatGPTに問い合わせ
  var resultStr = getChatGptMessage(textSlack);
 var contents = `${resultStr}`;

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : JSON.stringify(
      {
        "text" : contents,
        link_names: 1 // ユーザー名やリンクを変換してくれる
      }
    )
  };
  // slack連携
  // incoming webhookを入れる
  UrlFetchApp.fetch("https://hooks.slack.com/services/XXXXXX", options);
}

// ChatGPTのAPIを呼び出し応答を取得する
// openai api keyはGUIでスクリプトプロパティに入れておく
function getChatGptMessage(message) {
  var uri = 'https://api.openai.com/v1/chat/completions';
  const apiKey = PropertiesService.getScriptProperties().getProperty('openai_api_key');
  var headers = {
    'Authorization': 'Bearer ' + apiKey,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  var options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      "model": "gpt-3.5-turbo",
      "messages": [{ "role": "user", "content": message }]
    })
  };
  try {
      const response = UrlFetchApp.fetch(uri, options);
      var json=JSON.parse(response.getContentText());
      return json["choices"][0]["message"]["content"];
  } catch(e) {
    console.log('error');
  }
}

あと、上記のgasをデプロイしたら、発行されたリンクを、slack側の方で、「event subscription」でrequest urlに登録しておく。
あと、同じく「Subscribe to bot events」で、app_mentionを追加しておく。

ここまでで、botにメンションすると、その発言を読み取って、chatgptが返答を返してくれる。

Consとしては、Incoming webhookを設定する際に、このbotはどこに投稿するか、チャンネルを聞かれる(チャンネル権限的な)

botを好きなチャンネルにinvして、そこでも返す、みたいに、channel情報を送って、そこに返答を返すには、Bot User OAuth Tokenを発行してやる必要がありそう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?