#概要
SlackのWebhookを利用して、API経由でメッセージをポストする。
ささっとPHPで試したい方や、botを作りたい方向け。
ご参考になれば。
#1.Webhookの設定
こちらより、「Post to Channel」に投稿先チャネル名を入力して「Add Incoming WebHooks integration」をクリック。
生成されたWebhook URLをメモる。
#2.Webhookが正常に使えるか確認
下記コマンドで投稿できるか確認する。
URL部分には、1.で作成したWebhook URLを指定する。
$ curl -X POST "https://hooks.slack.com/services/XXX/XXX/XXX" -d 'payload={
"channel": "#general",
"username": "my_bot",
"text": "test",
"icon_emoji": ":ghost:"
}'
成功すれば、指定したチャネルにメッセージがポストされる。
#3.phpからメッセージをポストしてみる
クラス化してみた。
githubにも上げておきました。
こんな感じ。
SlackBotInfo.php
<?php
/**
* Slackへのポスト情報を担うクラス
*/
class SlackBotInfo
{
/** ポスト先の部屋 */
public $channel = '#general';
/** botのお名前 */
public $username = 'my_bot';
/** botのアイコン */
public $icon_emoji = ':ghost:';
/** ポストするメッセージ */
protected $message = '';
/** WebhookのURL */
protected $url = '';
/**
* コンストラクタ
*/
public function __construct($url = '', $message = '')
{
$this->set_url($url);
$this->set_message($message);
}
/**
* WebhookのURLを設定する
*/
public function set_url($url)
{
$this->url = $url;
}
/**
* ポストするメッセージを設定する
*/
public function set_message($message)
{
$this->message = $message;
}
/**
* Slackへのポスト情報を返す
*/
public function get_post_info()
{
return array(
'url' => $this->url,
'body' => array(
'payload' => json_encode(array(
'channel' => $this->channel,
'username' => $this->username,
'icon_emoji' => $this->icon_emoji,
'text' => $this->message,
)),
),
);
}
}
SlackBot.php
<?php
/**
* 指定されたInfoに基づき、Slackのチャネルにメッセージをポストするクラス
*/
class SlackBot
{
/**
* リクエスト用のオプションを設定
*/
protected function create_options($info)
{
return array(
CURLOPT_URL => $info['url'],
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $info['body'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
);
}
/**
* リクエストを実行
*/
protected function request($options)
{
$ch = curl_init();
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$result = substr($result, $header_size);
curl_close($ch);
return array(
'Header' => $header,
'Result' => $result,
);
}
/**
* メッセージをポストする
*/
public function post_message($info)
{
return $this->request($this->create_options($info->get_post_info()));
}
}
get_post_infoで全部返す、としてるところが少々乱暴ですがまあ良しw
#4.使い方
##4-1.下記のようなスクリプトを用意する
post2slack.php
<?php
include_once __DIR__.'/SlackBot.php';
include_once __DIR__.'/SlackBotInfo.php';
// 引数チェック
if ($argc < 2) {
exit('引数にポストしたいメッセージを指定してください');
}
$message = $argv[1];
// WebhookのURL
$url = 'https://hooks.slack.com/services/XXX/XXX/XXX';
// メッセージをポスト
$bot = new SlackBot();
print_r($bot->post_message(new SlackBotInfo($url, $message)));
##4-2.実行
$ php post2slack.php こんにちは
#5.補足
投稿先のルームなど、各種パラメータを変更したい場合は下記のように使ってください。
// ポスト情報を生成
$info = new SlacBotInfo($url, $message);
// こんな感じにパラメータを変更
$info->channel = ‘#random’;
// メッセージをポスト
$bod = new SlackBot();
$bot->post_message($info);