摘み入れ地点

得た知見を書きためていく場所です。ソシャゲ、自動化、データを見るのが好きです。Amazonアソシエイト、各種アフィリエイトサービスを使用しています。

BotでSlackの特定ユーザーにDMを送るときにつまずいた話

まとめ

  • chat.postMessageでチャンネルとしてユーザーIDを指定してAPIを叩くと良い
  • 以前(2018年頃)にあったincoming webhookは手元では使用できなかった
  • Bot Tokenを使った認証後APIを叩くやり方だとうまくいった

 

世間には星の数ほど「なにかを叩いてSlackにPostする」記事があるが、SlackのBot側が新しいものに切り替わっている影響で、記事を鵜呑みにするとうまくいかなくなっている、らしい(個人の感想です、実際には異なる場合があります)。

個人的にハマりポイントが多くしんどかったので、記事として残しておく。あくまで依然と今の差分を書いている記事なので、基本敵な部分(トークン発行したり、Botワークスペースにインストールしたり)は以下URLを参考にすると良い。

dev.classmethod.jp

 

以前まではIncoming WebhookでURLを叩く時にユーザー名(Slackでいうところの@以下の部分)を指定していたのだが、これが上手くいかなくなった。

結構いろいろ試したが原因不明だったり、私自身がワークスペースの管理者じゃなかったりして調査しきれなかった。おそらく、webhookをワークスペースに導入しただけでは権限がscopeが足りないか、あるいはDMの送り先が分からなくなっていたかのどちらかだと思う。

 

とりあえず、Webhookを使わずに以下Slack APIを使用することで解決はできた。

api.slack.com

 

APIで指定するchannelがミソで、この指定はSlackのメンバーID(User IDとも)を使用する必要がある。メンバーIDの確認は以下URLを見ると良い。

scheduling.help.receptionist.jp

どうやらこれまでSlackの内部では、ユーザー名(@なんたら)→メンバーID(UXXXXXXXX)→メンバーのDMチャンネルID(DXXXXXXXX)という変換がうまいこといっていたらしいのだが、この一番最初のユーザー名→メンバーIDの変換部分がうまくいかなくなっている模様。仕方が無いので上記手順に従って自前で指定するか、あるいは都度取得するしかない。

 

 

また、いろいろ記事を探すと「メンバーID(英語はなぜかUser ID)はUで始まります」とか書いてあるけど、ワークスペースがEnterpriseの場合は頭文字がWになっていることもあるらしい。

api.slack.com

 

以上、ハマりポイントだった。

 

どうしてもWebhookでやりたい人用の追加情報

APIのテスター経由で、(たぶん)この権限が足りない、という情報がエラーで返ってきていた。これらの権限を付与してwebhookのURLを叩けば上手く動く、かもしれない

既にあった権限

incoming-webhook

chat:write

chat:write.customize

 

無いと言われた権限

channels:write

groups:write

mpim:write

im:write

本当じゃないかもしれない。試していないのはBotに権限与えようとするとBotの再導入が必要になって、それには管理者権限が必要だったため。自分は無かったので試さなかった。

 

関係無いけど参考になったページ

開発に際してちゃんとやる場合は以下を参考にするべし。

qiita.com

じゃあちゃんとしていないのかというと、ちゃんとしていない。急ぎで間に合わせなので。本当は良くない。ごめんなさい。