Twitterのタグ構造が変わったので
またまたTwitterのタグ構造が昨夜変更されたので、俺俺Twitterリーダを更新。
今回のタグの変更は、今まではdivタグで囲まれていた各ユーザの個々の発言のエリアがTableになり、tbタグそしてその中にdivタグといった構造になりました。
本当はそこだけで修正が終わるのですが、今回はなぜか文字化けしまくり・・・。
Twitterのサイトの文字コードの変更はなし。
なぜだ・・・と思っていたらどうやら、DOMDocumentを使うと文字が化けてしまう状態。
確かに、DOMDocumentは日本語はUTF-8しか読むことが出来ない。
でも、今まではきちんと読みこめていた。
ふと、DOMDocumentはmetaタグに
<meta http-equiv="content-type" content="text/html; charset=UTF-8″/>
が指定されている必要がある事を思い出した。
で、Twitterのサイトを確認すると・・・。
<meta content="text/html; charset => utf-8" http-equiv="Content-Type" />
ん?
charset => utf-8
=>が=じゃないからこのタグを無視して日本語が化けてるのでは・・・。
ということで、DOMDocument::loadHTMLを呼び出す前に取得したコードにたいして、このタグを置換。
preg_replace("/(<meta content=\"text\/html; charset =)> utf-8([^>]*)/", "\\1 utf-8\\2", $request->getResponseBody());
この処理を追加したところ、上手くいった。
うーん。DOMDocumentが自動判別とか引数で文字コード指定出来るようにならないかな。
ということで修正したコード。
他の部分はTwitterで特定の人の発言を補足するクライアント-ソース編- - まめ畑を参照して下さい。
<?php require_once 'HTTP/Request.php'; define("USER_TIMELINE","http://twitter.com/"); class OreOreTwitter{ protected $userId; protected $password; protected $screenName = ""; public function OreOreTwitter($userId = "", $password = ""){ $this->userId = $userId; $this->password = $password; } public function setScreenName($screenName){ $this->screenName = $screenName; } public function getResDom($page = 1){ if($this->screenName == ""){ throw new Exception("Screen Name is NOT SET"); } $request = new HTTP_Request(USER_TIMELINE . $this->screenName . "?page=" . $page); $respons = $request->sendRequest(); if(PEAR::isError($respons)){ throw new Exception("Timeline get ERROR"); } $parsedData = preg_replace("/(<meta content=\"text\/html; charset =)> utf-8([^>]*)/", "\\1 utf-8\\2", $request->getResponseBody()); $dom = @DOMDocument::loadHTML($parsedData); return $dom; } public function getUserImage($body){ $xml = simplexml_import_dom($body); $image = $xml->xpath("//h2[@class=\"thumb\"]"); return (string)$image[0]->a[0]->img[0]["src"]; } public function getFriendTimeLine($body, $page){ $xml = simplexml_import_dom($body); $contents = array(); $i = 0; $entry_array = $xml->xpath("//td[@class=\"status-body\"]"); foreach($entry_array as $entry){ $time = $this->getJpTime((string)$entry->div[0]->span[1]->a[0]->span[0]["title"]); $content = strip_tags($entry->div[0]->span[0]->asXML()); $contents[$i++] = array("message"=>$content, "date"=>$time); } return $contents; } protected function getJpTime($originTime){ return date("Y/m/d H:i:s", strtotime($originTime)); } } ?>
機能追加もこの機会にしてしまおう。