seri::diary

日常

TwitterAPIの返り値の形式について

aburaham-twitteroauth.phpの一部を書き換えて
GET系メソッドで値を取得する時の返り値のオブジェクトの型が変わっていたのでメモ。


毎度毎度お世話になっているトメさんのBot作成説明ページを参照し、

HTTPレスポンスコードを取得できるようにtwitteroauth.phpの197行目から始まる
"http()関数を変更した。

※この関数はHTTPリクエストをcurlを使って作成しリクエスト結果をそのまま返す


before:

return $response;

after:

return (object)array("Body"=>$response,"Code"=>$this->http_code);


単に結果を返すのではなく、"Body"要素にプロパティにレスポンス内容を、
"Code"要素にレスポンスコード(200とか404とかの)を入れた配列を作り、
かつそれをObjectにキャストして返すように変更した。

この結果、以下のようなコードを実行すると当然エラーになるようになった。
・・が、恥ずかしいことに自分で改造しといてしばらく原因に気がつかなかった。

※トメさんのこちらの解説ページを参考にさせて頂いております
※丸パクリとも言う(ぉ

<?php

〜途中省略〜

//最新のTLを50件取得
$req = $to->OAuthRequest("https://twitter.com/statuses/home_timeline.xml","GET",
                          array("count"=>"50")
                        );

//①取得したTLをXMLオブジェクトとして格納
$xml = simplexml_load_string($req);

//②以下、XMLのstatusの数(TLの数)の分だけforeachループを回す
foreach($xml->status as $status)
{
        $status_id   = $status->id;
        $text        = $status->text;
        $user_id     = $status->user->id;
        $screen_name = $status->user->screen_name;
        $name        = $status->user->name;
        $image_url   = $status->user->profile_image_url;

//③TLの内容を画面に出力
echo "<p><a href=\"http://twitter.com/".$screen_name."/status/".$status_id."\">
     <img src=\"" . $image_url. "\" width=\"35\" height=\"35\"></a><b>"
      .$screen_name." / ".$name."</b> <br />\n".$text."</p>\n";
}

?>

上記の流れを含むプログラムを実行してみたら

Warning: simplexml_load_string() expects parameter 1 to be string, object given in /home/seri/php/study/getTL.php on line 55

なんていうエラーメッセージが出て、丁度simplexml_load_string()を使う①でエラーになる。
まぁ実際には②でも不正引数でエラーになるんだけど。


エラー内容としてはどちらも「あなたの指定した引数はおかしいわよ、不正よ。」
と言っている訳です。


で、var_dumpで$reqの中身を見てみた結果がこれ


object(stdClass)#6 (2) {
["Body"]=>
string(143826)
"


Sat Oct 23 00:42:37 +0000 2010

銀杏くせぇ
<a href="http://twitter.com/" rel="nofollow">Twitter for iPhone</a>
false
false




false

(省略)
["Code"]=>
int(200)
}

"Body"と"Code"の2つのオブジェクトが含まれたstdClassというオブジェクトが
Requetの結果として返ってきている。理由は上記の通り。


twitteroauth.phpの改造はBot作成のためにやったものだが、
この影響で他のtwitteroauth.phpを使っているプログラムも改修が必要になった。

以下のように直す。

before:

$xml = simplexml_load_string($req);

after:

$xml = simplexml_load_string($req->Body);

これで元通り直接xmlにアクセスできる。
stdClassというのはtwitterAPIが標準で返すオブジェクト名で、
json形式で結果を取得するときもこれが使われるらしい。

今のところ、先日作ったこまっつぃーのtweet結果も
今回作ったTLの取得も全部XML形式で受け取るようにしていたので知らなかった。


twitterAPI,XML,jsonといったキーワードについてはまだまだ勉強することが沢山ありそうだ。