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を実行するとこの様になります。
