PHPからSlackに投稿する方法

PHPからSlackに投稿出来るものなのか気になって調べてみたので、備忘録を兼ねて記事にしました。

Webhook URLの取得

Add Apps to Slackにログイン

Add Apps to Slack」にアクセスし、右上にあるメニューの「Sign in」から投稿したいSlackのワークスペースにログインします。

ワークスペースの指定

PHPからの投稿先となるワークスペースのSlack URLを入力します。

管理者IDでログイン

ワークスペースを作成したIDでログインを行います。

ログイン後の状態

ログインが完了すると右上にワークスペース名が表示されます。

Incoming WebHooksからWebHooks URLを取得

Incoming WebHooksを検索

トップページ画面の少し下がった所に検索フォームがあるので、「Incoming WebHooks」を入力します。
入力後、候補リストが表示されるのでクリックします。

投稿先のチャンネルを指定

「Add Configuration」ボタンをクリックします。

セレクトボックスから投稿先となるチャンネルを指定します。当記事では「#general」を指定しています。
指定後、すぐ下にある「Add Incoming WebHooks integration」ボタンをクリックします。

Webhook URLの保存(コピー)

画面中央くらいにある「Webhook URL」項目の赤枠で囲んでいるURLが、Slackの連動に必要なURLとなりますので、コピーします。
Slackサイト側で行う作業はここまでです。

PHPからSlackに投稿

基本的なソースコード

以下のコードになります。
4行目にコピーしたWebhook URLを貼り付けてください。

<?php

// Webhook URL
$url = "https://hooks.slack.com/services/xxxxxxxxxx";

// メッセージ
$message = array(
    "username"   => "ユーザー名",
    "icon_emoji" => ":slack:",
    "text"       => "PHPからSlackに投稿。"
);

// メッセージをjson化
$message_json = json_encode($message);

// payloadの値としてURLエンコード
$message_post = "payload=".urlencode($message_json);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message_post);
curl_exec($ch);
curl_close($ch);

PHPを実行するとSlack側に以下の様に投稿されます。
上記7行目にある$messageの配列で、「username」に指定した文字列がユーザー名として、「icon_emoji」が投稿者のアイコンとして、「text」がメッセージとして投稿されています。

改行を含めた投稿

先程のソースコードでは改行は対応されていません。改行を含めたい場合は、$message配列の「text」を「attachments」に差し替えて行います。
サンプルは以下となります。10行目~14行目が変わっています。

<?php

// Webhook URL
$url = "https://hooks.slack.com/services/xxxxxxxxxx";

// メッセージ
$message = array(
    "username"   => "ユーザー名",
    "icon_emoji" => ":slack:",
    "attachments" => array(
        array(
            "text" => "こんにちは。\nPHPからSlackに投稿。"
        )
    )
);

// メッセージをjson化
$message_json = json_encode($message);

// payloadの値としてURLエンコード
$message_post = "payload=".urlencode($message_json);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message_post);
curl_exec($ch);
curl_close($ch);

PHPを実行するとこの様になります(メッセージ2行目~3行目)。

アイコンの変更について

$message配列の「icon_emoji」に入れる文字列が何処から来ているかというと、Slack側の絵文字リストの下の部分に記載されています。

試しにアイコンを笑顔のアイコンに変更してみます。
赤枠内の2行目「:grinning:」が$meesage配列の「icon_emoji」に入れる文字列になります。

<?php

// Webhook URL
$url = "https://hooks.slack.com/services/xxxxxxxxxx;

// メッセージ
$message = array(
    "username"   => "ユーザー名",
    "icon_emoji" => ":grinning:",
    "attachments" => array(
        array(
            "text" => "こんにちは。\nPHPからSlackに投稿。"
        )
    )
);

// メッセージをjson化
$message_json = json_encode($message);

// payloadの値としてURLエンコード
$message_post = "payload=".urlencode($message_json);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message_post);
curl_exec($ch);
curl_close($ch);

PHPを実行するとこの様になります。