Twitter API 应用
题外话:
———————————————————————
我的需求很简单,就是将最近的几条twitter信息显示在blog上。
首先想到的办法就是,直接用blogger提供的feed功能。可是,输出的每条信息前都有个“Wang Congming:”长长的前缀,不喜欢。而且,blogger每抓取一次feed好像要缓存挺长时间,而twitter应该是实效性比较强的,恩~。
然后,就想到用twitter官方提供的Badges。However,他们给的不是我想要的。所以,只好去看看API说明,自己动手。
小小原理:
———————————————————————
twitter支持四种格式的数据输出:xml, RSS, ATOM, JSON,以及 GET 和 POST 两种方法。当然,只是查询一下不需要授权的数据,自然用不上POST。所以,只需要GET一个JSON就行,通过URL传递适当的参数,得到我们需要的数据。
传递过来的 json 是一个函数,而我们需要的数据作为函数的参数。唯一要做的,就是事先定义这样一个函数,告诉它该怎么执行,怎么显示其中的数据。至于函数名,GET 时由自己用 callback 参数指定。
Click the expand button to read full text…
数据结构
———————————————————————
返回的数据类似以下结构:
twitterCallback([ { "created_at":"Sat Apr 28 15:45:24 +0000 2007", "text":"信息的内容~", "id":43160262/*该条信息的数字编号*/, "user":{ "name":"Wang Congming", "profile_image_url":"http:...", "description":"自我介绍", "location":"BeiJing", "screen_name":"WCM/*用户名*/", "url":"http:...", "id":5002701/*用户的数字编号*/, "protected":false } }, { /* 第2/3/4...条信息,重复以上形式 */ }]);
完成
———————————————————————
根据以上数据,得代码如下:
<ul id="my_twitter"><li>Loading...</li></ul>
<script type="text/javascript">function relative_time(time_value) { var time_correct = time_value.split('+0000'); var parsed_date = Date.parse(time_correct[0]+'GMT+0000'+time_correct[1]); var relative_to = new Date(); var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); if(delta < 60) return 'less than a minute ago'; else if(delta < 120) return 'about a minute ago'; else if(delta < (45*60)) return (parseInt(delta / 60)).toString() + ' minutes ago'; else if(delta < (90*60)) return 'about an hour ago'; else if(delta < (24*60*60)) return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago'; else if(delta < (48*60*60)) return '1 day ago'; else return (parseInt(delta / 86400)).toString() + ' days ago';}function twitterCallback(obj){ var twitterHTML = ''; for(var i=0; i<(obj.length); i++){ twitterHTML += '<li><span class="item-title"><a href="http://twitter.com/wcm/statuses/'+obj[i].id+'">' + obj[i].text + '</a></span><span class="item-date"> - ' + relative_time(obj[i].created_at) + '</span></li>'; } document.getElementById('my_twitter').innerHTML = twitterHTML;}</script>
<script src="http://twitter.com/statuses/user_timeline/5002701.json?callback=twitterCallback&count=5" type="text/javascript"></script>
效果如右侧~
总结一下
———————————————————————
1、以上代码,如果去掉ul间的“<li>Loading…</li>”,然后存为一个单独的文件,将无法正常显示,加上后又变为正常。当然,并不限于Loading…,也并不限于ul之间。也就是说,只要在任何可以的地方,加上任何字符,就OK了,不加就不行,IE和ff均如此,不理解……。
2、twitter输出的”+0000″时区没有指名是哪个标准时间(虽然没多大差别),这将导致IE的Date.parse语法分析出错,所以先在”+0000″前加上GMT再分析。
3、”…/5002701.json?callback=twitterCallback&count=5″。这里的5002701要换成自己的编号;twitterCallback即是指定的返回函数名,可自由命名;除了count外,还有其他筛选条件,如指定起始日期的since等。
关于JSON (JavaScript Object Notation): http://www.json.org/json-zh.html

To 某位朋友:
以下是我现在使用的代码,你只要把它复制到你Blog 里就可以。看起来就是我Blog 右侧现在这个样子。
你可以把它另存为一个单独的html 文件,然后用浏览器打开看看效果。这些JS 只是负责取回数据,没有定义样式,具体的效果会根据你Blog 里定义的样式而变化。
如果你喜欢像我Blog 这样每句话前显示一个小气泡,而不是一个黑点。可以把下面一句加入到你的css 文件里:
#my_twitter li{
list-style-image: url(http://lh4.google.com/image/lovelywcm/RjOnsMO0f5I/AAAAAAAAAMs/WJnqMR__MXQ/comments.gif)
};
下面的代码,你需要改动两个地方。
1、把我的ID(WCM)改成你的ID;
2、把我的数字编号(5002701)改成你的。
你查看你twitter 的feed 地址,大概是类似这个样子:
http://twitter.com/statuses/user_timeline/5002701.atom
其中,.atom 前的数字就是你的编号。
--------------------
<ul id="my_twitter"><li>Loading…</li></ul>
<script type="text/javascript">
function relative_time(time_value) {
var time_correct = time_value.split('+0000');
var parsed_date = Date.parse(time_correct[0]+'GMT+0000'+time_correct[1]);
var relative_to = new Date();
var delta = parseInt((relative_to.getTime() – parsed_date) / 1000);
if(delta < 60) return 'less than a minute ago';
else if(delta < 120) return '大约 1 分钟';
else if(delta < (45*60)) return '约 '+(parseInt(delta / 60)).toString() + ' 分钟';
else if(delta < (90*60)) return '大约 1 小时';
else if(delta < (24*60*60)) return '约 ' + (parseInt(delta / 3600)).toString() + ' 小时';
else if(delta < (48*60*60)) return '大约 1 天';
else return (parseInt(delta / 86400)).toString() + ' 天前';
}
function twitterCallback(obj){
var twitterHTML = '';
for(var i=0; i<(obj.length); i++){
twitterHTML += '<li><span class="item-title"><a href="http://twitter.com/wcm/statuses/'+obj[i].id+'">' + obj[i].text + '</a></span><span class="item-date"> – ' + relative_time(obj[i].created_at) + '</span></li>';
}
document.getElementById('my_twitter').innerHTML = twitterHTML;
}
</script>
<script src="http://twitter.com/statuses/user_timeline/5002701.json?callback=twitterCallback&count=5" type="text/javascript"></script>
提醒下,现在Twitter可以不用编号了,可以直接输入用户名,比如:http://twitter.com/statuses/user_timeline/phy25.rss
我以前也用这代码,现在访问时居然提示要输入用户名和密码,不知是咋会事