やりたいこと
Slackで特定のチャンネルに投稿されたメッセージを全てピン留めしたい。スレッドのメッセージはピン留めしたくない。
目的
Slackでタスク管理用にチャンネルを作成し、ピン留め→対応したらピン留めを外すという運用をしていた。
ピン留め忘れを防ぎ、予約送信したときでもピン留めできるようにしたい。
方法
メッセージの投稿イベントの購読→GAS→ピン留めのSlackAPIを叩く
SlackAppの作成
Appの作成自体はどこでも説明されてるので割愛します。
作成後、OAuth&Permissionsで、bot tokenにpins:writeの権限を追加する。
イベントの購読
Event Subscriptionsを開き、ONにする。
Subscribe to BOT Eventsで、message.channelsを選択する。
WSへのメッセージ投稿イベントを検知すると、Request URLにセットしたURLにPOSTリクエストが送られる。
URLはGASアプリをデプロイしたURLをセットする(後述)。
リクエストボディについては上記ドキュメント参照。
ピン留めするGASスクリプト作成
const doPost = (e) => {
const data = JSON.parse(e.postData.getDataAsString());
if (data.type === "url_verification") {
// リクエストURLの確認のためにchallengeを返す必要がある
return ContentService.createTextOutput(data.challenge);
}
if (data.event.thread_ts || data.event.subtype === 'message_deleted') {
// スレッドのメッセージまたはメッセージ削除の場合。
return;
}
const channel = data.event.channel;
if (channel === 'C0XXXXXX') {
// 特定のチャンネルへ投稿されたときにピン留めを実行
pinToChannel(channel, data.event.ts);
}
};
/**
* ピン留めする
*/
const pinToChannel = (channel, ts) => {
const payload = {
channel: channel,
timestamp: ts, // メッセージを特定するタイムスタンプ
};
const options = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + 'BOT userのアクセストークン',
},
payload: JSON.stringify(payload),
};
const url = 'https://slack.com/api/pins.add';
UrlFetchApp.fetch(url, options);
};
アクセストークンはOAuth&Permissionsからコピーする。直接コードに書かずスクリプトプロパティから参照しましょう。
デプロイして、ウェブアプリのURLをSlack AppのRequestURLに貼り付け。verifiedとなればOK。
あとはWSにインストール、チャンネルにAppを招待すれば動く。はず。