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 addy を使用して、新しい Amazon インスタンスでもこれを試しました。

私はec2onrails amiを使用しているので、誰でもこれを再現できるはずです:

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

その後、ssh して上記の単純な行を実行するだけです。何が起こっているのか誰にも考えがありますか?

ありがとう!

4

3 に答える 3

2

Twitter API の変更ログを確認してください。EC2 からの HTTP リクエストに User-Agent ヘッダーがないリクエストをブロックしているのは、人々が EC2 を使用してスパムの用語を見つけているためです。

Twitter では、User-Agent をドメイン名に設定することをお勧めしています。これにより、Twitter は問題を引き起こしているサイトをチェックアウトして、あなたと連絡を取ることができます。

于 2009-07-05T07:05:28.613 に答える
0

HTTP 400 エラー メッセージは、1 つのクライアントが 1 時間あたりの最大要求数を超えると、Twitter によって返されます。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 に答える