Twitter OAuth認証なしで取得できるデータのめも。

2011.10.30 ActionScript3.0 HTML5/JavaScript 

Twitterからデータ引っ張ってくる時に、OAuth認証通せばだいたい何でもできるんですが、
OAuth認証ナシで、screen_name(@rettuceの@以降の部分ね) だけで
どこまで引張って来れるのか自分でもこんがらがってきたので、
以下、ちょっと自分用めも。

Demo – Twitter NO OAuth Sample.
(2012.1.7 追記:下にも書いたけどこれだとAPI回数制限引っかかるからjs版参照のこと!)

前提条件

今回は screen_name だけ入力してもらうことにする。
idが使えればそっちの方がアカウントに対して変更がなくてほんとはいんだけど
ユーザは自分のidなんてそもそも知らないしね。。orz

取得可能API

.formatは例のごとくxmlやらjsonやら都合のいい方でどぞ。

■自分のアイコン
http://api.twitter.com/1/users/profile_image?screen_name=screen_name&size=bigger
– size
bigger – 73×73 px
normal – 48×48 px
mini – 24×24 px
original – original size

■自分のタイムライン
http://api.twitter.com/1/statuses/user_timeline/screen_name.format?count=200
– default count = 20
– max count = 200? なんか返す数がまちまちな気がする。サーバの負荷状況による?

■フォローしている(following)
http://api.twitter.com/1/statuses/friends/screen_name.format
– max account = 100

■フォローされている(followers)
http://api.twitter.com/1/statuses/followers/screen_name.format
– max account = 100

■自分のtweetした画像(media_timeline)
http://api.twitter.com/1/statuses/media_timeline.format?include_entities=true&screen_name=screen_name&count=100
公式アップローダ経由の画像なら

http://p.twimg.com/***.png

のように画像パスまで取得可能。
それ以外の画像サービスは各サービスAPI参照。

一応注意

今回のタイミング(2011/10/27の時点)で動いたものをまとめただけ&けっこー古いAPI資料とか見てるので、
もう使えないよ!とかあるかもしれません。。もしあったら@rettuceまで教えてくれるとありがたいです。:-)

で、とりあえず確認レベルでやってみたのが以下。

Demo – Twitter NO OAuth Sample.
(2012.1.7 追記:下にも書いたけどこれだとAPI回数制限引っかかるからjs版参照のこと!)

あと、へちょいサーバーを使ってるせいでcrossdomain通過する為のphpのとことかで色々苦労しました。。
っていうかこっちに時間かかってただけな気がする。。
画像の取得用phpは以下みたいに書いたんですが、サービス(twi○pic)とかによっては(その時の鯖側の問題?)URLがリダイレクトになってるとfile_get_contentsが一旦エラー返してきたり、
(1週間前にはそんな挙動じゃなかったんだよ!!(´;ω;`) ブワッ
画像のContent-type取得するためのgetimagesize使えなかったりとか、
(これはもうちゃんとした鯖にしろって話すね…orz
四苦八苦しながらとりあえずこんなんでごまかしますた。

ちなみにこの鯖ではContent-type全部jpgにしてやりました。ごめんなさい。

<?php
if($_GET["url"]){
	$url = $_GET[ "url" ];
	$headers = get_headers($url, 1);
	$ans = $headers['Location']? 1 : 0;
	if($ans==1) $url = $headers['Location'];
	$img = file_get_contents($url);
	$imginfo = getimagesize($img);
	header("Content-type: {$imginfo[mime]}");
	echo $img;
}?>

で、やってみた感想としては、画像のcrossdomainさえなんとかすれば、けっこーなんでもできるね。:-) ヤッター
と思ってたんですが、開発中にAPIの上限150/hに引っかかってしまい、
「OAuth通さないとサービス側でAPI制限引っかかるやん!!」という初歩に気付けました。
うん、仕事には使えない。w あれ、でもAPI制限引っかかってないコンテンツもあるな。どうやってんだろあれ。

まーとりあえず、APIなんてすぐ変わるし、こんなことやらなくても分かってるよ!というレベルなんですが
自分のまとめついでということで。:-)

you

2011.11.09 追記

で、このAPI制限引っかかんのどうしてんだろってやつ、先輩に解決策教えてもらいました。

どうしてもAPIの回数使う部分だけ、クライアントサイドでAPI叩けばそのIPアドレス毎になるので、
ユーザ毎に150回/hになるよーっていう方法。なるほどね!!!!

ま、簡単に言うと今phpで叩いてるAPI(サーバのAPI回数)を
JS経由(クライアント毎のAPI回数)で叩きに行けばいいんですね。(・∀・)

でやってみたのが以下。

ExternalInterface.callでjs叩いて、引数にnameとか送って、
ajaxとかでAPI叩いてCompleteのタイミングで
ExternalInterface.addCallbackに登録しといた関数にデータを返すよ!(`・ω・´)キリッ

as側

ExternalInterface.call( 'getJson', 'myName!!!' );	// jsにscreen_name投げる
ExternalInterface.addCallback('getData', loadComp );	// jsからのcallback登録しとく

private function loadComp(data:*):void
{
	MonsterDebugger.trace('data from js! ktkr!',data);
}

js側

var swf;	// target swf

window.onload=function(){ swf = getElementFromName("target_swf");}
function getElementFromName(name){
	if (navigator.appName.indexOf("Microsoft") != -1)	return window[name];
	else	return document[name];
}
swfobject.embedSWF("Main.swf","swfArea","800","600","10",null,null,null,{id:"target_swf",name:"target_swf"});

function getJson($name)
{
	$.ajax({
		type 	 : 'GET',
		url  	 : APIに$nameとかつけて叩きに行けばいーと思うよ!,
		dataType: "jsonp",
		error : function(){
			str = 'ajax error.';
			swf.getData(str);
		},
		success  : function(data){
			console.log(data);
			swf.getData(data);
	}});
}

いけたーー(・∀・)ーー!!! js最高!うそ!

p.s
これのjs版はこっちにつくったお。

© rettuce.com