API поиска в Твиттере заблокирован от Amazon EC2 только в Ruby, не скручивается ... это Net :: HTTP? - PullRequest
1 голос
/ 20 июня 2009

Это странная вещь, которую каждый может воспроизвести дома (я думаю) - я пытаюсь написать простой сервис для поиска в Твиттере на сервисе, размещенном в EC2. Твиттер возвращает мне ошибки 100% времени при работе в ruby, но не на других языках, что указывает на то, что это не проблема блокировки 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 - нет. Когда я запускаю на своем локальном окне Windows в IRB, успех:

$ 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 shouldn ' тоже не работает. Я попробовал это на новом экземпляре Amazon тоже со свежим IP-адди.

Любой должен иметь возможность воспроизвести это, потому что я использую ec2onrails ami:

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

Просто введите ssh и запустите эти простые строки выше. У кого-нибудь есть идеи, что происходит?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 05 июля 2009

Проверьте журнал изменений API Twitter. Они блокируют запросы от EC2, у которых нет заголовка User-Agent в HTTP-запросе, потому что люди используют EC2 для поиска терминов для спама.

Twitter рекомендует настроить User-Agent на ваше доменное имя, чтобы они могли проверять сайты, которые вызывают проблемы, и связываться с вами.

0 голосов
/ 20 июля 2009

Спасибо за информацию. Помещение моего домена в заголовок USER-AGENT устранило ту же проблему для меня. Я использую http://LocalChirps.com на серверах EC2.

Фрагмент кода 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;
}

0 голосов
/ 20 июня 2009

Твиттер возвращает сообщение об ошибке HTTP 400, когда один клиент превышает количество максимальных запросов в час. Я не знаю, как настроен ваш экземпляр ec2, поэтому я не знаю, идентифицирован ли ваш запрос с помощью общего IP-адреса Amazon или пользовательского IP-адреса. В первом случае разумно думать, что лимит достигается за очень короткое время.

Более подробная информация доступна в документации Twitter API:

Чтобы получить более подробную информацию о причине ответа об ошибке, прочитайте содержание или заголовки вашего ответа. Вы должны найти сообщение об ошибке и некоторые твиттер-заголовки X-RateLimit.

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

p response.headers
p response.body
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...