Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@mitarasidang

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

More than 1 year has passed since last update.

前書き

エンジニアもすなる 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 は一方通行で戻せないようです (登録画面に注意書きもありました)
皆様もどうかお気を付け下さい。

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?