REST与Web2.0(四):使用 Twitter REST API
简介:
Twitter无疑是WorldWideWeb上新近出现的最为成功的一个社交网站的例子。Twitter提供了一个API以便Web开发人员能够使其用户访问到Twitter站点所能提供的各种特性。在本文中,了解使用TwitterRESTAPI的基本知识。
Twitter是一个简单的基于Web的方式,用最多140个字符告知某些人您目前正在做的事情。
这是最为简短的定义。
较长的定义则稍微复杂一些,加入了更多价值考虑。Twitter是如今业界公认的最为成功的一种社交媒介、在线社交网络,即Web2.0。使用Twitter,您可以聚集大量跟随者。然后,您就可以不时地告诉他们您目前从事的事情。您在TwitterGUI内键入一个简短的故事(即业界所称的tweet)并单击按钮,该tweet随后就会被传输给所有您的跟随者,他们可以相应地选择阅读、了解、回复或忽略
莎士比亚曾告诉我们说“言以简洁为贵”。这一哲学得到了Twitter权威人士很好的贯彻,比如tweet就被限制为最长140个字母。实际上,这一限制与莎士比亚完全无关:它应该与Twitter刚开发出来时移动设备的局限性有关。但该限制很受欢迎,因为它有效防止了tweet内不必要的垃圾信息和措辞混乱。
虽然tweet的长度被严格限制,但这些tweet的实际内容并未受限制。Twitter的初衷是为了告诉您的追随者您现在所做的事情。每天有数百万的tweet发布,毋庸置疑,其主题并不可能总是一成不变的。人们会发布意见、头条、对其blog的链接、对他人blog的链接等等。所以Twitter的新用户应该准备好收到与tweeter的当前所从事的事情毫不相关的tweet。
与大多数(如果不是全部)的Web2.0一样,Twitter还具有一个额外的好处:它是免费的。没错,您无需任何成本就可以加入,无需任何成本就可以追随别人,无需任何成本就可以有任意数量的追随者,无需任何成本就可以tweet。它完全听凭您随意使用。
现在,您应该对Twitter及其功能有了一个很宽泛的认识。如果您尚未访问过Twitter站点,在进行本文其余部分的阅读之前,不妨先浏览一下该站点。这样一来,就更容易理解RESTAPI。
TwitterRESTAPI
了解了基础知识之后,就可以开始研究Web应用程序开发人员所感兴趣的东西了。Twitter不仅仅是社交媒介领域一种很有用的工具,它还能够为开发人员提供一整套的服务来启用Twitter功能的自动化。这些服务之一(并且也有可能是最为流行的一种服务)就是RESTAPI。
REST是RepresentationalStateTransfer的缩略语。对REST定义的详细和完整解读超出了本文的范畴;不过,在IBM®developerWorks®(参见参考资料)的其他地方可以找到相关信息。对于这里所要涵盖的主题,只需知道REST的作用是让开发人员通过一个简单的HTTP调用就可以访问信息和资源,这就足够了。
举个例子,假设FishinHole.com运营了一个向其客户销售钓鱼用具的Web站点。访问该站点的用户可以看到各种鱼饵、渔线和鱼竿等。顾客用老的方式操作:通过单击链接。以这种方式,FishinHole.com可以将其服务提供给客户。
但是FishinHole.com还通过用REST公开其渔具的产品目录的方式将其服务提供给了其他的Web应用程序。所以,与胡乱单击不同,Web应用程序通过一个简单的HTTP调用就可获得有关鱼饵、渔线和鱼竿等的信息。比如,http://www.fishinhole.com/catalog/rest/lures?format=xml可以以XML格式返回该公司所提供的所有鱼饵的列表。又比如,http://www.fishinhole.com/catalog/rest/item?id=343221可以以默认格式返回条目#343221的相关信息。
不妨以这种方式来思考REST:通过将一个URL指向一个特定的位置即可获得特定于域的数据。对于本文的目的而言,这就是全部了。也可以将它想象为一种简化了的Web服务,但是如果您找错了人,在其面前对此高谈阔论,则很可能会陷入到辩论当中。
注意:我应该指出的是FishinHole.com并不实际存在。所以,如果把这些URL粘贴到浏览器中,很有可能会遇到错误。我之所以提供这些例子,只是为了向您展示一个典型的REST调用的格式。
您想不想看到一个完全可以工作的RESTAPI的例子?一个您可以将其中的URL粘贴到浏览器中并返回一些有益信息的例子?那么就请继续阅读本文吧。
立即开始:一个简单的例子
您刚刚阅读完JoelComm的杰作TwitterPower,并决定今天就开始用Twitter通过一个积极主动的在线营销活动获得财政上的独立性。
但是您同时还是一个很棒的软件开发人员。这意味着您更愿意让软件为您完成大部分工作,而不用自己亲历亲为。您不仅要注册一个新的Twitter帐号,而且还要开始学习API以便可以自动化Twitter功能的某些方面。
您第一件想做的事情就是使用此API来检索JoelComm的时间表(参见清单1)。这很有意义,因为他写过一本让您如此备受启发的书籍。
清单1.检索JoelComm的时间表
http://twitter.com/statuses/user_timeline.xml?id=joelcomm
就这么简单。打开另一个浏览器,将该URL粘贴到地址栏,然后等待结果。
显然,对该REST调用进行更深入的探讨是很必要的。首先,http://twitter.com前缀应该是自说明的。twitter.com部分是域名,表明了将要访问位于该名字所映射到的IP地址的一个资源。它前面的http表明将要使用超文本传输协议。这也是REST的常见情况。
接下来,是/statuses。这表明Twitter是如何在一个特定类别指定REST函数的。可以将它想象为文件系统内的一个目录。在本例中,被调用的REST函数被分类在statuses下。在Twitter术语中,一个用户状态基本上也就是一个tweet,因为它表明的恰是用户现在正在做的事情。
再下来是user_timeline。这是所调用函数的实际名称。将此函数直观地命名为user_timeline,因为实际上,检索的是一个用户时间表或用户最近输入的一系列tweet。
请不要忘掉此函数名后的.xml扩展名:这非常重要。它是检索时间表所采取的格式。这里,使用的是XML。其他的可用格式为Java™SimpleObjectNotation(JSON)、Atom和RSS。
使用标准GET注释,参数紧随函数,并由问号(?)分隔。在本例中,只有一个参数—id—而且它指定了您想要查看其时间表的那个用户的Twitter名。这里,指定了joelcomm,因为您想查看的就是他的时间表。
评估输出
查看了上述调用的输出后,您发现您更愿意收到Atom格式的结果。所幸的是,这不成问题,只需对清单1中的代码做一个很小的更改(清单2)即可。
清单2.以Atom格式检索JoelComm的时间表
http://twitter.com/statuses/user_timeline.atom?id=joelcomm
上述REST调用所产生的结果类似于清单3。如果您将该代码粘贴到您的URL,您的浏览器可能会要求您下载结果,因为您的浏览器并未被配置成能够显示以.atom扩展名结尾的文件。
很显然,Joel的时间表在本文发表之际(和您阅读本文之际)与在我撰写本文的时侯不一样。所以,得到的结果也会大相径庭。
清单3.Atom格式的JoelComm时间表(节选)
<?xml version="1.0" encoding="UTF-8"?> <feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom"> <title>Twitter / joelcomm</title> <id>tag:twitter.com,2007:Status</id> <link type="text/html" rel="alternate" href="http://twitter.com/joelcomm"/> <updated>2009-03-22T10:21:31+00:00</updated> <subtitle>Twitter updates from Joel Comm / joelcomm.</subtitle> <entry> <title>joelcomm: thinking...</title> <content type="html">joelcomm: thinking...</content> <id>tag:twitter.com,2007:http://twitter.com/joelcomm/statuses/1369295498</id> <published>2009-03-22T05:15:01+00:00</published> <updated>2009-03-22T05:15:01+00:00</updated> <link type="text/html" rel="alternate" href="http://twitter.com/joelcomm/statuses/1369295498"/> <link type="image/jpeg" rel="image" href="http://s3.amazonaws.com/joel1_normal.jpg"/> <author> <name>Joel Comm</name> <uri>http://www.JoelComm.com</uri> </author> </entry> </feed>
如果您熟悉XML,就会发现清单3的大部分都很直观。如果您熟悉Atom,更会发现它丝毫不陌生。如果您既熟悉Atom又熟悉Twitter,您完全可以跳过这一章节。
以下是对清单3内的代码的分项描述:
请注意根元素是feed。根据Atom规范,这很标准。Twitter使用的名称空间是http://www.w3.org/2005/Atom,被指定为根目录内的一个属性。
title元素代表的是您正在查看哪个用户的时间表。它还为Twitter网站做了一点广告宣传。
link元素也很重要:它指定了若以老的方式查看(在浏览器手动查看)JoelComm的时间表应该使用的那个URL。
entrystanza代表的是一个tweet。虽然出于简单的目的,我只列出了一个,但实际上,在输出中可以看到20个这样的tweet。
请注意title和content的实际内容是一样的。这是因为tweet没有标题,所以标题也就是实际tweet本身。还记得么,Atom的设计初衷就是为了用于文章型文档,这类文档通常具有一个大标题,然后就是主体部分。由于tweet并不如此,所以两个元素包含了一模一样的内容。
在Atom格式,内容之前是Twitter名,然后是一个冒号(:)。这里,joelcomm:在实际的tweet之前。
这里的实际tweet是一个美妙无比的语句thinking...。这是我在写作本文之时Joel最新的tweet。挑剔的人可能会据此判断这说明Joel有的时候没有思考或者Joel缺乏有关其最新tweet的资料,因此才会不得已随便输入了些东西。不过,我并未把别人的这类猜测放在心上。
id元素是Atom必需的,并且是这个特定的tweet的一个全局惟一的标识符(GUID)。Twitter在世界范围内的所有tweet均具有惟一ID以便它们能被惟一引用。
published和updated(出版和更新)的日期和时间也是相同的。这没错,因为Joel仅仅输入了其tweet,从未更新过。
第一个link元素提供了对这个tweet的一个链接。继续并将http://twitter.com/joelcomm/statuses/1369295498粘贴到浏览器窗口内,此时,应该会看到Joel正在“thinking...”。
第二个link元素提供了对Joel的相片的一个链接。
authorstanza提供了有关这个Twitter用户的信息。这里,您会看到Joel的全名以及Web站点URL。
对这个API进行了这么多的思考之后,您意识到这些信息非常棒并且您可以很容易地编写代码来解析Atom输出。当然,您也可以解析来自其他用户的时间表,而不仅仅限于JoelComm的。所解析的信息可被收集用作这个在线营销活动的相关数据。惟一的限制是您的想象:可能无极限
其他参数
除了id之外,user_timeline还具有其他几个参数。在上例中,还可以指定screen_name,而非id。若恰巧知道用户的数字TwitterID,还可以在user_id参数内指定它。
此外,使用since_id参数,可以指定ID大于在此参数内指定的数值的那些tweet(参见清单4)。之前,Joel著名的“thinking...”tweet的ID为1369295498。所以,如下的URL会返回晚于这个tweet的那些tweet。
清单4.检索JoelComm“thinking...”之后的时间表
http://twitter.com/statuses/user_timeline.xml?id=joelcomm&since_id=1369295498
参数max_id基本上是since_id的反转。它返回的是ID小于此参数值所指定的ID的那些tweet。
与ID相反,参数since允许您对时间表过滤器应用一个实际日期。page参数允许您对结果进行分页。默认的user_timeline调用会返回最近的20个tweet。若这些tweet的编号为1-20,那么清单5内的代码会返回tweet41-60。
清单5.检索JoelComm的第三组tweet(20个)
http://twitter.com/statuses/user_timeline.xml?id=joelcomm&page=3
其他函数
到目前为止,您已经充分领略了user_timeline函数。除此之外,TwitterAPI还提供了其他一些可通过REST访问的函数。
public_timeline函数(清单6)让您能够看到整个Twitterverse内的最新tweet—至少是为那些向公众提供其tweet的用户。
清单6.最新的tweet
http://twitter.com/statuses/public_timeline.xml
friends_timeline函数(清单7)让您能够看到您跟随的那些人的tweet。就如同您登录到Twitter并径直访问您的Twitter主页。
清单7.您跟随的那些人的最新tweet
http://twitter.com/statuses/friends_timeline.xml
若将清单7中的URL复制并粘贴到浏览器中,系统会提示您提供您的Twitter用户名和密码。您在Twitter内的主页是一个安全环境,因它包含了对直接消息的链接。所以,这是Twitter部分上的一个安全措施。(我将在本文稍后的部分详细讨论安全性。)
update函数允许使用RESTAPI进行实际的tweet。在本例中,这个函数调用必须通过POST请求(而非GET请求)完成。随POST请求提交的参数status包含这个实际tweet的文本。
replies函数会将这20个最新的@replies返回给通过身份验证的用户。基本上,@replies是被特别指定给特定用户的tweet。比如,如果您tweet@joelcommareyoudonethinkingyet?,那么该消息就会显示为一系列特别定向给JoelComm的消息之一。他通过单击其Twitter主页上的一个链接就可以看到这些消息。但是,@replies对跟随发出回复的用户的所有用户也是可见的。
对所有RESTAPI函数进行全面详细的解释超出了本文的范围。但是,在API文档内有对它们清晰的文档记录。
API使用上的限制
使用TwitterRESTAPI并非随意到可以做任何您想做的事。Twitter对其API的使用做了一定的限制以防止带宽杀手破坏特性集的有用性。
对于初学者而言,只允许最多每小时100个请求。虽然,这一限制只应用于GET(而非POST)请求,但经验证明它还是一个很不错的规则。如果超出了此限制,REST调用所产生的文档将会告诉您这一点。所以,不管出于何种原因而必须调用TwitterRESTAPI超过每小时100次时,可以从Twitter请求whitelisting。
另一个限制是不管使用page还是count参数,最多返回3200个状态。
此外,Twitter只请求但并不强制要求其他限制。比如,Twitter建议使用page属性,不建议使用count属性。又比如,它还建议对结果进行本地缓存,而不建议重复请求相同的状态
身份验证
正如我之前提到的,某些函数要求身份验证。如想使用TwitterRESTAPI并利用这些函数,就必须在请求中包含身份凭证。否则,就会获得状态码401的回复。
在本文写作之时,Twitter只支持HTTP基本的身份验证,这意味着此请求头必须以加密的格式包含您的用户名和密码。这之后,您就可以对此TwitterAPI函数进行全面的访问,就好像是从浏览器登录到Twitter一样。
目前,Twitter正致力于寻找一种方式来启用OAuth身份验证以获得安全请求。
结束语
Twitter是进入Web2.0世界的一个很好的切入点。使用Twitter,您可以借助微型blog,构建一个由与您志同道合的人组成的完整在线网络。
使用TwitterRESTAPI,您能够自动化以前用Twitter手动实现的所有功能。您可以以编程的方式访问一个特定用户的时间表。您可以直接或间接地回复给该用户。您可以针对您自己感兴趣的信息查找用户的tweet。您可以基于特定的标准过滤tweet并在您自己的blog上显示这些tweet。
存在无限可能性。
from:http://www.ibm.com/developerworks/cn/xml/x-twitterREST/