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。
// ファイルの一番末尾に書き出してください.
CakePlugin::load('Slack',['bootstrap'=>true]);
<?php
namespace Slack;
// YOUR API ACCESS TOKEN
define(__NAMESPACE__.'\API_TOKEN','ここを自分のトークンに書き換えてね!');
<?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
を読み込むようにしてください。
CakePlugin::load('Slack',['bootstrap'=>true]);
では、Slack プラグインのほうの 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
を使う意味が無いんですけど(笑))
<?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 を実装した記事を終わろうと思います。
それではよきエンジニアライフを!