BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

采访Tweetinvi的作者Thomas Imart

| 作者 Jonathan Allen 关注 612 他的粉丝 ,译者 邵思华 关注 3 他的粉丝 发布于 2014年9月12日. 估计阅读时间: 14 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

无论是超大型的跨国公司,还是小型专卖店,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等各种技术参与多个不同项目的开发。

查看英文原文:Interview with Thomas Imart, Creator of Tweetinvi

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT