備忘録向け。
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を発行してやる必要がありそう。