質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

GASからSlackのダイレクトメッセージを送りたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,353

SystemAjisai

score 156

 前提・実現したいこと

GoogleAppsScriptを使ってSlackBotを作成しています。
やりたいのは、

  1. どこかのチャンネルでボットに呼びかける
  2. 呼びかけられたチャンネルに挨拶を返す
  3. その後呼びかけた人に今日の予定をダイレクトメッセージで送信する

という内容です。

 発生している問題・エラーメッセージ

1,2は成功していますが、3のところで呼びかけた本人ではなく、
slackbotにメッセージが通知されてしまいます。
これを呼びかけた本人に通知してほしいです。

イメージ説明

実装は、着信Webフックの設定ページ「セットアップ手順」の「チャンネルに上書きする」の

着信 Web フックにはデフォルトのチャンネルがありますが、JSONペイロードで上書きすることができます。パブリックチャンネルは "channel": "#other-channel"、ダイレクトメッセージは "channel": "@username" で指定できます。

を参照して作ったのにちゃんと動いてくれず、どうしていいかわからない状態です。

 該当のソースコード

ネットで検索したらよく出てくるGoogleAppsScriptのSlackBotライブラリは使用してません。
Appディレクトリから追加した着信Webフック(Incoming Webhooks)と発信Webフック(Outgoing Webhooks)を使って実装しています。

function doPost(e){
  var url =  PropertiesService.getScriptProperties().getProperty('SLACK_POST_URL');
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
      "payload" : JSON.stringify({
        text: "今日の予定",
        channel: "@"+e.parameter.user_name
      })
    };

  UrlFetchApp.fetch(url, options);
  return null
}

 試したこと

■チャンネル表記を色々変えてみる
以下パターンも試してみました。

channelに渡すもの 結果
"@" + e.parameter.user_name slackbotに通知される
"@" + e.parameter.user_id slackbotに通知される
"<@" + e.parameter.user_name + ">" 送信エラー
"<@" + e.parameter.user_id + ">" 送信エラー
"#" + e.parameter.user_id 送信エラー
"#" + e.parameter.user_name 送信エラー
encodeURIComponent("@" + e.parameter.user_name) 送信エラー
encodeURIComponent("@" + e.parameter.user_id) 送信エラー

固定で私のユーザ名、ユーザIDも試しましたが、slackbotに通知されてしまいました。

■自作のSlackAPI経由で通知してみる
着信Webフックではなく自分でSlaskAPIを作って、IncomingWebhooksを設定して試してみました。
こちらの方法では設定したユーザにダイレクトメッセージが発行されましたが、
Webhook URLがユーザ毎で変わってしまうので切り替えられませんでした。

■デフォルトチャンネルを自分のダイレクトメッセージにしてみる
もしかして外部からの通知は全部slackbotになるのかと、
試しに着信Webフックのデフォルトチャンネルを自分のダイレクトメッセージ宛てしてみました。
やりたいこと通り、私にダイレクトメッセージが届きました。

 補足情報(FW/ツールのバージョンなど)

使用言語:GoogleAppsScript
使用APP:発信Webフック、着信Webフック

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

多分やりたいようにできています。
ダイレクトメッセージチャンネル(チャンネルではないですが、メッセージそのものと区別するため、こう呼びます)の仕様というか、意味を誤解していませんか?

あなた自身でログインしたときダイレクトメッセージ欄にあるスラックボットは、スラックボット⇔あなたのやりとりです。
仮にボットユーザでログインできたとしたら、ボットのあなたの名前のところに投稿内容が見えるはずです。

普通のユーザ間で考えると、鈴木さんのダイレクトメッセージ欄にある田中さんのところは、田中さんの画面では鈴木さんと書いてある欄に書き込まれた内容が表示されます。

あなたが目にするあなた自身のダイレクトメッセージチャンネル、あるいは鈴木さんが目にするダイレクトメッセージチャンネルは、自分から自分に送った、他の人には一切見えない欄です。

それでも自分の名前のところに送りたければ、宛先だけではなく、送信者を偽装して、あるユーザからそのユーザに送ったようなデータを作る必要があります(できるかどうかはわかりません)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/04 13:16

    ご回答ありがとうございます。
    人間同士のやりとりだと確かにそうですね。。。
    本文「試してみたこと」の、
    ・自作のSlackAPP経由で通知してみる
    ・デフォルトチャンネルを自分のダイレクトメッセージにしてみる
    で記載の通り、上記2つの方法ではslackbotではなく自分の名前の所に通知が上がった(自分が送ったようになった)ので、そっちが正しいのかと思ってました。
    私もそれの方が通知がまとまって見やすいと感じたもので…。
    初期のチャンネルを自分のダイレクトメッセージにすれば自分のところに上がるけど、チャンネル上書きで送るとslackbotになるという挙動がモヤモヤしますが、あきらめることにします。。。
    ありがとうございました。

    キャンセル

checkベストアンサー

0

ダイレクトメッセージで送りたい場合について、

私も、channelに指定してやりたかったんですが結局できるのかできないのか分かりませんでした。

改めてドキュメントの方を見ると、
https://api.slack.com/incoming-webhooks
この項目3の最後の方に↓こうあり、シングルユーザー用のURLが作れるようです。

That URL is your shiny new Incoming Webhook, one that's specific to a single user, and a single channel. We've kind of run out of cookies, but nice work anyway! Let's see how you can actually use that webhook to post a message.

そのユーザー用のWebhook URLに送信すればダイレクトメッセージが送れました。
その際channelが設定されていた場合はchannelの方に届くようです。
結局WebAPIで行う場合にはユーザーごとのWebhook URLが必要なのかなと思いました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/04 13:51

    回答ありがとうございます。
    やっぱり個別のURLになるのですね…。
    自分のDMのとこに全部まとめたかったんですが、残念です。
    着信 Web フックの設定画面のチャンネルを自分のダイレクトメッセージに設定すればできるのだから、チャンネル上書きでも何かやればできるハズ…!という思いが拭えないですが、ひとまずのところは諦めることにします。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる