2009-06-20 1 views
1

Это странный вариант, который каждый может воспроизвести дома (я думаю). Я пытаюсь написать простой сервис для запуска поисковых запросов в Twitter на службе, размещенной на EC2. Twitter возвращает мне ошибки в 100% случаев при запуске в рубине, но не на других языках, что указывает на то, что это не проблема блокировки IP-адресов. Вот пример:Twitter поиск api заблокирован от Amazon EC2 только в Ruby, а не завиток ... это 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, успех:

$ 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, я думаю, было бы показать, как на окнах и linux, и если я заблокирован своим IP-адресом, то завиток тоже не должен работать. Я попробовал это на новом экземпляре Amazon со свежим IP addy.

Любой должен быть в состоянии Репрографический эту «причину я использую ec2onrails Ami:

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

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

Спасибо!

ответ

0

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

Более подробную информацию можно получить в API doumentation Twitter:

Чтобы получить более подробную информацию о причине ответа ошибки, прочитать содержание ответа или заголовков. Вы должны найти сообщение об ошибке и некоторые заголовки заголовков 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 
+0

Право, это было первое, что я считал, но если я бил макс, то ротор отправлен запрос сразу же после этого следует также сообщить о сбое. Я использую экземпляр, связанный со статическим IP-адресом, и я проверил, и запросы действительно поступают из выделенного статического IP-адреса. Тело ответа добавляет немного информации: " \ п \ п 400 Bad Request \ п \ п

Bad Request \ п

Ваш браузер послал запрос, что этот сервер не мог понять.
\ п

\ п " – esilver

+0

И php также терпит неудачу с ошибкой 400. Было бы разумно, если бы это была простая проблема с блокировкой IP, но факт остается фактом, что завиток из командной строки работает ... Я задаюсь вопросом, добавляет ли curl некоторый заголовок (возможно, пользовательский агент?), Который щебет любит см. ... Я собираюсь просто написать код для ручного вызова curl из моего ruby-скрипта. – esilver

+1

Это пустая строка пользовательского агента. Это не имело никакого отношения к тому, что листы запроса были удалены. Я решил эту проблему в одной строке в рубине: Twitter :: Search.default_options = {: заголовок => { 'User-Agent' => 'YOUR_USER_AGENT_STRING'}} Я также подал вопрос с щебет жемчужиной jnunemaker на github – esilver

2

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

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

+0

Где можно найти журнал изменений? Я столкнулся с этой же проблемой с драгоценным камнем tweetstream. Я установил user_agent для своего доменного имени, но он по-прежнему неавторизован. Точно такие же учетные данные при запуске с моего ноутбука (который имеет другой IP-адрес). –

0

Спасибо за информацию. Помещение моего домена в заголовок 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; 
} 

Смежные вопросы