Edited at
SlackDay 16

public channel を private group にした場合の落とし穴


前書き

エンジニアもすなる Qiita といふものを、私もしてみむとて、するなり。

という感じで、憧れの Qiita に初投稿です。

途中で出てくるコードは https://rubygems.org/gems/slack-api/ を使用して実行しています。


Slack の部屋の種類

Slack には public channel と private channel があり、部屋を作成する際に選ぶことができます。

image.png

作成した部屋を API から取得してみます。

public と private で取得方法が変わります。

public の場合は channels.list です。

https://api.slack.com/methods/channels.list

{

"ok": true,
"channels": [
{
"id": "C0G9QF9GW",
"name": "random",
"is_channel": true,
"created": 1449709280,
"creator": "U0G9QF9C6",
"is_archived": false,
"is_general": false,
"name_normalized": "random",
"is_shared": false,
"is_org_shared": false,
"is_member": true,
"is_private": false,
"is_mpim": false,
"members": [
"U0G9QF9C6",
"U0G9WFXNZ"
],
"topic": {
"value": "Other stuff",
"creator": "U0G9QF9C6",
"last_set": 1449709352
},
"purpose": {
"value": "A place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber you'd prefer to keep out of more focused work-related channels.",
"creator": "",
"last_set": 0
},
"previous_names": [],
"num_members": 2
}
]
}

private の場合は groups.list になります。(作成する時には private channel と表記してるクセに!)

https://api.slack.com/methods/groups.list

{

"ok": true,
"groups": [
{
"id": "G024BE91L",
"name": "secretplans",
"created": 1360782804,
"creator": "U024BE7LH",
"is_archived": false,
"members": [
"U024BE7LH"
],
"topic": {
"value": "Secret plans on hold",
"creator": "U024BE7LV",
"last_set": 1369677212
},
"purpose": {
"value": "Discuss secret plans that no-one else should know",
"creator": "U024BE7LH",
"last_set": 1360782804
}
}
]
}

id はどうやら、public channel の場合は C からスタートし、private group の場合は G からスタートするようですね。

(今回は関係ありませんが、 user id も U からスタートするようです)


本題

Slack には public channel を private group へと後から変更する機能があります。

さて、これにより変換されてしまったチャンネルの ID は果たして C スタートのままなのか、 G スタートに置き換えられるのか、試してみることにしました。

まずは slack のここから変更してみまして。

image.png

groups.list を叩いてみると

Slack.client.groups_list

=> {"ok"=>true, "groups"=>[]}

?!!

private group 内に存在しません。

念の為 channel.list を見ても、存在していないようです。

Slack.client.channels_list

=> {"ok"=>true,
"channels"=>
[{"id"=>"C2W9TBV8W",
"name"=>"general",
...省略...
"num_members"=>1},
{"id"=>"C2W8A2RNF",
"name"=>"random",
...省略...
"num_members"=>1}]}

部屋の ID は URL からも調べることができるので、メッセージのリンクを取得して調べてみると、C スタートのようでした。

部屋の ID が分かれば他の API も叩けるので、いくつか試して見ました。

https://api.slack.com/methods/groups.info

見つからず

Slack.client.groups_info(channel: "CEV6FGT6G")

=> {"ok"=>false, "error"=>"channel_not_found"}

https://api.slack.com/methods/groups.history

見つからず

Slack.client.groups_history(channel: "CEV6FGT6G")

=> {"ok"=>false, "error"=>"channel_not_found"}

https://api.slack.com/methods/groups.archive

true で返ってきます、が、実際には archive されていません。(この記事内で一番ヤバい挙動)

Slack.client.groups_archive(channel: "CEV6FGT6G")

=> {"ok"=>true}

https://api.slack.com/methods/groups.unarchive

archive されていない状態での unarchive では、 channel_not_found ではなく not_archived

Slack.client.groups_unarchive(channel: "CEV6FGT6G")

=> {"ok"=>false, "error"=>"not_archived"}

archive された状態での unarchive では、 true で返ってきますが実際には unarchive されていません。

Slack.client.groups_unarchive(channel: "CEV6FGT6G")

=> {"ok"=>true}

https://api.slack.com/methods/chat.postMessage

メッセージの投稿は普通に通りました。

Slack.chat_postMessage(text: "test", channel: "CEV6FGT6G")

=> {"ok"=>true, "channel"=>"CEV6FGT6G", "ts"=>"1545028789.000600", "message"=>{"type"=>"message", "subtype"=>"bot_message", "text"=>"test", "ts"=>"1545028789.000600", "username"=>"Slack API Tester", "bot_id"=>"BEWCY01E3"}}


private 化したチャンネルを public に戻せば正常な状態に戻ってくれないかなと思ったのですが、残念ながら public => private は一方通行で戻せないようです (登録画面に注意書きもありました)

皆様もどうかお気を付け下さい。