无论是超大型的跨国公司,还是小型专卖店,Twitter 都已经成为了大多数公司交流平台策略中必不可少的一环。除了使用 Twitter 直接发送各种消息的核心功能之外,能够分析 Twitter 趋势的能力也是至关重要的,但这一项任务往往并不那么简单。
随着时间的推移,大量的陈旧 Twitter API 被标注为过期,或者索性被完全删除了。新的 API 取代了这些老家伙的位置,但往往也意味着完全不同的使用方式。我们将和 Tweetinvi 的作者 Thomas Imart 进行一次交流,看看他的软件将对使用者带来怎样的帮助。
InfoQ**:市面上已经有许多 Twitter的客户端存在,那么 Tweetinvi的特色又是什么呢?**
Thomas: Tweetinvi 的诞生起源于 2012 年,当时我正在从事一项社交媒体研究的项目,其中一项任务是从来自于 Twitter 流 API 中的一个随机的推文集合进行分析。刚开始时,我试图寻找一些第三方的 C#类库来帮助我完成这一任务,但并没有从中找到能够满足我的研究所需的类库。因此,我最终决定开发一套自己的类库,以实现获取推文的目的。
易用性与生产效率
从 2012 年到现在,Tweetinvi 已经产生了很大的变化,但始终秉持它最初的使命:即简化开发者的工作。Tweetinvi 的最新版本是 0.9,我相信这个版本能够为开发者提供足够高效的生产力,而且比其它任何 API 都要高。作为主要开发者,我的信念是尽最大可能帮助 API 的使用者。我也协助参与了各种研究项目的开发,同时,我也尽量保证能够及时回复论坛上的任何问题。
在文档页面中,你能够找到许多示例,以下是其中的几个示例:
复制代码
// Publish simple tweet var tweet = Tweet.PublishTweet("Hello World!"); // Get my Friends var user = User.GetLoggedUser(); var friends = user.GetFriends(); // Search the tweets containing tweetinvi var tweets = Search.SearchTweets("tweetinvi");正如我所说,Tweetinvi 的创建目的是从 Twitter 流 API 中获取信息。以下代码描述了如何使用 Tweetinvi 查找所有包含了“Tweetinvi”关键字的推文。
复制代码
// Get all tweets containing tweetinvi var filteredStream = Stream.CreateFilteredStream(); filteredStream.AddTrack"tweetinvi"); filteredStream.MatchingTweetReceived += (s, args) => { Console.WriteLine(args.Tweet.Text); };filteredStream.StartStreamMatchingAllConditions();
灵活性
Tweetinvi 是一套为了开发者而开发的 API。每个版本的 Tweetinvi 都包含一个初始的变更记录,我很乐于为了实现开发者的请求而作出改变。因此,如果你需要的特性还没有实现,请在论坛上留言。
可扩展性
Tweetinvi 的强大之处体现在它能够让开发者自行编写查询。最近,有一名用户问我是否能够获取从某个 UserTimeline 的某条特定推文 Id 开始的全部状态。Tweetinvi 实现了大部分开发者所需的各种特性,不过这一特性是预计在今后的某个版本中才会实现的。因此,我用了不到一分钟的时间为他编写了这样一个解决方案:
复制代码
var since_id = 410493427596288001; var query = String.Format("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={0}& since_id={1}&count=3200", "USER_SCREEN_NAME", since_id); var tweetsDTO = TwitterAccessor.ExecuteGETQuery<IEnumerable<ITweetDTO>>(query); var tweets = Tweet.GenerateTweetsFromDTO(tweetsDTO);Tweetinvi 还包括了其它各种实用特性,不过我打算让你通过阅读文档或者查看源代码的方式,自行探索这些特性。
InfoQ**:Twitter在过去一年中不断加强了在访问限制(Rate Limit)方面的控制。Tweetinvi**是通过怎样的方式来解决这一问题的呢?
Thomas:Twitter 的访问限制对于那些拥有超大量用户的应用程序来说影响是最大的,而对于多数开发者来说,只要他们遵照 Twitter API 团队的规定进行请求,很少会受到访问限制方面的影响。
Tweetinvi 与访问限制
Tweetinvi 能够查询到每个帐号的访问限制相关信息,例如查看剩余的请求操作数量,以及离下一次访问限制清空还有多久。
复制代码
RateLimit.GetCurrentCredentialsRateLimits().StatusesHomeTimelineLimit;提示
选择正确的令牌类型
你可以选择使用一个应用程序令牌或者是用户令牌对 Twitter 的终结点进行请求。开发者在大多数情况下应该选择使用用户令牌,因为这种情况下,访问限制只作用于该开发者的特定帐号,而不会影响到应用程序的访问限制。有多种方式可以从 Twitter 那里获取一个令牌,Tweetinvi 提供了两种不同方式的令牌生成器。
慎重地选择你的方法
考虑到访问限制的存在,正确地选择 Twitter API 的终结点,并且根据你所需的对象数目进行决定就变得非常重要了。有些时候你必需作出适当的决定,是要获取包含整个对象的列表,还是简单地返回这些对象的 id。
比方如,同样是在访问限制的 15 分钟时间内,你可以返回 90 万个用户 id 数据,也可以选择返回 1 万 8 千个完整的用户对象列表。
使用流 API!
我在所参与过的项目中经常会遇到某些开发者,他们不会考虑使用 Twitter 的流 API。有些项目在实现中会通过使用多个帐号的方式应对 Twitter 所强制的访问限制措施,这种方式是错误的!
如果你打算获取你的帐号所发的所有推文,你可以选择使用一个计时器,每隔 30 秒调用一次 Timeline.GetHomeTimeline(),也可以选择使用 UserStream(用户流)。
用户流的使用可以不受访问限制的控制,它还允许你实时访问你的帐号的任何更新信息。因此,如果我需要获取某个特定用户时间线上的全部推文,可以通过以下代码实现:
复制代码
var userStream = Stream.CreateUserStream); userStream.TweetCreatedByAnyone += (s, args) => { Console.WriteLine( args.Tweet.Text); }; userStream.StartStream();
InfoQ**:最近,曾一度非常流行的应用 MetroTwit因为令牌限制的原因而关闭了。你对于 Twitter的令牌限制,或者说对于令牌限制这种常见的手段是否有一些自己的想法呢?**
Thomas:对于 Twitter 作出的 API 访问限制的决定,我的感觉不是很好。对于大型的应用程序来说,在这种限制下是不太可能继续使用 API 的。
从另一方面来说,这些限制实际上也只对百万级用户数量的应用才会产生影响。
我必须承认,对于大多数应用程序来说,Twitter 的访问限制是经过精确计算的。我个人曾经从事于多个与 twitter 相关的项目,只有在某个需要对大量的推文和用户进行分析的研究型项目中,我才遇到过因访问限制而产生的问题。
如果你遵循了之前的问题中所提供的所有提示,那么碰到访问限制问题的风险是非常小的。
我非常乐于帮助任何开发者解决他们所遇到的访问限制问题,你可以在任何时候在 Tweetinvi 的论坛上发贴求助。
InfoQ**:对于使用 Twitter的 API,你还有哪些提示吗?**
Thomas:我对开发者的第一个建议,就是仔细阅读 Twitter 的文档。文档中有大量的信息描述了 Twitter API 的行为,以及对于某个终结点的请求会返回怎样的结果。我这样建议的原因在于,对于开发者来说, Twitter API 所返回的信息有时并不是我们所期望的。但有些时候,某些行为即使在文档中也没有完整的描述,你不得不对你的查询所返回的 json 结果进行验证,以了解该 API 的行为。
举例来说,每个查询返回的推文数目都不会超过其 count 参数所指定的数量,但是唯独 SearchTweets 方法会忽略 count 参数,你所获得的结果数目可能会小于预期,即使还有未返回的结果存在。
像这种情况还有好几处存在,因此结论就是对于返回数据要多个心眼,此外还要记得将 Twitter 文档的链接加入你的书签中!
InfoQ**:随着 API的演变,你是否观察到 Twitter在将来会产生怎样的改变,你又希望看到怎样的变化呢?**
Thomas:Twitter 是一个非常有趣的研究课题。它本身是一个从不同用户那里获取意见与反馈的优秀平台。我个人希望看到一些新的特性出现,能够提供更复杂的查询以分析用户的推文,同时也希望查询的访问限制数量能够提高一些。
我认为 Twitter 会尝试去获取更多有关于用户与趋势的信息,Twitter 大概会选择将这种信息进行销售出去,但我也希望看到 Twitter 能通过 API 让我们访问到这些信息。
API 的文档做的非常出色,但有时会有一些过期内容没有更新,有一些部分缺失了一些细节。我希望文档能做到 100% 的准确性,这样也能够让 Tweetinvi 更好地为开发者们提供信息。
此外,在 Twitter 的 API 结果中存在一些不合情理的地方,例如某一条推文明明已经经过了 42 次转发,但是它的 Retweeted 字段仍然显示为 false。类似的例子还有许多,我希望 Twitter 能够修复这些问题,使我们能够为开发者们提供更准确的信息。在 Tweetinvi 的实现中,我决定将这些来自 Twitter 的结果原封不动地提供给开发者,希望这些来自 API 的错误信息在今后的更新后能够被修复。
InfoQ:接下来有什么计划吗?
Thomas:我打算让 Tweetinvi 出现在更多的平台上,因此我目前正在开发支持可移植类库(Portable Class Library – PCL)的 Twitter API 的第一个版本,它是完全基于.NET 可移植类库的子集进行开发的。这意味着你将能够在针对 Windows、Windows 8、Windows Phone 和 Mono 开发的项目中使用 Tweetinvi 类库。
关于受访者
Thomas Imart是一位软件开发者,从他获得第一个计算机科学专业的学位以来,他就专注于.NET 平台上的开发。在毕业那年,他与他的团队一起开发了一个触摸式桌面的原型。在结束了在微软的工作之后,他搬到了纽约,并在那里获得了信息系统的学位。从那时起,他便热衷于应用程序与系统的设计。在史蒂文斯理工学院的研究团队中,他开发了多种工具,以便于对用户在社交网站上的互动行为进行分析。为了更好地对每个月产生的几亿推文进行收集、存储与分析,他打造出了著名的 Tweetinvi 类库。该类库如今已在.NET 世界中得到了广泛的应用,Thomas(也被称做“Linvi”)也在论坛中为开发相关应用提供各种帮助与建议。Thomas 如今居住在伦敦,使用 SQL、WPF、Knockout、MVC、WebApi 等各种技术参与多个不同项目的开发。
评论