1

这是一个奇怪的,任何人都可以在家复制(我认为) - 我正在尝试编写一个简单的服务来在 EC2 上托管的服务上在 Twitter 上运行搜索。Twitter 在 ruby​​ 中运行时 100% 会返回错误,但在其他语言中则不会,这表明这不是 IP 阻塞问题。这是一个例子:

admin@ec2-xx-101-152-xxx-production:~$ 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
admin@ec2-xx-101-152-xxx-production:~$ 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>

这令人困惑……如果 Net::HTTP 中存在某种核心错误,我认为它会同时出现在 windows 和 linux 上,并且如果我被我的 IP 阻止,那么 curl 也不应该工作. 我也在一个新的亚马逊实例上用一个新的 IP 地址尝试了这个。

任何人都应该能够重现这个,因为我正在使用 ec2onrails ami:

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

之后只需 ssh 并运行上面的那些简单行。有人知道发生了什么吗?

谢谢!

4

3 回答 3

2

检查 Twitter API 更改日志。他们正在阻止来自 EC2 的请求,这些请求在 HTTP 请求中没有 User-Agent 标头,因为人们正在使用 EC2 查找垃圾邮件术语。

Twitter 建议将 User-Agent 设置为您的域名,这样他们就可以检查导致问题的网站并与您取得联系。

于 2009-07-05T07:05:28.613 回答
0

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

Twitter API 文档中提供了更多详细信息:

要了解有关错误响应原因的更多详细信息,请阅读您的响应内容或标题。您应该会找到一条错误消息和一些 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
于 2009-06-20T12:23:30.767 回答
0

谢谢(你的)信息。将我的域放在 USER-AGENT 标头中为我解决了同样的问题。我在 EC2 服务器上运行http://LocalChirps.com 。

CURL 代码片段 (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;
}

于 2009-07-20T15:20:38.560 回答