はじめに

前回の記事で書いたChatWorkのボットをPHPでも書いてみました。
ただ、そのままだと面白くないので、少し改良したものも最後に載せたいと思います。

ソースコード

<?php
class ChatworkApi
{
    const CHATWORK_API_BASE_URI = 'https://api.chatwork.com/v2';
    private $api_token;
    private $http_header = [];

    /**
     * @param string $api_token
     */
    public function __construct($api_token)
    {
        $this->api_token = $api_token;
        $this->http_header = ['X-ChatWorkToken: ' . $this->api_token];
    }

    /**
     * チャットグループの一覧を取得します
     */
    public function search_rooms()
    {
        $chatwork_api_search_rooms_url = self::CHATWORK_API_BASE_URI . '/rooms';

        $ch = $this->curl_common_init($chatwork_api_search_rooms_url);
        $response = json_decode(curl_exec($ch));
        curl_close($ch);
        var_dump($response);
    }

    /**
     * 対象のチャットグループにチャットを投げます
     * @param integer $room_id
     * @param string  $message
     */
    public function chat($room_id, $message)
    {
        $chatwork_api_post_message_url = self::CHATWORK_API_BASE_URI . "/rooms/{$room_id}/messages";
        $data = ['body' => $message];

        $ch = $this->curl_common_init($chatwork_api_post_message_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $response = json_decode(curl_exec($ch));
        curl_close($ch);
        var_dump($response);
    }

    /**
     * curlコマンドの初期化を行います
     * @param  string $api_url
     * @return object curlセッション
     */
    private function curl_common_init($api_url)
    {
        $curl_options = [CURLOPT_URL => $api_url,
                         CURLOPT_HTTPHEADER => $this->http_header,
                         CURLOPT_RETURNTRANSFER => true];

        $ch = curl_init();
        curl_setopt_array($ch, $curl_options);
        return $ch;
    }
}

定数や初期化など

APIのURIやAPIトークン、のちのち使用するHTTPヘッダーを定数、プロパティにセットしていきます。
外部からアクセスされても面倒なので、privateにしておきます。

class ChatworkApi
{
    const CHATWORK_API_BASE_URI = 'https://api.chatwork.com/v2';
    private $api_token;
    private $http_header = [];

    /**
     * @param string $api_token
     */
    public function __construct($api_token)
    {
        $this->api_token = $api_token;
        $this->http_header = ['X-ChatWorkToken: ' . $this->api_token];
    }

    // 省略

}

curlで叩く

APIを叩くときなどに使用するcurlですが、PHPにはcurlを使用するための関数が用意されているので、そちらを使用します。
基本的なcurlの使用法

初期化用のプライベートメソッドを用意して、各メソッドで使用できるようにします。

    /**
     * curlコマンドの初期化を行います
     * @param  string $api_url
     * @return object curlセッション
     */
    private function curl_common_init($api_url)
    {
        $curl_options = [CURLOPT_URL => $api_url,
                         CURLOPT_HTTPHEADER => $this->http_header,
                         CURLOPT_RETURNTRANSFER => true];

        $ch = curl_init();
        curl_setopt_array($ch, $curl_options);
        return $ch;
    }

CURLOPT_RETURNTRANSFERオプションをtrueにしておくと結果が見やすくなります。
使用したcurl用の関数のリファレンスはこちらになります。

チャットルームを探す

    /**
     * チャットグループの一覧を取得します
     */
    public function search_rooms()
    {
        $chatwork_api_search_rooms_url = self::CHATWORK_API_BASE_URI . '/rooms';

        $ch = $this->curl_common_init($chatwork_api_search_rooms_url);
        $response = json_decode(curl_exec($ch));
        curl_close($ch);
        var_dump($response);
    }

結果はRubyのときと同じようにJSON形式に変換しておきます。

対象のチャットルームにチャットを投げる

チャットを投げるためにはPOSTの必要があるので、追加でcurl_setoptをします。

    /**
     * 対象のチャットグループにチャットを投げます
     * @param integer $room_id
     * @param string  $message
     */
    public function chat($room_id, $message)
    {
        $chatwork_api_post_message_url = self::CHATWORK_API_BASE_URI . "/rooms/{$room_id}/messages";
        $data = ['body' => $message];

        $ch = $this->curl_common_init($chatwork_api_post_message_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

        $response = json_decode(curl_exec($ch));
        curl_close($ch);
        var_dump($response);
    }

実際に試してみる

Rubyと同様、PHPにもインタラクティブモードがあります。
今回はそちらで試します。

$ php -a
Interactive shell

php > require_once('/path/to/chatwork_api.php');
php > $chatwork_api = new ChatworkApi('APIトークン');
php > $chatwork_api->search_rooms();
# ここでチャット一覧が出力されます。今回はマイチャットにチャットを投げてみます。
php > $chatwork_api->chat(ルームID, 'メッセージ');

ちょっとPHPのプログラムを試すくらいなら、こちらの方が楽ですね。

さいごに

ルームIDを探すのが面倒なので、ルーム名からルームIDを探すメソッドを追加してみました。
これでもっと簡単につぶやけますね!

<?php
class ChatworkApi
{
    const CHATWORK_API_BASE_URI = 'https://api.chatwork.com/v2';
    private $api_token;
    private $http_header = [];
    private $room_ids = [];
    private $target_room_id;

    /**
     * @param string $api_token
     */
    public function __construct($api_token)
    {
        $this->api_token = $api_token;
        $this->http_header = ['X-ChatWorkToken: ' . $this->api_token];
    }

    /**
     * 対象のルームIDを取得する
     * @param string $room_name
     */
    public function set_target_room_id($room_name)
    {
        $this->set_room_ids();
        $this->target_room_id = $this->room_ids[$room_name];
    }

    /**
     * 対象のチャットグループにチャットを投げます
     * @param integer $room_id
     * @param string  $message
     */
    public function chat($message)
    {
        if (empty($this->target_room_id)) {
            echo '対象のチャットルームIDがセットされていません。';
            return false;
        }

        $chatwork_api_post_message_url = self::CHATWORK_API_BASE_URI;
        $chatwork_api_post_message_url .= "/rooms/{$this->target_room_id}/messages";
        $data = ['body' => $message];

        $ch = $this->curl_common_init($chatwork_api_post_message_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

        $response = json_decode(curl_exec($ch));
        curl_close($ch);
        var_dump($response);
    }

    /**
     * 取得したチャットグループをセットする
     */
    private function set_room_ids()
    {
        $json_get_my_rooms = $this->curl_search_rooms();
        foreach ($json_get_my_rooms as $room) {
            $this->room_ids[$room->name] = $room->room_id;
        }
    }

    /**
     * チャットグループを取得します
     * @return json $response
     */
    private function curl_search_rooms()
    {
        $chatwork_api_search_rooms_url = self::CHATWORK_API_BASE_URI . '/rooms';

        $ch = $this->curl_common_init($chatwork_api_search_rooms_url);
        $response = json_decode(curl_exec($ch));
        curl_close($ch);
        return $response;
    }

    /**
     * curlコマンドの初期化を行います
     * @param  string $api_url
     * @return object curlセッション
     */
    private function curl_common_init($api_url)
    {
        $curl_options = [CURLOPT_URL => $api_url,
                         CURLOPT_HTTPHEADER => $this->http_header,
                         CURLOPT_RETURNTRANSFER => true];

        $ch = curl_init();
        curl_setopt_array($ch, $curl_options);
        return $ch;
    }
}
Shere
  • はてなブログ
  • Twitter
  • Facebook
PHPでもChatWorkのボットを作成してみた

Writer

  • Name

    Naoki

  • Position

    RubyやPHPが書きたい雑用

  • Profile

    最近、(自称)PHPerから(自称)Rubyistに移行しようと考えている雑用です。Rubyのオブジェクト 指向はすごい分かりやすいので好きになりました。また、メソッド名に?が使えるのも良いですよね!