PEARのServices_Twitterで未定義のエンドポイントを利用する
この記事は賞味期限切れです。(更新から1年が経過しています)
この記事の情報は古くなっています。
Twitter APIのバージョンも上がり、Services_Twitterは現在メンテナンスされていない様です。
「Services_Twitter」は、簡単にTwitterAPIを利用する為のPEARパッケージです。
今回の記事は、このパッケージでサポートされていないエンドポイントを使う方法の備忘録です。
Services_Twitterで利用できない物
例えば、statuses/following_timelineや、statuses/media_timeline等、
公式のREST APIドキュメントに記載されていないものは、
初期状態のServices_Twitterでは使用する事ができません。
※公式でアナウンスされていない物を使うわけですから、使用は勿論自己責任になります。
Services_Twitterにエンドポイントを追加する方法
Services_Twitterは、XMLで使用できるエンドポイントを管理していて、
そこに定義されていない物を呼びだそうとすると例外を吐く作りになっています。
api.xmlの所在
エンドポイントの定義ファイルである「api.xml」は、
PEARのインストールディレクトリ内の
data/Services_Twitter/data/api.xml
に置いてあります。
これに
ただ、これを直接編集するのもちょっとアレだなぁと思い…
XMLを指定してエンドポイントを追加出来るように拡張してみる
自前のxmlファイルのパスを引数に突っ込んで、
未定義のエンドポイントを足せるようにServices_Twitterクラスを拡張してみます。
書いてみた物
category as $category) { $catName = (string)$category['name']; if( !is_array( $this->api[$catName] ) ){ $this->api[$catName] = array(); } foreach ($category->endpoint as $endpoint) { $this->api[$catName][(string)$endpoint['name']] = $endpoint; } } } }
うん、ものすごくたいした拡張ではないですね。
使い方は、addAPIメソッドにXMLへのパスを突っ込むだけ。
<?php
$foo = new MY_Services_twitter();
$foo->addAPI( "/the/path/to/your/api.xml" );
試しにエンドポイントを追加してみたXML
試しにfollowing_timelinとmedias_timelineを追加する為のXMLを記述してみます。
仕様は未公開のうえ、パラメータの試験とかはやってないので、
繰り返しますがご使用は自己責任で。
以下の例のパラメータは、公式のWebサイトで使われている物を
それっぽく適当に突っ込んでいます。
<api>
<category name="statuses">
<endpoint name="following_timeline" method="GET" auth_required="false">
<formats>xml,json,rss,atom</formats>
<param name="include_entities" type="boolean" required="false" />
<param name="include_available_feature" type="boolean" required="false" />
<param name="contributor_details" type="boolean" required="false" />
<param name="user_id" type="id_or_screenname" required="false" />
<param name="screen_name" type="id_or_screenname" required="false" />
</endpoint>
<endpoint name="media_timeline" method="GET" auth_required="false">
<formats>xml,json,rss,atom</formats>
<param name="offset" type="integer" required="false" />
<param name="count" type="integer" required="false" />
<param name="score" type="boolean" required="false" />
<param name="filter" type="boolean" required="false" />
<param name="include_entities" type="boolean" required="false" />
<param name="user_id" type="id_or_screenname" required="false" />
<param name="screen_name" type="id_or_screenname" required="false" />
</endpoint>
</category>
</api>
まとめ
Services_Twitterではエンドポイントへのアクセスを__callで実装していて、
目新しかったので参考になりました。
今度機会があったら使ってみよう。オーバーロード。
コメント