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

  • 38
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

概要

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);