【Slack】チャンネル名の変更に対応する(カスタムインテグレーションのIncoming Webhookの場合)

# はじめに

今回取り扱うのは、カスタムインテグレーションのIncoming Webhookに関してです。

下記のSlack App内の機能としてのIncoming Webhooksの方ではなく・・・

<img width="806" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/172dc5c1-faa7-fe82-371b-a27a851871a1.png">

現在は非推奨となっている古い方式である、カスタムインテグレーションのIncoming Webhookの話となります(以下、旧Incoming Webhookとします)。

<img width="996" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/e18cc117-374d-fd29-131f-d8ee74b7fade.png">

# 旧Incoming Webhookにおいて投稿先チャンネルはどのように決まるか

旧Incoming Webhookでは、以下のように設定画面で投稿先のチャンネルを指定します。

<img width="870" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/be6f01f0-e0f1-777a-7f07-93fa116913b9.png">

ただし、Webhook URLへPOSTするデータの方でもチャンネルを指定することはできて、そうした場合はそこで指定したチャンネルにメッセージが投稿されます。

例えば、設定画面で投稿先チャンネルが、

- `#sandbox_XXX...`

と設定されていたとしても、実際にPOSTするデータの側で

```python
import json
import requests


def main():
    requests.post(
        url='https://hooks.slack.com/services/XXX...',
        data=json.dumps(
            {
                'channel': '#dev_sandbox_XXX...',
                'username': 'bot',
                'text': 'POSTするデータの `channel` で、投稿先チャンネルが決まるよ',
                'icon_emoji': ':ghost',
            }
        )
    )


if __name__ == '__main__':
    main()

```

のように、`channel`に`#dev_sandbox_XXX...`が指定されていたら、そちらにメッセージが投稿されます。

<img width="454" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/e4a781e8-d7e7-d765-954e-ffc24dd44e6e.png">


このようにPOSTデータを作る側で投稿先チャンネルをハンドリングして、Slackを運用しているケースも多いのではと思います。

ちなみにですが、POSTデータ側で指定するチャンネル名は先頭に`#`が無くても構いません。

# チャンネル名の変更に対応する

Slack全社導入などの理由を背景に、既存のチャンネル名を変更する必要が生じることがあるかと思います。例えば、既存チャンネル名の先頭に各部署を表す名称を入れるなど。

そういった状況において、前述のケースのようにPOSTデータ側で投稿先チャンネルを指定していると、

- Slack側の実際のチャンネル名
- POSTデータ作成側で指定するチャンネル名

を同期を取って変更しなければならない気がします。

もちろん、

「そもそもPOSTデータ作成側でのチャンネル名指定をやめて、旧Incoming Webhook設定画面上の投稿先チャンネルを使う運用にすれば良いのでは？そうすれば、Slack側の実際のチャンネル名を変更した際に、旧Incoming Webhook設定画面上の投稿先チャンネル名も自動で追随するはず。」

```python
def main():
    requests.post(
        url='https://hooks.slack.com/services/XXX...',
        data=json.dumps(
            {
                # 'channel': 'dev_sandbox_XXX...',
                'username': 'bot',
                'text': 'POSTするデータの `channel` が無い場合は、旧Incoming Webhook設定画面上の投稿先チャンネルに投稿するよ',
                'icon_emoji': ':ghost',
            }
        )
    )
```

といった対応方法もあるかと思います。

<img width="685" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/d4cd0bc3-8ad0-5c6a-7987-9b265b469f54.png">

ただし、ひとつのIncoming Webhook URLを通して複数のチャンネルに投稿するような使い方をしていた場合には、そうもいきません。

# チャンネルIDも指定できる

前置きが長くなってしまったのですが、**POSTデータの`channel`にはチャンネル名だけでなく、チャンネルIDを指定することもできます**。

```python
def main():
    requests.post(
        url='https://hooks.slack.com/services/XXX...',
        data=json.dumps(
            {
                'channel': 'Cxxxxxxxx',
                'username': 'bot',
                'text': 'POSTするデータの `channel` にはチャンネルIDを指定することもできるよ',
                'icon_emoji': ':ghost',
            }
        )
    )
```

<img width="519" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/46d0f5d7-ce3d-d23f-fdbe-ad5ce0d86836.png">


チャンネル名が変更されてもチャンネルIDは不変です。

ですので、**POSTデータ作成側でいったんチャンネルIDを指定するようにさえしておけば、後は好きなタイミングでSlack側のチャンネル名を変更することができます**。

チャンネルIDを確認する手段はいくつかありますが、手っ取り早いのはそのチャンネルをブラウザで開いた時のURLを見る方法です。Cから始まる9桁の英数字がチャンネルIDです。

- `https://app.slack.com/client/Txxxxxxxx/Cxxxxxxxx`

他には、Slack APIの`channels.list`を使うことで、ワークスペースの全てのチャンネル情報を取得できるので、そこからチャンネルIDを確認することもできます。

- [channels.listのテストツール](https://api.slack.com/methods/channels.list/test)

```json:channels.listの結果
{
    "ok": true,
    "channels": [
        {
            "id": "Cxxxxxxxx",
            "name": "dev_sandbox_XXX...",
            "is_channel": true,
// 以下略
```

# 最後に

今回はカスタムインテグレーションのIncoming Webhookとチャンネル名変更に関する話でしたが、**新方式のIncoming WebhooksではPOSTデータ側で投稿先チャンネルをハンドリングすることができなくなっています**。

- [slackのIncoming webhookが新しくなっていたのでまとめてみた - Qiita](https://qiita.com/kshibata101/items/0e13c420080a993c5d16)

新方式のIncoming Webhooksへ移行済みであれば、今回の記事のようにチャンネル名変更に頭を悩ませることは無さそうです。