Quantcast
Viewing all articles
Browse latest Browse all 24

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

前書き

エンジニアもすなる Qiita といふものを、私もしてみむとて、するなり。
という感じで、憧れの Qiita に初投稿です。

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

Slack の部屋の種類

Slack には public channel と private channel があり、部屋を作成する際に選ぶことができます。
Image may be NSFW.
Clik here to view.
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 may be NSFW.
Clik here to view.
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 は一方通行で戻せないようです (登録画面に注意書きもありました)
皆様もどうかお気を付け下さい。


Viewing all articles
Browse latest Browse all 24

Trending Articles