LoginSignup
60
73

More than 5 years have passed since last update.

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

Posted at

概要

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);
60
73
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
73