Slackのチャンネルが乱立してて、どこで自分にメンション付きで依頼が来たのかわからなくなってしまうことがあったので、自分宛のメンションをまとめてTODOチャンネルに放り込むということをしてみようと思った。
作成フロー
1. slackのbotを作る
2. botにincoming webhooksを設定する
3. GASを準備する
4. botにパーミッション与える。Event Subscriptionを設定する。
5. 様子を見る(きっとtodoチャンネルに転送されてるはず)
準備するもの
- 転送したいSlackユーザのID
- 転送先のSlackチャンネル&そのチャンネルのID
- 転送先のSlackチャンネル用にSlackBot->incoming webhoos設定
- GAS
GAS側ソースコード
function doPost(e) {
var params = JSON.parse(e.postData.getDataAsString());
var response = {};
if(params.type == 'url_verification') {
response = {'challenge':params.challenge};
return ContentService.createTextOutput(response).setMimeType(ContentService.MimeType.JSON);
}
var url = 'https://hooks.slack.com/services/aaaaaa/aaaaaaa/aaaaaaaa'; //<- incoming webhook url
var text = params.event.text;
var userPattern = 'SLACKUSERID'; //<- Slackの自分のID
var ignoreChannel = 'CHANNELID' // <- 転送先のチャンネルID
if (params.event.channel != ignoreChannel && text.match(userPattern)) {
var params = {
method: 'post',
contentType: 'application/json',
payload: '{"text":"'+ text +'"}'
};
UrlFetchApp.fetch(url, params);
}
}
- urlにincoming webhook urlを投入
- userPatternにSlackの自分のID(ユーザ名じゃないので注意)
- ignoreChannelに転送先チャンネルのID(これ設定しないと永久ループしてすんごいことになる)
これをウェブアプリケーションとして導入。
Slack側
細かいことは省略。
欲しいのは
- bot本体
- incoming webhooks
- Event SubscriptionsのSubscribe to events on behalf of usersで
message.channels
のパーミッションを与える
多分これだけでいけるはず。(色々いじってみたので足りてない部分あるかもしれない)
というわけで
- botにチャンネル単位でパーミッションを与えるわけではなく、ワークスペースに対してパーミッションを与えるので、ちゃんとデータをフィルタリングしないと見たくもない内容が転送されることもあるかもしれない。。やっぱり大事な話はprivate channelにしないとどこでみられてるかわからないから怖いですね。
- 転送内容が上記だとテキストだけなので、チャンネル名とかそういうのも転送してやることでもっと良くなるかも。