SlackのAPIでDMを送るには
なんか今月は2週間目くらいで、「旦那ー!だんなー!旦那のブログがもう100PV超えたでやんすよー!!」というはてなからの連絡が来て、これはもう僕の時代来ているなと。僕が提唱する、バールプログラミング a.k.a 動きゃあいいんじゃ動きゃあが市民権を得始めているなと、そう思ったんですよ。 なのでちょうど、マジふざけんなハマり案件があったので更新してみました。
なにかっつうと、SlackのAPI(chat.postMessage)でメッセージを送るっていうスーパー初歩的なやつについてなんですが、今回、botユーザー作って、そいつに個々人にDMを送らせたかったんですけど、全くうまくいかんのですよ。 今回GASでやっていたんですが、chat.postMessage使おうと思うと、以下のような感じになるですよ。
var messagePayload = { "token": token, //必要なスコープはbot・chat:write:user・chat:write:bot "channel":送り先のチャンネルID "text": "テスト" }; var messageOptions = { "method" : "post", "contentType": "application/x-www-form-urlencoded", "payload" : messagePayload }; var result = UrlFetchApp.fetch('https://slack.com/api/chat.postMessage', messageOptions);
一瞥してわかるくらい、打製石器ヘビーユーザーの我々にも優しい感じなのですが、「チャンネルのところに送り先のSlackユーザーID入れたらDM送れるでー」みたいなことどっかで見たから一生懸命入れて送るんですが、なぜかSlackbotとのDMにメッセージが入っちゃったんですね。 もうお前はお呼びじゃねえんだと。アイコンを好きに変えられない、訳わからん顔したお前とはできるだけ話したくねえんだと、俺は俺が作った可愛いbotと蜜月のDMを交わしてえんだとブチ切れですよ。 Slackユーザー名の書式かなーと思って、@つけてみたり、<>で囲んでみたり、display Name入れてみたりしても一向にうまく行かねえ。 もう英語記事行くしかねえなと思って検索してみたら、見つけましたよ。
要するに、DM送るときは、まず、im.open叩かないといけないらしい。 普通はチャンネル指定してバールを振り回すといい感じにしてくれるスラ子ちゃんでも、流石にプライベートエリアになると、ワンクッション入れないとよしなにしてくれない訳ですよ。か、可愛いじゃん……。
というわけで以下のように変えたら無事、可愛い我が子からDM来ましたよ。
var imPayload = { "token": token, //必要なスコープはbot・im:write "user": DM相手のSlackユーザーID(@とかはいらない), }; var imOptions ={ "method" : "post", "contentType": "application/x-www-form-urlencoded", "payload" : imPayload }; var messagePayload = { "token": token, //必要なスコープはbot・chat:write:user・chat:write:bot "channel":JSON.parse(UrlFetchApp.fetch('https://slack.com/api/im.open', imOptions)).channel.id, "text": "テスト" }; var messageOptions = { "method" : "post", "contentType": "application/x-www-form-urlencoded", "payload" : messagePayload }; var result = UrlFetchApp.fetch('https://slack.com/api/chat.postMessage', messageOptions);
これで3時間くらいハマったわ。もうこんな悲劇が繰り返されませんように!!!!