Closed13

全チャンネルに招待してくれるSlackBotを作りたい

Daigo WakabayashiDaigo Wakabayashi

実装したいもの

  • 特定のメッセージを送信すると、自動的にワークスペース内の全チャンネルに招待してくれるSlackBot

なぜ実装するのか

  • Slackと仲良くなりたい
  • Flutter大学のチャンネル多いし、作られたことに気づいてない場合も多いから
  • 「全チャンネル参加」→「不必要なチャンネルから退出」ができた方が便利

どう実装するのか

  • これが参考になりそう

https://qiita.com/divideby_zero/items/bec36b15004751ead0d9#2google-apps-script-でhookを受け取れるようにしておく

Slackとどれくらい仲良しか

  • WebHookはちょっとだけ触ったことがある(Firestoreに特定のドキュメント追加が行われた際、Slackチャンネルに通知する、みたいな)(でもほぼコピペで実装したので理解は浅い)
Daigo WakabayashiDaigo Wakabayashi

0.ダミーのユーザー準備

  • やらなくてもいいけどやったほうが良いとのことなので、以下のようなユーザーを新しくワークスペースに入れました(参考記事が鳩にしていたので、今回はインコ?オウム?にした、かわいい)
Daigo WakabayashiDaigo Wakabayashi

1.LegacyTokenの準備

LegacyTokenどこで作るんだ問題

  • 参考記事では ここで LegacyToken を作成できる、とのことでしたが、生成する場所が見つかりませんでした

  • どうやらLegacy Token はAppを生成しないと作れなくなったみたい

  • なので、こちらの記事を参考にして、一旦Appを生成してからTokenを作ることに

1. Appを作る

https://api.slack.com/apps を開いて、Create an App をタップし、

入力して「Create App」

2. Appの設定

Add features and functionality から Permission を選択

Scopes の UserTokenScopes から admin を選択

一番上のOAuth Tokens & Redirect URLs から Install App to Workspace

許可する

xoxp- で始まる Legacy token が取得できました。

Daigo WakabayashiDaigo Wakabayashi

2.Google Apps Script でhookを受け取れるようにしておく

Google Driveから「 新規」→「その他」→「Google Apps Script(以降:GAS)」

エディタが開きました。

名前が「無題のプロジェクト」になっていたので、参考記事に習って「Slack Invite Bot」にしておきました

コードはとりあえず以下にしておきました

function doPost(e){

}

では、一旦この何もしないアプリを公開します。
「デプロイ」→「新しいデプロイ」→「ウェブアプリ」を選択する

表示されるダイアログ上
次のユーザーとしてアプリケーションを実行は「自分」
アプリケーションにアクセスできるユーザー は 「全員」
にして、「デプロイ」をクリックします。

次画面で表示されるウェブアプリケーションのURLも後で使うので大事に取っておきます
以降:HOOK_URL

Daigo WakabayashiDaigo Wakabayashi

3.hookの準備

次はSlack側の作業です。
特定文字列から始まるメッセージを検知して、指定したURLへHookしてくれる便利な 通知APP があるので、まずこれをworkspaceにインストールします。

画面右下の「アプリを追加する」をクリック

「hook」と検索し、「Outgoing WebHooks」を選択


Slackに追加

インテグレーションの追加

次画面「インテグレーションの設定」にて

  • 対象チャンネル
  • 引き金となる言葉
  • URL
    を設定します。

対象チャンネルは絞りたい場合は指定してください。今回は全チャンネルにしました。
引き金となる言葉 は暴発されても困るので、一般的に使用しないであろう語り出しである必要があります。
Flutter大学では「@manager よろしく」が指定されています。

URLには 2. で取得した HOOK_URLを。 その他は別に設定しなくても大丈夫です。

Daigo WakabayashiDaigo Wakabayashi

4.GAS から チャンネルに発言する

ライブラリ検索しても出てこない問題

また、GASに戻ってきます。
slackのAPIを操作するのに便利なライブラリが既にあるので、それを導入します。 ライブラリのキーは
「M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO」
になります。

このキーを入力しても出てこない。なぜ?

ランタイムのダウングレードが必要

この記事によると、2020年2月6日から、GASのランタイム(よくわからない)がV8とやらに変更したらしい
参考記事の執筆時点は2019年なので、前のランタイムにダウングレードする必要があるみたい
とここで、右上に「以前のエディタを使用」というボタンを発見。

参考記事はほとんど前のエディタで説明されているので変更しておきました

こちらを参考に、
「実行」→「Chrome V8を搭載した新しいApps Scriptランタイムを無効にする」

これでランタイムのダウングレードが完了しました

ライブラリの導入

ツールバーから「リソース」→「ライブラリ」を選択し、
ライブラリを追加の枠にライブラリキーを入力して、「追加」→ バージョンを最新に指定 →「保存」

そして、doPostの中身が空っぽなので、飛んできたメッセージをオウム返しするBOTに(とりあえず)します。

var legacyToken = "xoxp-";//ここに、1.で取得したLEGACY_TOKENをいれてね
var postParam = {username:"manage",icon_emoji:":bird:"}; //Botユーザー名とアイコンを指定
function doPost(e){
  var slackApp = SlackApp.create(legacyToken);
  var text = e.parameter.text;
  return slackApp.postMessage(e.parameter.channel_id, "へぇー。" + text + "なんですねー",postParam);
}

var legacyToken = ""; の””の中には 1.で取得したLEGACY_TOKENを書きます。

そして、GASの仕様なんですが、ソースコードを修正しても、再度公開作業しない限り外部に反映されません。
また、バージョンを「新規作成」(または「new」)にする必要があります。

「詳細」をタップして許可しましょう

「更新」ができたら新しいURLをOutgoing WebHook に貼り付けて「保存(忘れがちなので注意)」

Daigo WakabayashiDaigo Wakabayashi

走ってるけど反応がない問題

  • 走ってはいるけど、オウム返ししてくれない。。なぜ。。。

  1. コード自体は弄る必要はなさそう
  2. HOOK_URLも間違っていない
  3. 設定も保存した
  4. GASもnewで公開した
  • LegacyTokenが怪しい気がする。

Legacy Token は2020年5月以降は新規作成できないだとお!?
https://note.com/kawa1228/n/nb0811ed44792

Daigo WakabayashiDaigo Wakabayashi

Slack APIにおける2種類のトークン

Slack アプリに使用できるトークンには、user(xoxp) トークンと bot(xoxb) トークンの 2 種類があります。ユーザートークンを使用すると、ユーザーがアプリをインストールまたは認証した後で、ユーザーに代わって API メソッドを呼び出すことができます。単一のワークスペースに複数のユーザートークンが存在する場合があります。ボットトークンはボットユーザーに紐づいており、ワークスペースの誰かがアプリをインストールするとそのワークスペースに 1 回付与されます。どのユーザーがインストールを実行しても、アプリで使用されるボットトークンは同じものになります。実際にはほとんどのアプリで使用されるトークンの種別はユーザートークンではなく、ボットトークンになるでしょう。

参考:https://slack.dev/bolt-js/ja-jp/tutorial/getting-started#:~:text=Slack アプリに使用できる,呼び出すことができます。

Bot User Token

  • xoxbから始まる
  • ボットユーザーと結びついているため、単一のトークンになる
  • こっちの方ができること多いから、迷ったらこっちを使おう

User Token

  • xoxpから始まる
  • ユーザーと結びついているため、単一のワークスペースに複数のユーザートークンが存在する場合がある
このスクラップは2021/05/06にクローズされました