您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
使用 PHP 将 Twitter 转换为 RSS
 
作者 Thomas Myer,火龙果软件    发布于 2014-07-22
  3494  次浏览      15
 

使用 PHP 库将 Twitter 流格式化为 RSS

本文介绍 Twitter 的基础结构,向 PHP 开发人员展示如何使用公共库从他们自己的或朋友的时间线中提取状态并将它转换为其他格式,特别是 RSS。

在深入讲解 Twitter 主题之前,我有一些话要说。尽管我现在是 Twitter 的忠实用户和追随者,但是在它最初出现时,我对它是有点迷惑的。事实上,我一直对它心怀敌意。

下面我给您介绍一下 Twitter 的背景

当 2007 年的 South by Southwest 大会引入了 Twitter 时,我的一位好朋友就打电话告诉了我,他说:“你应该去注册一个帐户,Twitter 真是太神奇了!” 显然,在整个会议厅中,巨大的屏幕一直显示着微型博客消息。那一年我一直在旅行,去过很多地方,但并没有实际参加 South by Southwest 大会。确实,我太局限于自己的小世界了,没有对它引起真正的重视。微型博客?Tweet?这些家伙说的都是什么啊?

不久之后,我有机会去尝试这种服务,但发现它并不适合我。事实上,我认为 Twitter 非常浪费时间。我并没有发现我的同伴们喜欢去追随什么,即使他们发明了曲速引擎(warp drive)或治愈了癌症。相反,当时的 Twitter 用户似乎更多地讨论刚刚为小孩做的火腿三明治这样的话题。

很快过了几个月之后,我突然发现自己一直在使用 Twitter。我使用它来查找新资源、关注总统候选人、联系远方的朋友。为什么会有如此大的转变?我真的不知道。许多 Twitterzen 伙伴都能明白我这种感受,就像拥有您的第一部手机一样。有一天您发现拿着一部昂贵的手机到处走是一件很愚蠢的事,因为到处都有公共电话亭、住宅电话和办公电话,您可以方便使用。但是马上发生了一件事,您被困在 East Outersticksvillestan 的公路边,束手无策,您就会感谢这部小小的手机救了您的命。

不过有一件事是确定的:与手机取代公用电话不同,Twitter 并没有取代我的社会网络活动 — 相反它起到了促进的作用。我经常使用 Twitter 发布我在 Web 上找到的有趣条目 — 使我的追随者感到开心或引发思考的文档和参考资料。希望它们至少在某一方面有用。确实如此,有一阵子我发现我总是在 Twitter 上面说 “该死的,我需要咖啡” 或 “昨天晚上很无聊” 之类的话,但是我尽量克制自己说这些废话。

从某种程度上说,作为一名开发人员,我需要的更多。我需要进行修改,将事情分类,或者至少指出工作原理。在上一篇文章中,我说明了如何用 PHP 构建一个简单的微型博客工具,这种轻量级工具可以在 Intranet 应用程序或其他封闭系统的环境中良好地工作。

在本文中,我想对 Twitter 的内容进行更深入一点的介绍,简单探讨一下 API,然后转向一个可以简化某些任务的著名的公共 PHP 库。本文的目标是说明工作原理,并提供一些工具,您可以利用这些工具将 Twitter 时间线导出到 RSS。目的是什么呢?共享是最主要的目的,是 Twitter 之类社会媒体服务存在的原因。有时候在 Web 站点上更新 Twitter 是非常有好处的 — 特别是像我一样使用服务来共享信息和资源。

有些人可能会问:“那这有什么意义呢?” 如果您一直紧跟社会营销和媒体的发展趋势,您就会知道,每个人(政府、公司品牌、营销人员、消费者、各种爱好者)正在加入到 “市场就是对话” 这一潮流中。事实上,关于这一主题,网上的讨论是非常多的。

与这些人中的大多数人不同,您是一位技术专家,因此可以很好地衡量这些工具并理解发起对话的形式。这对您的职业生涯是有用的 — 您将是办公室中惟一理解具体细节的人,而不是仅仅大谈 “社会媒体怎样怎样。” 此外,了解 Twitter 对扩展您的技能也很有用。

Twitter API 的技术背景

从表面上看,Twitter 基本上是一个精简版的博客服务。您拥有发布 tweet 的用户。Tweet 被限制为 140 个字符,带有日期和时间戳。用户可以相互追随,这实际上就是一个简化的联合(syndication)服务。与 Twitter 帐户及相关的时间线和 tweet 有关的信息不仅对标准 Web 界面可用,而且可以通过 Twitter API 被第三方应用程序所用。这个 API 通过具象状态传输(Representational State Transfer,REST)或搜索 API 公开 Teitter 数据和服务。

本文只讨论 REST API,因为您确实不需要利用搜索功能来发布 tweet 的 RSS 提要。毋庸多言,搜索 API 非常有用,它提供 Atom 和 JavaScript Serialized Object Notation(JSON)格式的数据,允许各种搜索条件(包含一个单词的 tweet,来自某一特定用户,发送给某一特定用户,引用了某个特定用户,包含一个 hashtag,或同时包含以上所有条件)。REST API 同样有用,它提供 RSS、XML、JSON 和 Atom 格式的数据。

REST API 使用 HTTP 基本身份验证作为它的身份验证模式,大多数库和实用工具的启动都需要使用 Twitter 用户名和密码。如果没有 Twitter 帐户,则需要一个帐户来启动程序,或者至少访问 Twitter 帐户的身份验证凭证。但是,如 Twitter API 的 wiki 所述:所有响应都与进行身份验证的用户的上下文有关。如果试着从您没有追随的受保护用户获得信息,请求就会失败。

REST API 的名称表明,Twitter API 试着符合具象状态传输的设计原理。REST 通常用来不确切地描述一类简单的接口,它们通过 HTTP 在没有任何额外层(如 SOAP 或 cookies)的情况下传递特定于域的数据。RESTful 服务通常涉及一个或更多的资源,每一个都与一些可独立寻址的内容关联 — 即统一资源标识符(Uniform Resource Identifier,URI)。在 Twitter API 上下文中,有多种 RESTful 服务可用于提取有关用户、追随者、时间线等内容的信息。

使用 Twitter 涉及一些熟悉的方法。在许多情况下,您可以从一种数据类型切换到另一种数据类型,只需更改文件扩展名即可。需要 Atom 而不是 RSS?切换文件扩展名就行,而且,如果有特定的方法支持它,那么就获得了新格式化的数据流。将请求参数转换为 8 位 Unicode 转换格式(Unicode Transformation Format,UTF-8)并使用统一资源定位符(Uniform Resource Locator,URL)编码也是一个不错的主意,特别是在这些请求参数涉及复杂的字符串时。

特别注意,Twitter API 支持以下请求类型:

1.GET,用于数据检索

2.POST,用于提交、更改或销毁数据

3.DELETE,也用于销毁数据

如果试图使用 POST 操作检索数据,API 就会返回一条错误 — 在调试时,最好从带有请求类型的匹配方法入手。

与其他使用 HTTP 的 REST 服务一样,Twitter API 使用一组状态码和错误消息。Twitter API 为每个请求返回标准且对应的 HTTP 状态码,如 表 1 中所述。这使得使用 Twitter API 就好像使用其他您已经习惯使用的基于 HTTP 的操作一样(如果不是无法区别的话),如 Asynchronous JavaScript + XML (Ajax) 和简单的同步 GET 和 POST 操作。

表 1. Twitter API 状态码

错误消息通常以请求的格式返回。如果请求 XML,得到的所有错误消息都将是 XML 格式的。例如,清单 1 是 Twitter API wiki 发布的一条错误消息的一个片段。

清单 1. 错误消息片段(XML 格式)

<?xml version="1.0" encoding="UTF-8"?>
<hash>
?<request>/direct_messages/destroy/111.xml</request>
?<error>No direct message with that ID found.</error>
</hash>

关于速率限制还有最后一点要注意:允许客户机每小时发出 100 个请求,从他们的第一个请求开始,不包括 POST 更新。未经身份验证的请求将被跟踪 IP 地址,而经过身份验证的请求则对发出请求的用户进行跟踪。只要超过速率限制,Twitter 就会返回一条 400 错误消息,因此您需要考虑在您这一端实现本地缓存。公共时间线会被 Twitter 缓存至少 60 秒,因此请求更新是非常浪费时间的。

但是,如果您发现自己突然到达速率限制时,可以从 Twitter 请求白名单(请参阅 参考资料)。您会在 48 小时之内得到回复,而请求如果批准的话,您的应用程序将被允许每小时发出多达 20,000 个请求。

使用 Twitter REST API

当我还是一个年轻的 Web 开发人员时,我可以夜以继日地朝任何指定的方向编码,完全没有问题。15 年过去了,我无疑老了许多,不过欣慰的是,我也变聪明了点。尽管我在这里提供了一些有关某些 Twitter REST API 方法的细节,但这只是供参考之用。最终,您将使用一个极好的 PHP 库来大大减轻您的工作负担。

但是,因为引入没有上下文的库没有任何好处,所以下面简要介绍一些使用更广泛的 Twitter REST API 方法和调用。

最常用的 API 方法可能是 public_timeline。与其他状态方法一样,public_timeline 的格式有 XML、JSON、RSS 和 Atom,同样地,它也使用 GET 检索数据。从 http://twitter.com/statuses/public_timeline.xml(或 .rss 等)可获得该方法。如清单 2 所示,状态元素基本上包含描述帐户的节点,并有一个描述用户的嵌入式用户节点。

清单 2. public_timeline 状态元素

<status>
created_at
id
text
source
truncated
in_reply_to_status_id
in_reply_to_user_id
favorited
<user>>
id
name
screen_name
description
location
profile_image_url
url
protected
followers_count

另一个比较常用的方法是 friends_timeline,它返回验证用户和该用户的朋友最近发布的 20 个状态,如果您已经登录到 Twitter,那么该方法非常类似于 http://www.twitter.com/home。这个方法可从 http://twitter.com/statuses/friends_timeline.xml(或 .rss、.atom、.json)获得并通过 GET 请求检索。您可以插入一些可选参数,如 since(一个 HTTP 修改日期,如 Mon%2C+2+Feb+2009+11%3A45%3A33+GMT)或 page(从时间线中检索特定的 tweets 页面)。

然后还有 user_timeline 方法,它类似于 friends_timeline,但被限制为特定用户的 tweet(您可能已经猜到了)。如果没有指定 Twitter 用户名,API 就假定您想检索验证用户的时间线。

还有许多其他可用的方法,当然,以上三个方法已足够帮助您入门了。现在,像我曾提到的那样,您无需任何帮助即可使用 Twitter API 了,但这不会使您变成一位高效的开发人员。您有您自己 的极限,所以最好使用预先构建好的库。

幸运的是,有一个非常好的库可用,即 twitterlibphp(请参阅 参考资料)。下载这个库,然后将它添加到测试或开发服务器。在下一节,您将开始使用它。

使用 twitterlibphp

twitterlibphp 库包含一个方法列表,每个方法都映射到一个 Twitter API 方法。该库本身处理所有连接、身份验证、错误处理等等。包含此库并进行身份验证后,首先从其中一个方法开始。

首先,看看使用 showUser() 方法检索特定用户的 XML 状态会发生什么。在清单 3 中,只需用帐户的凭证替换 $user 和 $pw 的值,这样就可以检索到状态信息了。

清单 3. showUser() 方法

include_once("twitter.lib.php");

$user = "your-username";
$pw = "your-password";

$twitter = new Twitter($user,$pw);

$xml = $twitter->showUser("xml", $user);

echo $xml;

结果在原始输出中提供了大量信息,在清单 4 所示的 XML 中,您不仅可以看到我的真实姓名、屏幕名和最后一个 tweet,还可以看到我追随的人、头像的路径,甚至我的颜色偏好。

清单 4. showUser() 方法的输出

<?xml version="1.0" encoding="UTF-8"?>
<user>
<id>14129237</id>
<name>Thomas Myer</name>
<screen_name>myerman</screen_name>
<location>Most likely rushing to my next</location>
<description>Author, Infopreneur, Blogger, Consultant</description>
<profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/
74029317/myerman_gmail.com_eef446f6_normal.jpg</profile_image_url>
<url>http://www.tripledogs.com</url>
<protected>false</protected>
<followers_count>55</followers_count>
<profile_background_color>FFFFFF</profile_background_color>
<profile_text_color>5F5454</profile_text_color>
<profile_link_color>A18FB9</profile_link_color>
<profile_sidebar_fill_color>082C35</profile_sidebar_fill_color>
<profile_sidebar_border_color>120E26</profile_sidebar_border_color>
<friends_count>16</friends_count>
<created_at>Wed Mar 12 02:10:30 +0000 2008</created_at>
<favourites_count>3</favourites_count>
<utc_offset>-21600</utc_offset>
<time_zone>Central Time (US & Canada)</time_zone>
<profile_background_image_url>http://static.twitter.com/images/themes/theme1/bg.gif
</profile_background_image_url>
<profile_background_tile>false</profile_background_tile>
<following>false</following>
<notifications>false</notifications>
<statuses_count>427</statuses_count>
<status>
<created_at>Sun Feb 01 21:29:17 +0000 2009</created_at>
<id>1167762741</id>
<text>@adonoho [tweet snipped for privacy].</text>
<source>web</source>
<truncated>false</truncated>
<in_reply_to_status_id>1167558714</in_reply_to_status_id>
<in_reply_to_user_id>882801</in_reply_to_user_id>
<favorited>false</favorited>
<in_reply_to_screen_name>adonoho</in_reply_to_screen_name>
</status>
</user>

详细给出这些信息后,使用 SimpleXML 处理这个 XML 节点集就很简单了,而且使用它可以做一些有用的事情。例如,您可以轻松地编写一个显示 screen_name 元素以及 statuses_count 的工具,可能还会显示最近状态的 created_at 节点。

同样有趣的是,您需要的是 RSS。具体来说,您需要检索用户的时间线。拥有 RSS 格式的时间线后,就可以将它作为一个侧栏小部件、一个独特页面或任何其他可寻址的目标,放在 PHP 驱动站点上。

要实现该操作,请更改上面的例子,使用库的 getUserTimeline() 方法,如清单 5 所示。

清单 5. getUserTimeline() 方法

include_once("twitter.lib.php");

$user = "your-username";
$pw = "your-password";

$twitter = new Twitter($user,$pw);

$rss = $twitter->getUserTimeline("rss", $user);

echo $rss;

如您所见,这个函数返回可立即使用的 RSS。

清单 6. getUserTimeline() 方法的输出

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Twitter / myerman</title>
<link>http://twitter.com/myerman</link>
<description>Twitter updates from Thomas Myer / myerman.</description>
<language>en-us</language>
<ttl>40</ttl>
<item>
<title>myerman: just got my copy of groundswell...also,
just got back from seeing Taken. Liam Neeson kicks butt!</title>
<description>myerman: just got my copy of groundswell...also, just got back from
seeing Taken. Liam Neeson kicks butt!</description>
<pubDate>Sun, 01 Feb 2009 04:16:55 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1166126064</guid>
<link>http://twitter.com/myerman/statuses/1166126064</link>
</item>
<item>
<title>myerman: For those of us trying to learn
Objective-C - some libraries. http://tinyurl.com/dkaj4m</title>
<description>myerman: For those of us trying to learn
Objective-C - some libraries. http://tinyurl.com/dkaj4m</description>
<pubDate>Fri, 30 Jan 2009 20:06:13 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1162686918</guid>
<link>http://twitter.com/myerman/statuses/1162686918</link>
</item>
<item>
<title>myerman: RT @andyhunter Google Chief Economist
on innovation: We’re in the middle of .. a period of “combinatorial innovation.”
http://bit.ly/xgpN</title>
<description>myerman: RT @andyhunter Google Chief Economist
on innovation: We’re in the middle of .. a period of “combinatorial innovation.”
http://bit.ly/xgpN</description>
<pubDate>Fri, 30 Jan 2009 15:35:18 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1161902779</guid>
<link>http://twitter.com/myerman/statuses/1161902779</link>
</item>
<item>
<title>myerman: A-Team movie out next year? I love it when a plan comes together.
http://tinyurl.com/ahckx9</title>
<description>myerman: A-Team movie out next
year? I love it when a plan comes together.
http://tinyurl.com/ahckx9</description>
<pubDate>Thu, 29 Jan 2009 19:21:34 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1159386717</guid>
<link>http://twitter.com/myerman/statuses/1159386717</link>
</item>
<item>
<title>myerman: @andyhunter @cesart it's the pulvinar that gets you in trouble...
every time!</title>
<description>myerman: @andyhunter @cesart
it's the pulvinar that gets you in trouble...
every time!</description>
<pubDate>Thu, 29 Jan 2009 16:44:30 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1158923928</guid>
<link>http://twitter.com/myerman/statuses/1158923928</link>
</item>
<item>
<title>myerman: Create a manga avatar of yourself. http://www.faceyourmanga.com
</title>
<description>myerman: Create a manga avatar of yourself. http://www.faceyourmanga.com
</description>
<pubDate>Thu, 29 Jan 2009 16:43:55 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1158922223</guid>
<link>http://twitter.com/myerman/statuses/1158922223</link>
</item>
<item>
<title>myerman: Zombies ahead on Lamar & 15th....silly hackers!
http://tinyurl.com/c2s3nw</title>
<description>myerman: Zombies ahead on Lamar & 15th....silly hackers!
http://tinyurl.com/c2s3nw</description>
<pubDate>Thu, 29 Jan 2009 13:21:24 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1158382096</guid>
<link>http://twitter.com/myerman/statuses/1158382096</link>
</item>
<item>
<title>myerman: Obama's Mac: http://tinyurl.com/b4hsza</title>
<description>myerman: Obama's Mac: http://tinyurl.com/b4hsza
</description>
<pubDate>Thu, 29 Jan 2009 13:17:58 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1158375012</guid>
<link>http://twitter.com/myerman/statuses/1158375012</link>
</item>
<item>
<title>myerman: OK, looks like I'll be
speaking on Saturday at SxSW 2009. More details
for the freelancer in your life: http://tinyurl.com/df8my9</title>
<description>myerman: OK, looks like I'll be speaking on Saturday at SxSW 2009.
More details for the freelancer in your life: http://tinyurl.com/df8my9</description>
<pubDate>Wed, 28 Jan 2009 22:39:29 +0000</pubDate>
<guid>http://twitter.com/myerman/statuses/1156744158</guid>
<link>http://twitter.com/myerman/statuses/1156744158</link>
</item>

...snip
</channel>
</rss>

有一点要注意:在达到速率限制之前,您不会只想重复调用这个函数。相反,您需要稍微控制一下请求。使用 rateLimitStatus() 方法和一些自己定制的(home-rolled)缓存可以做一些更聪明的事情,以实现本地缓存效果。

如清单 7 所示,rateLimitStatus() 方法是一个简单的请求,您可以使用它来检查您是否已经达到了速率限制 — 检查速率限制状态不会对您不利。您所要做的只是提供一个格式,该函数会完成所有其他事情。

清单 7. rateLimitStatus() 方法

include_once("twitter.lib.php");

$user = "your-username";
$pw = "your-pw";

$twitter = new Twitter($user,$pw);
$status = $twitter->rateLimitStatus("xml");
echo $status;

运行 rateLimitStatus() 方法时,会返回以下 XML。

清单 8. rateLimitStatus() 方法的输出

<?xml version="1.0" encoding="UTF-8"?>
<hash>
<hourly-limit type="integer">100</hourly-limit>
<reset-time type="datetime">2009-02-02T05:44:45+00:00</reset-time>
<reset-time-in-seconds type="integer">1233553485</reset-time-in-seconds>
<remaining-hits type="integer">99</remaining-hits>
</hash>

您需要的是 remaining-hits 节点内的值。如果该值达到 5 左右(或者可能是 10),就转到缓存的 RSS 提要。有了这个 XML 节点集后,您所要做的就是加载 SimpleXML 来快速解析速率限制状态。当然,如果您不熟悉 XML 的用法,那么最好解析为 JSON。

使用 JSON 格式运行相同的代码将得到精简得多的语句:

{"remaining_hits":95,"hourly_limit":100,"reset_time":"Mon Feb 02 05:44:45 +0000 2009",
"reset_time_in_seconds":1233553485}

花些时间用逗号将这个字符串分开,然后再用冒号获取 remaining_hits 的值。当然这很简单。但是,如果您运行的是 PHP V5.2.0 或更高版本,可能已经能使用 json_decode() 方法了。如清单 9 所示,您所要做的只是使用该函数得到 remaining_hits 数字,然后使用一个简单的 if 语句看看该数字是接近于 10 还是更小。如果不是,从 Twitter 拖出 RSS 提要,不过将它保存到一个文件供稍后使用。如果小于 10,就使用本地缓存的保存后的 RSS 文件。

清单 9. 使用 json_decode() 方法

include_once("twitter.lib.php");

$user = "your-username";
$pw = "your-password";

$twitter = new Twitter($user,$pw);
$status = $twitter->rateLimitStatus("json");
$fileName = $user.".rss";

$json_dump = json_decode($status);

$remaining = $json_dump->remaining_hits;

if ($remaining <= 10){

$fh = fopen($fileName, 'r');
$rssData = fread($fh, filesize($fileName));
fclose($fh);
echo $rssData;


}else{

$rss = $twitter->getUserTimeline("rss", $user);

//write to file
//in case we need it!
$fh = fopen($fileName,'w') or die("can't write to file");
fwrite($fh,$rss);
fclose($fh);

echo $rss;
}

剩下要做的是为 PHP 文件指定一个合适的名称(例如,twitterfeed.php),然后合理使用它,即将它作为另一个订阅选项提供给用户,提供 WordPress 侧栏小部件或诸如此类的任何对象。

结束语

通过本文的学习,您初步了解了 Twitter 的工作方式 — 具体来说,您了解了 REST API 公开的内容。您还学习了如何使用公共可用的 PHP 库来简化工作。如果幸运的话,您学到的知识足以构建自己的应用程序和实用工具。

   
3494 次浏览       15
相关文章 相关文档 相关课程



深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]

Android手机开发(一)
理解Javascript
非典型ajax实践
彻底的Ajax
javascript 使用Cookies
使用 jQuery 简化 Ajax 开发
更多...   


Struts+Spring+Hibernate
基于J2EE的Web 2.0应用开发
J2EE设计模式和性能调优
Java EE 5企业级架构设计
Java单元测试方法与技术
Java编程方法与技术


某航空公司IT部 JavaScript实践
某电视软件 HTML5和JavaScript
中航信 JavaScript高级应用开发
大庆油田 web界面Ajax开发技术
和利时 使用AJAX进行WEB应用开发
更多...