Slack Web APIを使ってアカウントに直接メッセージを送る

2021年2月23日更新
slack-web-api-php-curl

Slack Web API を利用して、指定した slack のユーザアカウントに向けてシステムからメッセージを送信する方法についての解説です。メッセージを送信する部分は PHP の cURL を使っています。

本文書では、cURL をある程度理解している方を対象に記載しています。cURL について理解が不足している方は、まず下記の記事に目を通してみてください。

目次

Slack Web API とは

Slack Web API を利用すると Slack ワークスペースのユーザの情報へのアクセスやユーザ、チャネルへ自作のプログラムから直接メッセージを送信することができます。

Slack Web API のアプリケーション作成

Slack Web API を使用するためには、Slack 上でアプリケーションを作成する必要があります。アプリケーションの作成を行わなければ Slack Web API を使用することができません。

Slack api サイトにアクセスします。Slack に WEB 経由でログインする必要があるため Slack のユーザ ID とパスワードが必要になります。

slack apiトップページ

slack api トップページ

真ん中にある Start Building ボタンをクリックします。

アプリケーション名の入力画面

アプリケーション名の入力画面

Slack アプリケーションの作成画面(Create a Slack App )が表示されるので App Name には任意の名前、Development Slack Workspace には所属している Slack の Workspace を選択してください。複数の Workspace に所属している場合は、Slack Web API を使用したい Workspace を選択してください。入力が完了したら、Create App ボタンをクリックしてください。

workplaceの選択

workplace の選択

英語のメニューが並んでいますが、Permissions を選択してください。

Permissionを選択する

Permission を選択する

Permission 画面では、アプリケーションで使用する機能の範囲や IP によるアクセス制限など許可に関する設定を行います。画面の下部にある Scopes に移動します。

Oauth & Permisson画面

Oauth & Permisson 画面

ここでは Slack Web API で利用したい機能の選択を行います。行いたい処理は API メソッドとして分類されており、Scope を通してどの API を使用するのかを選択することができます。選択することでその Scope の使用の許可が与えられ利用することが可能になります。

scopeの選択画面

scope の選択画面

ユーザとしてメッセージを送りたい場合は、Send messages as user を選択します。Scope は複数選択することが可能です。

Scope を使って Slack が公開しているすべての機能のうちで使用できる範囲を決めることができます。機能の制限せずにすべて一括で設定したいと思うかもしれませんが、アカウント情報など重要なデータへのアクセスもできるため使用範囲を限定して設定するほうが安全に WEB API を利用することができます。

選択が完了したら、Save Changes ボタンをクリックしてください。Scope が未設定の時はクリックができなかった上部の Install App to Workspace がクリック可能になります。ワークスペースにアプリケーションをインストールすることで作成したアプリケーションが使用可能となります。

ワークスページにアプリのインストール

ワークスページにアプリのインストール

インストールボタンをクリックすると使用するための設定が完了します。

インストール確認メッセージ

インストール確認メッセージ

インストール完了後、OAuth Access Token が画面に表示されます。この Token を使用すれば自分の Slack Workplace に登録されたユーザへだれでもメッセージをおくることができるので、この Token の情報を漏らさないように管理する必要があります。

Token情報

Token 情報

PHP プログラムの作成

slack 上でのアプリケーションの作成も完了し、Token が取得できたので cURL と PHP の知識があればここから作業は特別難しいことはありませんので、気楽に読み進めてください。

ユーザにメッセージを送信するためのプログラムは下記の通りです。

slack からの情報で設定する箇所は 3 点あり、あとは cURL の設定なので Slack に限定される設定ではありません。ここでは slack に関連する 3 点のみ説明を行っていきます。3 点は(1),(2),(3)です。

$headers = [
    'Authorization: Bearer xoxp-XXXXXXXXXXXXXXXXXXXXXX', //(1)
    'Content-Type: application/json;charset=utf-8'
];

$url = "https://slack.com/api/chat.postMessage"; //(2)

//(3)
$post_fields = [
    "channel" => "@XXXXXX",
    "text" => "初めてのSlack Web APIからのメッセージ",
    "as_user" => true
];

$options = [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode($post_fields)
];

$ch = curl_init();

curl_setopt_array($ch, $options);

$result = curl_exec($ch);

curl_close($ch);

(1)については、Slack api 上でアプリケーションインストールを行った後に表示されていた Token を指定します。ここでは XXXXX になっていますが、表示されていた Token を入れてください。

(2)についてはアプリケーション作成時に選択した chat:write:user の Scope に関連しており、chat:write:user を使用する際にはこの URL を利用する必要があります。chat.postMessage についての使用方法についてはSlack のマニュアルに記載されているためその内容を元に(3)の post_fields を設定していきます。

slack post.messageのマニュアル

slack post.message のマニュアル

Required scope(必要とされる Scope)に chat

:user が指定されているので、この Scope の許可をアプリケーション作成時に行っていないと使用することはできません。

それぞれの選択した Scope により(2)で設定する URL が変わります。

マニュアルの Arguments 以下に記載されている項目が(3)の post_fields で設定できる箇所になります。ここでは 3 つのパラメータを設定しています。

channel はどこに送信するか設定する箇所で@+ユーザ名を入れるとユーザに直接メッセージを送信することができます。

as_user パラメーターはデフォルトでは false に設定されており、true に設定しなければ自分のアカウントではなく bot からメッセージ送信になります。

text には送りたいメッセージを入れます。

channel にチャネル名を入れるとチャネルにメッセージを送信することができます。ユーザに向けて送る場合は必ず@をつけてください。つけないと送信できません。また各アカウントにはメンバー ID というものが Slack が自動で付与していますが、メンバー ID を使用しても送信できませんでした。

実行すると送信先に設定したユーザへメッセージが送信されます。as_user を true に設定しているので送信元は、slack 上でアプリケーションの作成を行ったユーザになります。

戻り値について

実行のレスポンスは下記のように JSON 文字列で戻されてきます。成功した場合は ok に true、失敗した場合は ok に false が入るので、エラーの識別は ok で行うことができます。

{
  "ok": true,
  "channel": "XXXXXX",
  "ts": "1561437471.000200",
  "message": {
    "bot_id": "BKV4TCTQD",
    "type": "message",
    "text": "\u521d\u3081\u3066\u306eSlack Web API\u304b\u3089\u306e\u30e1\u30c3\u30bb\u30fc\u30b8",
    "user": "XXXXXXX",
    "ts": "1561437471.000200"
  }
}

指定した Token に誤りがある場合は、ok は false で error には invalid_auth が設定されて戻されます。

"{"ok":false,"error":"invalid_auth"}"

Slack メッセージの改行について

メッセージの改行を行いたい場合は改行コード\n をつけると実行可能です。ダブルクオテーションを使ってください。シングルクォーテーションの場合は改行が行われません。

$text = "改行を行いたい場合は\n改行コードを利用します。";

カテゴリー一覧