こいつ…(とりあえず)動くぞっ!

あわよくばハッカーになりたい。あと3000年生きたい。ふふふーふ.jpで打製石器を作りまくっています。バールプログラミングを提唱しています。

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入れてみたりしても一向にうまく行かねえ。 もう英語記事行くしかねえなと思って検索してみたら、見つけましたよ。

github.com

要するに、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時間くらいハマったわ。もうこんな悲劇が繰り返されませんように!!!!