強欲で謙虚なツボツボ

趣味の読書の書の方

slackチャットボットをGASで作る

概要

slackでメンションをつけたやり取りをボットと交わすことを目標にする。

やることは大きく二つで、slackのAppを作る、GASでWebアプリを作って公開。
処理の流れとしては、Appがチャンネルを監視してメンションがあればGASを呼び出す。GASには返信内容を作成してslackに送信するスクリプトを記述する。

完成図はこんな感じ

f:id:taopo:20200612162223p:plain



 

 

Slack Appを作成

Create New App

https://api.slack.com/apps

ここでAppを作成して管理する
「Create New App」から任意のApp名とボットを使用するslackチャンネルを選択するとAppが作成される。
ここではslack_botという名前で作成した。

f:id:taopo:20200612162050p:plain

 

App Home

まずは、slackチャンネル内でのbotの名前(Display Name, Default Name)を設定する。

f:id:taopo:20200612162152p:plain

 

Oauth & Permissions

次に、Appの権限のスコープを設定する。
今回はメンションを使用したやり取りなので、「app_mentions:read」「chat:write.customize」「chat:write」を選択。
これにより、@slack_botとメンションがついたメッセージの取得とメッセージ送信の権限がAppに与えられる。
そして、左ナビゲーションのInstall Appから作成したAppを自身のslackのワークスペースにインストールする。この時にBot User OAuth Tokenが得られる。

f:id:taopo:20200612162304p:plain

 

GASを作成

GoogleDriveからGoogleAppsScript(GAS)を作成する。

f:id:taopo:20200612162403p:plain

 

GASにSlack Appを追加

まず、GASにslackのライブラリを追加する。

「リソース」-> 「ライブラリ」で表示されたダイアログのAdd LibraryにM3W5Ut3Q39AaIwLquryEPMwV62A3znfOO「1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq」(2022/02/25 現在)を入力し、SlackAppを追加。

f:id:taopo:20200612162340p:plain

 

GASを作成

/*
/*
 * slackToken: VarificationToken
 * slackBotToken: BotUserOathAccessToken
 */
var slackToken    = '****';
var slackBotToken = '****';
var botUserName = 'bot';
var botUserIcon = ':slack:';

function doPost(e) {
  
  var req = JSON.parse(e.postData.getDataAsString());
  
  if (req.token !== slackToken) return null;
  
  /*
   * slackから認証のためにchallengeというパラメータが送られてくるので、
   * そのパラメータをそのまま返却することで認証が行われる。
   */
  if (req.type === "url_verification") {
    var payload = {
      challenge: req.challenge
    };    
    // challengeを返す
    var res = ContentService.createTextOutput();
    res.setMimeType(ContentService.MimeType.JSON);
    res.setContent(JSON.stringify(payload));
    return res;
  }
  
  var text = 'Hello'
  
  var options = {
    method: 'POST',
    payload: {
      token: slackBotToken,
      username: botUserName,
      icon_emoji: botUserIcon,
      channel: req.event.channel,
      text: text
    }
  };
  
  UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", options);
  
}

AppからはdoPostが呼び出され、引数のeにはメッセージの内容などが送られます。
認証はAppから送られてくるchallengeというパラメータをそのまま返却することで行われる。

VerificationTokenはサイドバーのBasicInformationに書かれています。
BotUserOathAccessTokenについては後述。

 

GASを公開

AppがGASを呼び出せるようにWebアプリとして公開する。
「公開」->「Webアプリケーションとして導入」

Project version: new
Execute the app as: 自身のgmail
Who has access to the app: Anyone even anonymous

設定するとURLが表示されるのでメモしておく。(Appから呼び出すのに必要)

 

AppとGASを連携

slackのチャンネルを監視し、メンションがあった時にGASを呼び出すように結びつける。

Slack AppのEvent Subscriptionsを設定

slackチャンネルを監視するためのSubscriptを設定する。
ここで、チャンネル内でメンションがあった時にGASを呼び出すという設定を行う。

Enable Events: ON
Request URL: 先程メモしておいたGASのURL

Request URLを入力すると認証が開始され、challengeが正しく返っているとVerifiedと表示される。
※ 上手くいかない場合は、GASを修正して再度公開を行い、retryを押す。

Subscribe to bot events でapp_mentionを選択。

これで、メンション時にGASへメッセージ内容をPOSTするという結びつけが完了。

f:id:taopo:20200612162922p:plain



 

 

slackのチャンネルにAppを追加

サイドバーの「Install App」よりslackにインストールする。
この時表示されるTokenがBotUserOathAccessTokenに使う。
すると、アプリのslackを開くとチャンネルに作成したslack_botをアプリとして追加できるようになっている。
アプリを追加したら完成。

f:id:taopo:20200612163018p:plain

f:id:taopo:20200612163045p:plain

f:id:taopo:20200612163106p:plain

 


まとめ

思ったよりも簡単というか、やってることが面白そうな割に調べたり学んだりすることが少なかったのが驚きだった。

あとは、GASのメッセージを作成する部分を肉付けしていけばいろんな用途のbotが作成できる。