简介
Twitter 现已成为社交网络中的佼佼者。Twitter 只允许用户发布不多于 140 个字符的内容,谁能够想到,这个过去毫不起眼的小网站如今却价值十多亿美元,拥有数百万用户,Twitter 平台上已构建了大量的应用程序,并且不断有新的开发人员准备投入这一浪潮中。
本文并不打算介绍 Twitter(事实上,也没有这个必要)。相反,本文将介绍如何访问 Twitter 平台来构建出色的命令行应用程序。Twitter 支持各种编程语言,包括 C++、Java?、Perl、Ruby、PHP 和 Python。对于每种语言,都有大量的库或包可以帮助您完成大量工作。
本文将介绍如何使用 Ruby 来访问 Twitter。您应该对 Ruby 有所了解,但是即使不具备这方面的知识,也很容易快速掌握 Ruby。
安装 Twitter gem
一些 gem 可用于从 Ruby 访问 Twitter(参见 参考资料,以获得有关的更多信息)。对于本文,我选择使用 twitter,这是由 John Nunemaker 编写的 Ruby 包装器。安装 gem 非常简单:
bash$ gem install twitter
该命令用于在您的机器上安装 Twitter 客户端。如果您有一个定制的 gem 安装文件夹,那么首先需要从脚本中调用 rubygems,然后调用 twitter。下面展示了具体过程:
require 'rubygems' require 'twitter'</div>
第一个 Twitter 脚本
现在,您已经准备好构建第一个应用程序,该应用程序用于检测您所关注的人的位置。首先创建一个脚本,它会获取其他人的姓名,并告诉您他们的当前位置。清单 1 显示了相关代码。
清单 1. 跟踪用户位置
require 'rubygems'
require 'twitter'
def track
ARGV.each do |name|
puts name + " => " + Twitter.user("#{name}").location
end
end
</div>
track
这段代码执行了哪些操作?如果您刚刚接触 Ruby,则需要向您解释一下,ARGV 是一个数组,它提供脚本对命令行参数的访问。Twitter.user API 返回有关您对其位置感兴趣的人的信息。调用以下脚本可以获得 Lady Gaga、Ashton Kutcher 和 Oprah Winfrey 的当前位置:
bash$ ./location_tracker.rb ladygaga aplusk Oprah ladygaga => New York, NY aplusk => Los Angeles, California Oprah => Chicago, IL</div>
在 Twitter 上实现用户搜索并了解认证情况
现在,让我们搜索 Twitter 上的一些现有用户。如果可以猜出用户的 Twitter ID,那么可以使用以下命令行:
require 'rubygems' require 'twitter' puts "User exists" if Twitter.user?(ARGV[0])</div>
不过,一般情况下无法猜出用户的 ID。因此,需要提供搜索用户名的功能。这需要用以下代码实现,该代码将搜索名称与 Arpan 匹配的所有用户:
require 'rubygems'
require 'twitter'
names = Twitter.user_search("Arpan")
</div>
但是这段代码未能正常工作。清单 2 显示的错误日志告诉您问题出现在哪里。
清单 2. 无法执行用户搜索
Twitter::Unauthorized: GET https://api.twitter.com/1/users/search.json?q=Arpan% 20Sen: 401: Could not authenticate you. from D:/Ruby/lib/ruby/gems/1.8/gems/twitter-1.6.2/lib/faraday/response/r aise_http_4xx.rb:12:in `on_complete' from D:/Ruby/lib/ruby/gems/1.8/gems/faraday-0.7.4/lib/faraday/response.r b:9:in `call' from D:/Ruby/lib/ruby/gems/1.8/gems/faraday-0.7.4/lib/faraday/response.r b:62:in `on_complete'</div>
从这段代码可以看出,您首先需要通过 Twitter 的认证,然后才能执行其他操作。这里的认证不是要求您进行登录并输入密码;而是指对您的脚本(在Twitter 中称为 应用程序)进行认证。请牢记这一差异,然后访问 http://dev.twitter.com/apps,并使用平常的帐号和密码进行登录。Twitter 会要求您提供应用程序名称、描述和应用程序的占位符 (placeholder) 网站。提供这些信息后,还必须提供以下四项内容实现脚本认证:
- 用户密匙(Consumer key)
- 用户秘密令牌(Consumer secret token)
- 用户 OAuth 密匙
- 用户 OAuth 秘密令牌
现在,在 Ruby 代码内部,您需要使用这些选项填充 Twitter.configure 对象。清单 3 显示了相关代码。
清单 3. 配置脚本进行认证
Twitter.configure do |config| config.consumer_key = "mT4atgBEKvNrrpV8GQKYnQ" config.consumer_secret = "BiQX47FXa938sySCLMxQCTHiTHjuTTRDT3v6HJD6s" config.oauth_token = "22652054-Yj6O38BSwhwTx9jnsPafhSzGhXvcvNQ" config.oauth_token_secret = "o9JuQuGxEVF3QDzMGPUQS0gmZNRECFGq12jKs" end</div>
注意,清单 3 中的条目是虚构的:您需要在脚本中填充自己的内容。顺利完成认证后,就可以搜索名为 Arpan 的人(参见下面的 清单 4)。
清单 4. 在 Twitter 上搜索用户
require 'rubygems' require 'Twitter' Twitter.configure do |config| config.consumer_key = "mT4atgBEKvNrrpV8GQKYnQ" config.consumer_secret = "BiQX47FXa938sySCLMxQCTHiTHjuTTRDT3v6HJD6s" config.oauth_token = "22652054-Yj6O38BSwhwTx9jnsPafhSzGhXvcvNQ" config.oauth_token_secret = "o9JuQuGxEVF3QDzMGPUQS0gmZNRECFGq12jKs" end users = Twitter.user_search(ARGV[0]) users.each do |user| print "\n" + user.name + " => " print user.location unless user.location.nil? end</div>
现在,将脚本保存为 search_for.rb,并在命令行中以 ./search_for.rb Arpan 形式调用脚本后,您将获得 清单 5 所示的用户名称。
清单 5. 清单 4 的代码输出
Arpan Jhaveri => New York Arpan Boddishv => Arpan Peter => Bangalore,India Arpan Podduturi => NYC Arpan Kumar De => IIT Kharagpur Arpan Shrestha => Kathmandu, Nepal Arpan Divanjee => Mumbai,India Arpan Bajaj => Bay Area, CA</div>
您可能期望获得更多结果。Arpan 这个名字(印度姓名)并不少见,那么为什么搜索结果这么少?最后您会发现,user_search 使用了一个可选参数(一个 Ruby hash 表),您也可以指定可产生更多结果的选项。因此,可以稍微修改一下清单 5 的代码,传递可选的 hash 参数(#)并预填充它的值。例如,如果希望在一个页面中填充 15 项结果,那么可以使用 清单 6 中的代码。
清单 6. 在每个页面显示 15 项搜索条目
require 'rubygems'
require 'twitter'
#.. authentication code here
users = Twitter.user_search(ARGV[0], {:per_page => 15})
#... same as Listing 10
</div>
是不是可以在每个页面中显示 100 项条目?不行,Twitter.user_search 允许每页显示的最多条目为 20。清单 7 显示了如何在每个页面中显示 20 个条目。
清单 7. 每个页面显示 20 个条目
#... usual authentication stuff
pagecount = 0
while pagecount < 10
u = Twitter.user_search("#{ARGV[0]}", {:per_page => 20, :page => pagecount})
u.each do |user|
print "\n" + user.name + " => " + user.screen_name
print " => " + user.location unless user.location.nil?
end unless u.size < 20
pagecount += 1
end
</div>
现在看上去好多了。您现在可以根据偏好名和用户的屏幕名称搜索用户,下面让我们做一些更有趣的事情。让我们搜索居住在纽约的、喜欢 Ruby 的名为 Nick 的人。您可以从 user_search 获得姓名和位置,但是如何处理喜欢 Ruby 的搜索要求?这引入了下一个需要学习的内容:创建定制搜索客户端。
使用 Twitter::Search 类
使用 Twitter::Search 类创建定制搜索客户端。清单 8 显示了相关代码。
清单 8. 学习使用 Twitter::Search 类
#... user authentication
pagecount = 0
while pagecount < 10
u = Twitter.user_search("#{ARGV[0]}", {:per_page => 20, :page => pagecount})
u.each do |w|
if w.location == "New York"
results = Twitter::Search.new.from(w.screen_name).containing("ruby").fetch
puts w.screen_name if results.size > 10
end
end unless u.size < 20
pagecount += 1
end
</div>
这里发生了什么呢?代码首先使用 Twitter::Search.new 创建了一个搜索客户端。接下来,要求搜索客户端从包含 ruby 的相应用户那里获取所有 tweet。最后,代码返回一组结果,

