michinoko blog

Information

date: 2009/07/20
category: api, php.

Twitterのrssをフィードする

ご無沙汰してます。
エジプト行ったり諸々してたら前回のエントリーより1か月も経ってた;
月日が流れるの早っ!予定では自分のサイトを発表する予定が、デザインだけやりつつもそっから手つかずorz何故かやたらと忙しかった。まぁ気を取り直して、またしても自分のメモ兼用ブログなので、ぼちぼち書いて行けたらええなぁと。

というわけで、作ったけどお蔵入りしたrssを読むphpで引っかかったところ。twitterで、発言ページの右下にある「michinokoのつぶやきのRSSフィード」をphpで読みたかった。

躓いたところは2つ。
・文字化け問題
・タグの重複

めちゃ基本的なとこで躓く。解決として文字化けは、

xml_parser_set_option($parser,XML_OPTION_TARGET_ENCODING,"UTF-8");

を記述。タグ問題は、phpのパーサ関数では子要素のタグも親要素のタグも同じに扱ってしまったので(日付のcreated_atとリンク先のlink)、単純に2回に1回(奇数回のときだけ)表示するようにする。例えば、$data['created_at'][$j*2-1]感じで呼び出してあげる。リンクはtrimをしてhttp://twitter.com/michinoko/statuses/をつけるのも忘れずに。

全然大した事のないコードですが、自分用ということで晒しておきます;余計なとこは無視してください。ちなみに「michinokoのつぶやきのRSSフィード」をクリックすると.rssのページに飛ぶけどそれを.xmlにするとスタイルが関連づけられてない単純なxmlが見えます。

mb_internal_encoding("UTF-8");
function CharacterHandler($parser,$text)
{
	global $buffer;
	$buffer.=$text;
}
function StartHandler($parser,$name,$attrib)
{
	global $itemcnt,$idFlag;
	if($name=="status"){$itemcnt++;}
}
function EndHandler($parser, $name)
{
	global $buffer,$itemcnt,$data,$idNum,$created_atNum;
	mb_detect_encoding($buffer, "UTF-8");
	switch($name){
    case "created_at":
			$created_atNum++;
			$data['created_at'][$created_atNum]=$buffer;
			break;
    case "text":$data['text'][$itemcnt]=$buffer;break;
    case "id":
			$idNum++;
			$data['link'][$idNum]="http://twitter.com/michinoko/statuses/".trim($buffer);
			break;
    default :
      	break;
	}
  	$buffer="";
}
$parser=xml_parser_create();
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,false);
xml_parser_set_option($parser,XML_OPTION_TARGET_ENCODING,"UTF-8");
xml_set_element_handler($parser,"StartHandler","EndHandler");
xml_set_character_data_handler($parser,"CharacterHandler");
$fp = fopen("http://twitter.com/statuses/user_timeline/16305324.xml",'r');
while($strbuf=fread($fp,3000)){
	xml_parse($parser,$strbuf,feof($fp));
}
fclose($fp);
xml_parser_free($parser);
for($j=1;$j<=$itemcnt;$j++){
	echo "&lt;hr&gt;{$data['created_at'][$j*2-1]}&lt;br&gt;";
	echo "&lt;hr&gt;{$data['text'][$j]}&lt;br&gt;";
	echo "&lt;hr&gt;{$data['link'][$j*2-1]}&lt;br&gt;&lt;br&gt;";
}

次回こそFLASHネタを書くか。