Help us understand the problem. What is going on with this article?

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);
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした