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を利用することができます。
fukidashi

選択が完了したら、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:write:userが指定されているので、このScopeの許可をアプリケーション作成時に行っていないと使用することはできません。

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

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

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

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

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

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

実行すると送信先に設定したユーザへメッセージが送信されます。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改行コードを利用します。";