Posted at

PHPでSlackにメッセージをポストするクラスのサンプル

More than 3 years have passed since last update.


概要

SlackのWebhookを利用して、API経由でメッセージをポストする。

ささっとPHPで試したい方や、botを作りたい方向け。

ご参考になれば。


1.Webhookの設定

こちらより、「Post to Channel」に投稿先チャネル名を入力して「Add Incoming WebHooks integration」をクリック。

生成されたWebhook URLをメモる。

スクリーンショット 2016-02-18 21.32.33.png


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:"
}'

成功すれば、指定したチャネルにメッセージがポストされる。

スクリーンショット 2016-02-18 22.44.33.png


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 こんにちは

成功するとSlackのチャネルにメッセージがポストされる。

スクリーンショット 2016-02-18 22.37.03.png


5.補足

投稿先のルームなど、各種パラメータを変更したい場合は下記のように使ってください。

// ポスト情報を生成

$info = new SlacBotInfo($url, $message);
// こんな感じにパラメータを変更
$info->channel = ‘#random’;

// メッセージをポスト
$bod = new SlackBot();
$bot->post_message($info);