PHPでTwitterを使う方法を簡単に。

PEARのServices_Twitter というのがあるけど、
何故かうまく動かないのでリファレンス を参考に、
HTTP_Requestを利用して。

まず注意事項を。

TwitterAPIは利用制限があって、
使う機能によってマチマチのようだけど、
1時間に150回とかが上限。

利用制限がかけられる対象は、
IPもしくはアカウント。

アカウントはBasic認証またはOAuth認証に対応。

という感じです。

では、実際のサンプルコードをば。
※指定ユーザのタイムラインを表示する例

<?php
requir_once("HTTP/Request.php");

// Basic認証用Twitterアカウント
$basic_usr = USER_NAME;
$basic_pwd = USER_PWD;

// タイムラインを確認したいユーザ
$screen_name = SCREEN_NAME;

$url = "http://twitter.com/statuses/user_timeline.xml?screen_name=" . $screen_name;
// $url = "http://twitter.com/statuses/" . $screen_name . ".xml"; // どっちでも

// HTTP_Requestオブジェクト
$http = new HTTP_Request($url);

// Basic認証
$http->setBasicAuth($basic_usr, $basic_pwd);

// リクエスト
$result = $http->sendRequest();
$response = $http->getResponseBody();

$xml = simplexml_load_string($response);

var_dump($xml);

?>


こんな感じです。
後は$xmlに格納された配列で遊んでください(笑)

ちなみに、screen_nameというのは可変で、
ユーザが設定変えちゃうと情報取得できなくなる。

ので、常時トレースしたいユーザに対しては、
users/showのAPIとかで、ユーザID(idパラメータ)を
取得しておくことを推奨。

ユーザIDはアカウントに対して不変のパラメータで、
上記パラメータのscreen_nameをidに置き換えてやれば
同様にAPIを利用することが出来る。

まだ一通り触ったわけじゃないけど、
利用制限がきついので、
うまくキャッシュ化させて利用するべきですな。
PHPのSimpleXML関数で<dc:description>などのような
名前空間のタグを扱う方法です。

例えば、

…(中略)…
<item>
<title>example</title>
<link>http://example.com/</link>
<dc:description></description>
</item>
…(中略)…

のようなXMLがあり、
これをSimpleXML関数で読み込むと、

array(
…(中略)…
"item" => array(
"title" => "example",
"link" => "http://example.com/"
);
…(中略)…
);

のように、dc:descriptionタグが取得できません。

これを解決する方法があります。

上記のXMLを読み込んだ配列が$item[0]に
格納されているとすると、

$dc = $item[0]->children("http://purl.org/dc/elements/1.1/");
$description = $dc->description;

これでOK。

children関数で名前空間URIを引数に与えてあげて、
読み込むことが出来るようになります。

知らなかったので、メモ。

(参考)
http://d.hatena.ne.jp/qube81/20090626/1245948400
iPhoneでゲームアプリを作成する時に、
ハイスコアの保存と表示は必須の機能。

それを実装するのに、下記記事が参考になります。

http://iphone-dev.g.hatena.ne.jp/kusakari/comment?date=20080929

(以下引用:)

// Saves the user's score in the application preferences
- (void)saveScore {
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSString* name = [defaults stringForKey:kUserNameDefaultKey];
NSDate* date = [NSDate date];
NSMutableArray* scores;
NSMutableString* string;
unsigned i;
NSDictionary* dictionary;

//Dismiss text field
[_textField endEditing:YES];
[_textField removeFromSuperview];

//Make sure a player name exists, if only the default
if(![name length])
name = @"Player";

//Update the high-scores in the preferences
scores = [NSMutableArray arrayWithArray:[defaults objectForKey:kHighScoresDefaultKey]];
[scores addObject:[NSDictionary dictionaryWithObjectsAndKeys:name, @"name", [NSNumber numberWithUnsignedInt:_score], @"score", date, @"date", nil]];
[scores sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"score" ascending:NO] autorelease]]];
[defaults setObject:scores forKey:kHighScoresDefaultKey];

//Display high-scores in status texture
string = [NSMutableString stringWithString:@" HIGH-SCORES\n"];
for(i = 0; i < MIN([scores count], 10); ++i) {
dictionary = [scores objectAtIndex:i];
[string appendFormat:@"\n%s%i. %@ (%@ Pts)", ([[dictionary objectForKey:@"date"] isEqualToDate:date] ? "> " : " "), i + 1, [dictionary objectForKey:@"name"], [dictionary objectForKey:@"score"]/*, [[dictionary objectForKey:@"date"] descriptionWithCalendarFormat:@"%m/%d %I:%M %p" timeZone:nil locale:nil]*/];
}
[_statusTexture release];
_statusTexture = [[Texture2D alloc] initWithString:string dimensions:CGSizeMake(256, 256) alignment:UITextAlignmentLeft fontName:kFontName fontSize:kScoreFontSize];
_state = kState_StandBy;

//Render a frame
[self renderScene];
}



アプリごとにオブジェクトの保存を実現できる
ユーザー・デフォルトを利用するパターンですね。

他にファイルを利用する方法もあるので、
また別の機会にご紹介します。