LoginSignup
2
0

More than 1 year has passed since last update.

Slackで特定のチャンネルへの投稿を自動でピン留めする

Last updated at Posted at 2022-11-03

やりたいこと

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を招待すれば動く。はず。

2
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0