与 Twitter 对话

作者:Reuven Lerner

将 Twitter 集成到您的应用程序中既简单、有趣又实用。

我是一个非常快速地接受许多新软件技术的人。我尝试新的编程语言、浏览器、数据库和框架,毫不犹豫。但是当涉及到社交网络时,我有点像勒德分子,等待看看所有的喧嚣是怎么回事,然后再将它们融入我的生活。当然,我几乎在 Facebook 一推出就注册了,但我并没有在那里发布太多内容。我确实使用 LinkedIn,主要是收集和查找联系人,但我也不经常在那里发布内容,除非我宣布一个我已添加到 SlideShare 的演示文稿。

Twitter 有些不同。似乎有些人认为 Twitter 是终极的沟通方式。我已经使用 Twitter 一段时间了,但除了偶尔涉足那个世界之外,我并没有真正关注它。即使现在,在几个月前决定我应该尝试更深入地了解 Twitter 之后,我发现虽然我每天都会浏览我的信息流几次,但我每隔几周才发一次推文。你可以叫我恐龙,但我仍然更喜欢使用电子邮件与朋友和家人保持联系,而不是 140 个字符的消息。

尽管我不认为 Twitter 是人际沟通的绝佳媒介,但我最近开始欣赏它的其他原因。具体来说,我发现(也许在世界其他地方很久之后才发现)将 Twitter 用作一种公共日志文件可以使 Web 应用程序更可见,从而向世界其他地方更新您的工作和在线社区的状态。这样做不仅可以让人们了解您正在做什么——并有可能通过“转发”您的消息给关注者将其重新广播到全世界——而且还可以提高您应用程序的 SEO,或在各种搜索引擎上的可见性。最后,您可以使用 Twitter 通过关注其他人来引起人们对您的在线存在的关注。(其想法是,当他们收到您的关注请求时,他们可能会尝试了解更多关于您的信息,探索您的网站甚至回粉您。)

我听起来可能像一个社交媒体顾问,但我已经看到了 Twitter 可以给应用程序带来的改变。我最近将我的博士论文项目(建模公地)连接到 Twitter,这样每个公共操作都会发送到 Twitter 信息流。推文更新和关注其他人的组合对访问我网站的访问者数量、他们停留的时间以及他们浏览的页面数量产生了显着且直接的影响。现在,我不是在谈论每月数百万的访问者。我的应用程序仍然主要引起与 NetLogo 建模环境合作的一小群人的兴趣。但是这种变化是显而易见的,我勉强承认我欠 Twitter 一些。

在本文中,我将探讨我在应用程序中使用 Twitter 所做的一些事情。从技术角度来看,您会看到实现相当简单。但我认为,我所学到的东西可能对任何运行 Web 应用程序的人都有意义,特别是那些试图向公众宣传其应用程序的人。此外,尽管有很多充分的理由质疑 Twitter 的商业行为及其与开发人员的关系,但毫无疑问,其对 API 细节的关注为我们所有想要为我们的应用程序提供 API 的人提供了一个模型。

注册 Twitter

我假设任何阅读本文的人都已经创建了一个 Twitter 帐户,或者能够在 Twitter.com 上弄清楚如何创建。当然,通过 Twitter.com 网站,您可以执行所有您可能期望的事情,例如发推文、转发、关注和搜索。

Twitter 的 API 允许您通过代码执行所有这些操作。也就是说,您不需要亲自去撰写推文。您可以编写一个程序来为您执行此操作。为了实现这一点,您需要做两件事:注册 Twitter 的 API 服务并安装一个知道如何与 Twitter API 通信的库。

为了注册 Twitter API,您需要访问“开发者”站点 http://dev.twitter.com。请注意,即使您已经登录到主要的 Twitter 网站,您也需要使用您的 Twitter 用户名和密码登录。这两个网站似乎不共享登录会话。

进入开发者站点后,您需要创建一个新的应用程序。应用程序名称需要是唯一的,但不要太担心。您不仅需要提供名称,还需要提供与应用程序关联的描述和 URL。同意条款,填写验证码,您就可以开始了。请注意,存在许多类型的 Twitter 应用程序,包括许多(包括移动设备)代表用户发布到 Twitter 的应用程序。我在本文中演示的模型是应用程序向 Twitter 发送更新,这意味着您不会遇到此类问题——您不需要回调 URL 或任何特殊的登录配置。

也许关于设置 Twitter 最令人困惑的事情(至少对我而言)是应用程序的默认权限允许您检索推文,但不允许发布推文。要允许您的应用程序具有读写访问权限,请转到设置选项卡并指示您需要读写访问权限,甚至读、写和直接消息。您不会将所有这些功能用于此示例,但是如果没有写入权限,您的应用程序将无法发布到 Twitter。

现在是最重要的部分,密钥:Twitter 的身份验证模型需要两个令牌。首先,是您的访问令牌,它允许您通过 API 访问 Twitter。第二个是“消费者密钥”,它描述了您的特定应用程序和用途。每个密钥都有一个随附的密钥,您应该将其视为密码。因此,将这些密钥直接放入您的应用程序可能不是一个好主意。您最好将它们放在环境变量中,从而避免在版本控制中包含密钥。

用于 Ruby 的“Twitter” Gem

本专栏的读者都知道我喜欢 Ruby 语言,因此听到我打算在我的示例中使用 Ruby 也就不足为奇了。但是,几乎每种现代语言都有 Twitter API 客户端,可以很容易地从您在编程中喜欢使用的任何语言访问。

twitter Ruby gem,与所有 Ruby gem(库)的情况一样,可以通过 gem 程序安装,该程序随附现代版本的 Ruby。该 gem 目前由 Erik Michaels-Ober 维护,他在 GitHub 上也称为“sferik”。您可以键入


gem install twitter -V

,应该会安装该 gem。在许多系统上,包括那些未运行像 rvm 这样的 Ruby 版本管理器的系统,您需要以 root 用户身份登录时执行上述行。

安装 gem 后,您可以使用它。此过程分为三个部分:将 gem 引入程序,配置它以使用您的密钥和密钥,然后执行 Twitter 命令。第一个部分由 Ruby require 命令处理,该命令查看已安装的 gem,以及 Ruby 核心和标准库。

客户端的配置在看起来像这样的块中相当简单地处理(填写您从 Twitter 的 API 文档中获得的值)


twitter_client = Twitter::REST::Client.new do |config|
  config.consumer_key = CONSUMER_KEY
  config.consumer_secret = CONSUMER_SECRET
  config.oauth_token = OAUTH_TOKEN
  config.oauth_token_secret = OAUTH_SECRET
end

请注意,您不仅仅是在 Twitter::REST::Client 上执行“new”方法,而且还在返回一个值。因此,与以前版本的 Ruby 的 Twitter gem 相比,您应该接受返回的对象,这将是您希望采取的所有其他操作的基础。

最后,您使用“update”方法发送推文


tweet = twitter_client.update("Hello, world. Tweet tweet.")

调用 #update 方法的效果是将消息发送到 Twitter。如果您转到您的 Twitter 用户的网页,您会发现已发送了一条新消息,就像您键入的那样。

如果您捕获从 twitter_client.update 调用返回的值,您会看到它是一个 Twitter::Tweet 的实例,这是一个表示推文的 Ruby 对象。此对象提供了您希望和期望从与 Twitter 相关的事物中获得的功能。例如


tweet.user          # tells us who wrote the tweet
tweet.retweeted?    # indicates whether it was retweeted
tweet.favorited?    # indicates whether it was marked as a favorite

现在,您也可能根本不会收到推文对象,而是“update”方法会引发异常。例如,Twitter 禁止用户发送相同的推文,至少在短时间内是这样。因此,如果您第二次发送上面的“Hello, world”推文(来自上面的示例),您将收到一个异常


Twitter::Error::Forbidden: Status is a duplicate.

当然,您可以使用以下方法捕获此类错误


begin
  tweet = twitter_client.update("Hello again, 
  ↪@reuvenmlerner  Tweet tweet.")
rescue Twitter::Error::Forbidden => e
  puts "You already tweeted that."
rescue => e
  puts e.class    # Twitter::Error::Forbidden
  puts e.message  # 'Status is a duplicate.'
end

如果您在推文中包含 Twitter @用户名、主题标签或 URL,则会神奇地自动发生相应的操作。因此


tweet = twitter_client.update("Go to @reuvenmlerner's 
 ↪site at http://lerner.co.il/")

在上面的推文中,URL 将使用 Twitter 的标准 t.co 域自动缩短。同样,@reuvenmlerner(我的 Twitter 句柄)将变成一个链接。您可以使用推文上的方法访问这两者


tweet.urls           # returns an array of Twitter::Entity::URI
tweet.user_mentions  # returns an array of 
                     # Twitter::Entity::UserMention

您可以更普遍地向 Twitter 询问有关推文的信息。例如,您可以使用以下方法获取用户发送的最新推文


twitter_client.user_timeline("reuvenmlerner")

,它返回一个推文对象数组。您可以将“text”方法应用于第一个元素,从而从用户最新的推文中获取文本


twitter_client.user_timeline("reuvenmlerner")[0].text

如果推文中嵌入了 URL,您可以将其返回


twitter_client.user_timeline("reuvenmlerner")[1].urls

此方法返回一个 Twitter::Entity::URI 对象数组,每个对象都具有属性,例如“url”和“expanded URL”。

集成到您的应用程序中

如您所见,使用 Twitter 非常容易。连接到 Twitter 的启动时间可能需要一点时间——根据我的经验,最多两秒——但发推文和查询 Twitter 花费的时间非常少。作为 API 的使用者,很明显他们已经努力使其尽可能快地执行。这对于我们所有创建 API 的人来说都是一个教训。我们都知道网页应该快速加载,并且加载时间过慢可能会阻止人们留在网站上。

API 调用通常嵌入在另一个应用程序中,这意味着如果 API 调用需要时间,则应用程序本身会感觉迟缓。因此,缓慢的 API 调用将导致来自 API 客户端的响应缓慢——并可能阻止人们使用您的 API。

但是您会在哪里使用此类 API 调用?您为什么要希望在您的网站上使用 Twitter?

Twitter API 的一个简单用途是显示用户最近的推文。例如,如果您的公司(或您个人)使用 Twitter 发送有关您正在做什么的消息,您可以看到将这些推文包含在网页中会非常容易。使用像 Rails 这样的 MVC 系统,您只需抓取推文(使用上面显示的“user_timeline”方法),并将结果粘贴到您的主页上。现在,您的主页提供了 Twitter 信息流的另一个视图,从而加强了其对您公司重要性和用途的认识。

我一直在做一些稍微不同的事情。正如我之前提到的,我已经开始使用 Twitter 来记录我在为我的论文开发的应用程序中的公共活动。每次有新用户加入、发布新内容或有人向论坛添加帖子时,我都会发送一条关于该主题的新推文。就其本身而言,这并没有做太多事情;Twitter 上充满了文本和 URL。但我当然发现,通过确保我的推文被大量人关注和看到,我增加了访问我网站的用户数量。

换句话说,通过推文宣传我网站上的活动,我让我的网站在世界范围内获得了更多的曝光率。此外,真正想了解我的应用程序在做什么的人可以关注他们 Twitter 信息流中的链接并继续关注。

通过在我的推文中添加 #NetLogo 主题标签,我也使得那些在 Twitter 上搜索提及我们的建模环境的人可以轻松地找到和识别我的推文(以及我的网站)。Google 对推文进行索引这一事实提高了我的网站在在线搜索与建模相关的网站的人群中的可见性。

净效果相当巨大。在开始使用 Twitter 宣布我网站上的更新后的两周内,访问我网站的人数急剧增加。并非巧合的是,我的网站在 Google 中的排名也明显提高。

现在,如果这是一个商业网站,而不是用于协作建模的免费基础设施,我将需要检查第二件事,即“转化率”——也就是说,有多少访问我网站的人也成为了付费客户。但是对于我的小型教育网站,看到推文带来的改变真是令人着迷。

我做了什么?说实话,不多。我设置了这样的东西,每次向系统添加新的模型版本、论坛帖子或人员时,都会使用上面演示的“update”方法发送一条新的推文。由于“update”方法的延迟相对较低,我甚至在 Rails 中的 after_create 回调中内联执行此操作,而不是将其排队到后台作业中。

到目前为止,我在这所有过程中面临的最大技术挑战是重复推文的问题。当我第一次设置 Twitter 信息流时,我将添加的论坛帖子的推文定义为


Reuven Lerner has added a comment about the Foobar model!

这种风格的推文的问题在于,它很快就会导致重复——从而导致应用程序内部的错误。因此,我确保每条推文都在某处包含一个唯一的数字,通常计算已经创建了多少个类似的对象。例如


Reuven Lerner wrote the 5th comment about the Foobar model!

以上确保了——假设用户和模型名称是唯一的——不会有重复项,从而避免了问题。

除了对用户、SEO 和有兴趣关注我的工作的人的优势之外,我还发现即使在我不知情的情况下看到推文发布也令人非常满意。这在某些方面类似于看到我孩子的创意作品,但(显然)情感色彩较少。

结论

向 Web 应用程序添加自动推文很容易做到,并且可以带来显着的好处。对于您的用户,它为他们提供了一种无需访问网站或使用 RSS 阅读器即可关注您的应用程序中发生的事情的方式。对于您的网站,自动推文将有助于吸引新访问者,提高 SEO 并总体上提高您项目的知名度。

资源

当然,Twitter 的网址是 http://twitter.com。开发者和 API 文档位于 http://dev.twitter.com。用于 Twitter 的 Ruby gem,显然已被下载超过一百万次 (!),位于 http://sferik.github.io/twitter

Reuven M. Lerner 是一位长期从事 Web 开发的开发者,提供 Python、Git、PostgreSQL 和数据科学方面的培训和咨询服务。他撰写了两本编程电子书(Practice Makes Python 和 Practice Makes Regexp),并在 http://lerner.co.il/newsletter 发布免费的程序员每周新闻通讯。Reuven 的 Twitter 账号是 @reuvenmlerner,与妻子和三个孩子住在以色列的莫迪因。

加载 Disqus 评论