2009-06-20 15 views
1

这是一个奇怪的,任何人都可以在家重新录制(我认为) - 我正在尝试编写一个简单的服务,以在托管在EC2上的服务上的Twitter上运行搜索。当使用ruby运行时,Twitter会以100%的时间返回错误,但不会以其他语言显示,这表明它不是IP阻塞问题。这里是一个例子:Twitter搜索api仅在Ruby中被亚马逊EC2封锁,不卷曲......这是Net :: HTTP吗?

[email protected]:~$ irb 
irb(main):001:0> require 'net/http' 
=> true 
irb(main):002:0> res = Net::HTTP.post_form(URI.parse('http://search.twitter.com/search.json'), {'q' => 'twitter'}) 
=> #<Net::HTTPBadRequest 400 Bad Request readbody=true> 
irb(main):003:0> exit 
[email protected]:~$ curl http://search.twitter.com/search.json?q=twitter 
{"results":[{"text":"&quot;Social Media and SE(Search Engine) come side by side to help promote your business and bran...<snip/> 

正如你所看到的,CURL的工作原理,irb没有。当我在IRB在我的本地的Windows中运行,成功:

$ irb 
irb(main):001:0> require 'net/http' 
=> true 
irb(main):002:0> res = Net::HTTP.post_form(URI.parse('http://search.twitter.com/search.json'), {'q' => 'twitter'}) 
=> #<Net::HTTPOK 200 OK readbody=true> 

这是令人困惑......如果有某种在网络核心的bug :: HTTP,我想它会显示两个窗口上和Linux,如果我被我的IP阻止,那么curl也不应该工作。我用新鲜的IP addy在一个新的亚马逊实例上尝试了这一点。

任何人都应该能够摄制这个“因为我使用ec2onrails AMI:

ec2-run-instances ami-5394733a -k testkeypair 

只是SSH方式后并运行高于简单的线条。任何人有想法发生了什么?

谢谢!

回答

0

当单个客户端超出每小时最大请求数时,twitter会返回HTTP 400错误消息。我不知道您的ec2实例如何配置,因此我不知道您的请求是由共享的亚马逊IP还是自定义IP标识的。在第一种情况下,认为极限在很短的时间内达到是合理的。

更多细节在Twitter的API doumentation可供选择:

具有关于错误响应的原因的更多细节,看到您的回复内容或标题。您应该找到一条错误消息和一些X-RateLimit twitter标题。

require 'net/http' 
response = Net::HTTP.post_form(URI.parse('http://search.twitter.com/search.json'), {'q' => 'twitter'}) 

p response.headers 
p response.body 
+0

对,这是我考虑的第一件事情,但如果我打了极限,那么发送随即卷曲的请求也应报告故障。 我正在使用与静态IP关联的实例,并且我检查并请求确实来自分配的静态IP。响应机构增加了很少的信息: “<!DOCTYPE HTML PUBLIC \ “ - // IETF // DTD HTML 2.0 // EN \”> \ n \ n 400错误的请求 \ n \ n

坏请求

\ n

您的浏览器发送一个请求这台服务器无法理解。
\ n

\ n“ – esilver 2009-06-20 16:45:41

+0

而且php也会出现400错误,如果这是一个简单的被阻止的IP问题,这将是有意义的,但事实仍然是从命令行卷曲工作...我想知道如果curl添加了一些头文件(一个用户代理,也许??),叽叽喳喳喜欢看到......我即将写代码手动调用curl从我的ruby脚本 – esilver 2009-06-20 18:00:10

2

检查Twitter API更新日志。他们阻止来自EC2的HTTP请求中没有用户代理头的请求,因为人们使用EC2来查找垃圾邮件条款。

Twitter建议将用户代理设置为您的域名,以便他们可以检出导致问题并与您联系的网站。

0

感谢您的信息。将我的域名置于USER-AGENT标头中对我来说也是同样的问题。我在EC2服务器上运行http://LocalChirps.com

卷曲代码段(PHP):



$twitter_api_url = 'http://search.twitter.com/search.atom?rpp='.$count.'&page='.$page; 
$ch = curl_init($twitter_api_url); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_USERAGENT, 'LocalChirps.com'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$twitter_data = curl_exec($ch); 
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 
if ($httpcode != 200) { 
    //echo 'error calling twitter'; 
    return; 
}