読者です 読者をやめる 読者になる 読者になる

まめ畑

ゆるゆると書いていきます

Twitterのタグ構造が変わったので

PHP 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));
	}
}
?>


機能追加もこの機会にしてしまおう。