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等。

4、Twitter API官方文档

关于JSON (JavaScript Object Notation): http://www.json.org/json-zh.html

陈述句与形容词

  刚刚与MM聊天,说到怎么描述一件事物。应该用陈述性的语句,而少用形容词。


  因为,事物都是一定的,客观存在的。但是,不同的人却有不同的观点,不同的观点来自于不同的性格、素养、生活水平等等。当一个人仍出一个形容词时,并不代表被评价的事物真像他说的那样,而恰恰表明了他自己的立场。


  譬如,陈述句:“这件衣服100元”,它描述了一件衣服的价格;但如果说:“这件衣服好贵啊!”,对于尚不知道这件衣服价格的人来说,这句话一点意义都没有,甚至提供了误导性的信息。对于已经知道衣服价格的人来说,有的人会发现,“哈,原来他跟我的境况差不多!”,也可能有人会说“嘿,原来他是个穷光蛋~”。


  所以,当你想向他人正确地传达一条信息时,当你不想把自己的欣赏水平、生活水平以及素质水平一股脑儿暴露在他人面前时,记得用陈述句~。


(BTW, This is the first time I publish my blog post via "Word 2007". But it seems there is no way to add label. sigh...What a pity!)