前書き
エンジニアもすなる Qiita といふものを、私もしてみむとて、するなり。
という感じで、憧れの Qiita に初投稿です。
途中で出てくるコードは https://rubygems.org/gems/slack-api/ を使用して実行しています。
Slack の部屋の種類
Slack には public channel と private channel があり、部屋を作成する際に選ぶことができます。
作成した部屋を 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 のここから変更してみまして。
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 は一方通行で戻せないようです (登録画面に注意書きもありました)
皆様もどうかお気を付け下さい。