LoginSignup
9
4

More than 3 years have passed since last update.

slack botからメールアドレスを利用してDMを送りたい!

Posted at

この記事に書いてある事

  1. メールアドレスを利用して、slack botからDMを送る
  2. GASで実装
  3. ハマりポイント
  4. まとめ

1. メールアドレスを利用して、slack botからDMを送る

ゴール

image.png
testというbotの権限を持っているslack appからDMを送るようにしました。
DMを送る対象は、メールアドレスをスプレットシートで管理してます。

構成

1min check構成.png

2. GASで実装

処理の流れ

  1. spread sheetから対象のメールドレス一覧取得
  2. slack apiでslackのuser id取得(member idともいう)
    1. users.lookupByEmail
  3. slack apiでDMを送れる状態にする
    1. conversations.open
  4. slack apiでDM送信
    1. chat.postMessage

:point_up: サンプルコード

  1. spread sheetから対象のメールドレス一覧取得
function getRequiredMailList () {
  let member_list_sheet_id = $spread_sheet_id
  let sheet = SpreadsheetApp.openById(member_list_sheet_id).getSheetByName($シート名)
  var lastRow = sheet.getLastRow(); // Note: 空白の行は要らないから、入力のある行の最後の行を取得
  return sheet.getRange(1, 1, lastRow, 1).getValues().map(row => row[0]) //Note: 行, 列, 何行, option何列
}

2.slack apiでslackのuser id取得(member idともいう)

const token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');  // Note: 環境変数にTOKEN保存しておいてね
var userInfoUrl = 'https://slack.com/api/users.lookupByEmail?token=' + token + '&email=' + email + '&pretty=1'
const userId = JSON.parse(UrlFetchApp.fetch(userInfoUrl)).user.id

3.slack apiでDMを送れる状態にする

// Note: userIdは ☝️ 2 で取得したものを利用
const url = 'https://slack.com/api/conversations.open?token=' + token + '&users=' + userId + '&pretty=1'
const channel = JSON.parse(UrlFetchApp.fetch(url)).channel

4.slack apiでDM送信

const messageOptions = {
    "method" : "post",
    "contentType": "application/x-www-form-urlencoded",
    "payload" : {
      "token": token,
      "channel": channel.id, // Note: channelは ☝️ 3 で取得したものを利用 
      "text": "DMで送りたい内容はここに書くよ〜"
    }
  };
  var result = UrlFetchApp.fetch('https://slack.com/api/chat.postMessage', messageOptions);

:relaxed: :relaxed: :relaxed: :relaxed: 完成 :relaxed: :relaxed: :relaxed: :relaxed:

:exclamation: 3. ハマりポイント :exclamation:

botの権限系

何の権限付ければ良いの問題 :thinking:

今回の構成なら、とりあえずこれをつけておけばオケ :ok_hand: ごにょごにょしまくってたから、もしかしたら不要なのもあるかも。
スクリーンショット 2020-10-17 21.42.32.png

言われた権限付けても、変わらず同じエラーなんですけど問題 :rage:

:exclamation: :exclamation: :exclamation: Reinstall Appをする! :exclamation: :exclamation: :exclamation:
権限をいじったら、毎回Reinstall Appをしないと反映されないから超注意 :exclamation:
スクリーンショット 2020-10-17 21.35.27.png

(ポエム):point_down: ここら辺に赤文字で大きく、「権限変えたらReinstall Appしてね!!」って書いておいて欲しかった。(めっちゃハマった)
image.png

社員のmemberIdどうやって知るんだ問題

課題

DMを送るためには、slackのmember IDを知る必要があります。
@erikaadno とかのメンションとは別に、slackのアカウントがある人全員に割り振られてるIDのこと。
「View Full Profile」から飛んだ、これ :point_down:
スクリーンショット 2020-10-17 18.36.11.png

ソリューション

lookupByEmailというslack apiを使います。
画面上からだと、member idだけど、APIのresponseはuser id :v:

const token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN'); 
var userInfoUrl = 'https://slack.com/api/users.lookupByEmail?token=' + token + '&email=' + email + '&pretty=1'
const userId = JSON.parse(UrlFetchApp.fetch(userInfoUrl)).user.id

4. まとめ

  • 権限変えてもaccess deniedで続けるの謎だから、本当にreinstall Appをしないと反映されないよって開発してる全員が何回も目に留まるところに書いておいて欲しい。
  • slack apiはAPIドキュメントにtesterがあって直ぐに試せるので最高。
9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4