まとめ
- chat.postMessageでチャンネルとしてユーザーIDを指定してAPIを叩くと良い
- 以前(2018年頃)にあったincoming webhookは手元では使用できなかった
- Bot Tokenを使った認証後APIを叩くやり方だとうまくいった
世間には星の数ほど「なにかを叩いてSlackにPostする」記事があるが、SlackのBot側が新しいものに切り替わっている影響で、記事を鵜呑みにするとうまくいかなくなっている、らしい(個人の感想です、実際には異なる場合があります)。
個人的にハマりポイントが多くしんどかったので、記事として残しておく。あくまで依然と今の差分を書いている記事なので、基本敵な部分(トークン発行したり、Botをワークスペースにインストールしたり)は以下URLを参考にすると良い。
以前まではIncoming WebhookでURLを叩く時にユーザー名(Slackでいうところの@以下の部分)を指定していたのだが、これが上手くいかなくなった。
結構いろいろ試したが原因不明だったり、私自身がワークスペースの管理者じゃなかったりして調査しきれなかった。おそらく、webhookをワークスペースに導入しただけでは権限がscopeが足りないか、あるいはDMの送り先が分からなくなっていたかのどちらかだと思う。
とりあえず、Webhookを使わずに以下Slack APIを使用することで解決はできた。
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になっていることもあるらしい。
以上、ハマりポイントだった。
どうしてもWebhookでやりたい人用の追加情報
別APIのテスター経由で、(たぶん)この権限が足りない、という情報がエラーで返ってきていた。これらの権限を付与してwebhookのURLを叩けば上手く動く、かもしれない
既にあった権限
incoming-webhook
chat:write
chat:write.customize
無いと言われた権限
channels:write
groups:write
mpim:write
im:write
本当じゃないかもしれない。試していないのはBotに権限与えようとするとBotの再導入が必要になって、それには管理者権限が必要だったため。自分は無かったので試さなかった。
関係無いけど参考になったページ
開発に際してちゃんとやる場合は以下を参考にするべし。
じゃあちゃんとしていないのかというと、ちゃんとしていない。急ぎで間に合わせなので。本当は良くない。ごめんなさい。