8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ニジボックスAdvent Calendar 2015

Day 14

Slack API with CakePHP

Last updated at Posted at 2015-12-14

CakePHP で Slack の WebAPI クライアント作ってみた

ここ。

完全に業務の外の時間でやったので、なかなか時間が取れず色々気が回ってません。
本当ならこれにあわせて CakePHP Api Docs を利用してドキュメントを生成したり、テストを用意したり、Travis で CI 回したりもしていたんですが…

実は公式の CakePHP Api Docs には不思議な挙動をする箇所があり、それに気づいて色々やろうとしてたら、本筋から脱線して時間が取れなくなりました。

Slack API with CakePHP

これは Slack 上の Web API と呼ばれるものを実装し、CakePHP のプラグインとして提供しています。
対象は CakePHP 2.x のみで、Cake3 に対応するのはまた別の機会に行い、公開する予定です。

使い方

通常の CakePHP のプラグインと何ら変わりは有りません。
プラグインや、そのプラグインが持ってる Component についての Howto は 公式 Doc を見てもらうとか、DebugKit の導入を見てもらって参考にするとかしてください。

調べればいくらでも出てきますので、ggrks。


APP/Config/bootstrap.php
// ファイルの一番末尾に書き出してください.
CakePlugin::load('Slack',['bootstrap'=>true]);
APP/Plugin/Slack/Config/bootstrap.php
<?php
namespace Slack;

// YOUR API ACCESS TOKEN
define(__NAMESPACE__.'\API_TOKEN','ここを自分のトークンに書き換えてね!');
App/Controller/SamplesController.php
<?php
App::uses('AppController', 'Controller');

/**
 * Slack API プラグインのサンプル用コントローラ.
 */
class SamplesController extends AppController
{
    public $component = ['Slack.Chat'];

    public function index()
    {
        $channel_id = 'C01234567';
        $post_result = $this->Chat->post($channel_id, 'hola!');
        debug( $post_result );
    }
}

ツ、ツンデレじゃないんだからね!
分かんなくなると困ると思ったから、全部書いてあげたんだからn


さて、上記の通りでやれば問題ありませんが、一部引っかかりそうなところもありましたので掲載しておこうと思います。

注意点:プラグイン読み込み時、オプションで 'bootstrap'=>true を付けないとめんどくさい

まず、プラグインの読み込み時は必ずプラグイン側の bootstrap.php を読み込むようにしてください。

APP/Config/bootstrap.php
CakePlugin::load('Slack',['bootstrap'=>true]);

では、Slack プラグインのほうの bootstrap.php では何をしているのかというと、これも先ほど記載したように

APP/Plugin/Slack/Config/bootstrap.php
define(__NAMESPACE__.'\API_TOKEN','xoxb-define-your-token');

Slack\API_TOKEN を定義しているだけです。
基本的にすべての API method は必要とされる場合はこの Slack\API_TOKEN で指定された token を利用して Slack Web API に接続します。
なので、ここに API 利用者 (もしくは Bot) の token を設定するといちいちメソッド呼び出し時にオプションで指定する必要がなくなって便利です。

捕捉: token を動的に変更したい場合

もし Slack\API_TOKEN で自分のトークンを指定しない場合は、毎回各コンポーネントの呼び出しの際に以下のように token を引数で指定する必要があります。
逆に言えば、 bootstrap.php で指定した token は、メソッド呼び出し時に動的に変更(というより上書き)できます。

特にソフトウェア側で WebAPI の token複数 使い分ける場合はこの方法が必要になりますね。
(複数の bot で AI を使って自動的に会話学習させる場合とか? いちいち Slack を使う意味が無いんですけど(笑))

App/Controller/SamplesController.php
<?php
App::uses('AppController', 'Controller');

class SamplesController extends AppController
{
    public $component = ['Slack.Chat'];

    public function index()
    {
        $post_result = $this->Chat->post('C01234567', 'hola!', [ChatComponent::OPTION_AS_USER=>true, ChatComponent::OPTION_TOKEN=>'xoxb-0000000000-aaaaaaaaaaaaaaaaaaaaaaaa']
    }
}

長ったらしいですね(笑

そのうちオプションの部分もクラス化して、ディスクリプタクラスを用意しようかな、とも考えています。
今の指定方法はクソースレベルです。実は定数なんてただの文字列なので、無理やり定数使う必要もありません。間に合わせです。ごめんなさい。

一先ずこれにて CakePHP で Slack Web API を実装した記事を終わろうと思います。
それではよきエンジニアライフを!

8
8
0

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
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?