2段階でちょっと面倒！ボットからユーザにダイレクトメッセージを送る方法（Slack API編）

React、node.js、Google Cloud Platform (App Enigine)で[SORTFUL](https://sinceretech.app/ "SORTFUL")というチームビルディングゲームを作る際に出てきた疑問を、備忘録として記事にまとめています。

<h1>はじめに

SORTFULは参加者それぞれにダイレクトメッセージで「数字」を送るところから始まります。
![soortful1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/57718e8a-af03-0a99-bb7f-b98864c79504.png)

この「メールアドレス情報から、ダイレクトメッセージを送る」というのが、今回の目的です。
Webexとslackを使いたいので、以下のような感じになります。

Webex
![Webex6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/31a9aeb7-a2d3-07fa-d659-2d5ce4976b73.png)

slack
![slack8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/a17c5d38-d388-6c4c-efae-4a7c126500ea.png)

本記事はslackのapiについて書いていきます。
webex apiについては[こちら](https://qiita.com/sinceretechnologies/items/225e6bd7364448d48a7c "WebexAPIを使ってメッセージを送る")

<h1>APIを使うおおまかな流れ

1.Slack Appを作成する
2.権限を付与する
3.ワークスペースにインストールする
4.(3の時に生成されたトークン等の情報を使って)apiを叩く

<h1>手順

<h2>1.Slack Appを作成する

[slack API](https://api.slack.com/ "slack api")にページで、Your appsまたはCreate an appを選択すると、サインインを求められます。
slackのアカウントをお持ちでない方は、アカウントの作成をしてください。

![slack1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/d9a657d6-337f-1e27-a588-17a11641f17b.png)

サインインした後、slack apiにて、Create an appを選択すると、以下のようなポップアップが出ます。

![slack2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/d7f00f2a-2cae-5b7d-f03a-e6b4d7809077.png)

From scratchを選んで

![slack3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/47594676-8180-37d3-97d7-ee557765c3c2.png)

App NameにBotにつけたい名前をいれます。（後で変更できます。）


<h2>2.権限を付与する

今回は送り先のメールアドレスのみが分かっている状態で、ダイレクトメッセージを送ることが目的です。
これをslack apiでやろうとすると、以下2つのmethodが必要になります。
①メールアドレスからユーザ情報を取得する⇒[users.lookUpByEmail](https://api.slack.com/methods/users.lookupByEmail "lookUpByEmai")
②ユーザIDにダイレクトメッセージを送る⇒[chat.postMessage](https://api.slack.com/methods/chat.postMessage "postMessage")

<h3>①メールアドレスからユーザ情報を取得する

まずは[users.lookUpByEmail](https://api.slack.com/methods/users.lookupByEmail "lookUpByEmai")機能から見ていきましょう。
Required scopesを見ると、users:read.emailが必要と書いてあります。
これはslack apiのOAuth&PermissionsのScopeで設定できます。

![slack4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/9628196a-08ad-1f63-7369-ff970c64a344.png)

Add an OAuth Scopeで、users:read.emailを追加してください。
users:readを一緒に追加するように言われるので、それも一緒に。

<h3>②ユーザIDにダイレクトメッセージを送る

続いて[chat.postMessage](https://api.slack.com/methods/chat.postMessage "postMessage")も同じく見ていきましょう。
Required scopeがchat:writeになっているので、OAuth & Permissionsで追加します。

こんな感じになります。
![slack9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/250ca538-d0f2-6e52-ee5d-ab73c89e2dab.png)


<h2>3.ワークスペースにインストールする

次にWorkspaceにこのAppをインストールします。
Basic Informationの"Install to Workspace"ボタンでインストールできます。

![slack6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/b8e1f86f-af94-b90e-539b-6b0a6e8a3fef.png)

<h2>4.(3の時に生成されたトークン等の情報を使って)apiを叩く




[chat.postMessage](https://api.slack.com/methods/chat.postMessage "postMessage")、[users.lookUpByEmail](https://api.slack.com/methods/users.lookupByEmail "lookUpByEmai")それぞれのArgumentsによると、どちらにもtokenとあります。このtokenとは？となるのでOAuth & Permissionsのページに戻ってみるとできてます。

![slack7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388662/a050f271-830b-04b5-6603-205797138703.png)

Bot User OAuth Tokenをメモしておきましょう。


あとはnode.jsでslack apiにpostするのですが、今回は簡単なので@slack/web-apiパッケージを使っています。

```
  const { WebClient } = require('@slack/web-api');
```

```slackApi.js
async function slackApi(token, email, number, name) {
  // See: https://api.slack.com/methods/chat.postMessage
  const web = new WebClient(token);

 try {
  const res = await web.users.lookupByEmail({
    email: email,
   });
 }catch(e){
  console.log(res.error);
 }
  console.log("get user: ", res.user.id);

  try {
    const response = await web.chat.postMessage({
      channel: res.user.id,
      text: `Hello ${name}, \r\n please do not tell anyone... \r\n your number is ${number}!`,
    });
    if (response.ok) console.log(`The number sent successfully to ${name}`);
  } catch (error) {
    console.log(response.error);
  }
}
```

これでユーザ情報がゲットできたので、次はこのユーザIDを使って、ダイレクトメッセージを送ります。



<h1>まとめ

Slack APIの使い方
1.Slack Appを作成する
2.権限を付与する
3.ワークスペースにインストールする
4.(3の時に生成されたトークン等の情報を使って)apiを叩く

slack apiでダイレクトメッセージを送るには、以下の二つの機能が必要になります。
・[users.lookUpByEmail](https://api.slack.com/methods/users.lookupByEmail "lookUpByEmai")でユーザ情報からユーザIDを取得
・[chat.postMessage](https://api.slack.com/methods/chat.postMessage "postMessage")でユーザID宛にダイレクトメッセージを送信

slack apiは色々なことができるのですが、機能が多すぎて、調べるのに少し時間がかかりました。