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


#概要
SlackのWebhookを利用して、API経由でメッセージをポストする。
ささっとPHPで試したい方や、botを作りたい方向け。
ご参考になれば。

#1.Webhookの設定
[こちら](https://otajisan.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks)より、「Post to Channel」に投稿先チャネル名を入力して「Add Incoming WebHooks integration」をクリック。
生成されたWebhook URLをメモる。

![スクリーンショット 2016-02-18 21.32.33.png](https://qiita-image-store.s3.amazonaws.com/0/30307/c5cfb9f6-e3d9-6bf1-3228-8c036e3227c5.png "スクリーンショット 2016-02-18 21.32.33.png")

#2.Webhookが正常に使えるか確認

下記コマンドで投稿できるか確認する。
URL部分には、1.で作成したWebhook URLを指定する。

```bash
$ 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](https://qiita-image-store.s3.amazonaws.com/0/30307/7dbd30d3-bb2e-daaa-9054-61f8b38c3da0.png "スクリーンショット 2016-02-18 22.44.33.png")

#3.phpからメッセージをポストしてみる
クラス化してみた。
[github](https://github.com/otajisan/slackbot)にも上げておきました。
こんな感じ。

```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で全部返す、としてるところが少々乱暴ですがまあ良しｗ

#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.実行

```bash
$ php post2slack.php こんにちは
```

成功するとSlackのチャネルにメッセージがポストされる。
![スクリーンショット 2016-02-18 22.37.03.png](https://qiita-image-store.s3.amazonaws.com/0/30307/d6a18025-7e43-184b-904b-ce176b79c372.png "スクリーンショット 2016-02-18 22.37.03.png")

#5.補足

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

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

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