2

Twitter api を使用してアプリケーションを開発しています。これには、ユーザーが存在するかどうかを確認するメソッドの作成が含まれます。これが私のコードです:

  public static bool checkUserExists(string user)
    {
        //string URL = "https://twitter.com/" + user.Trim();
        //string URL = "http://api.twitter.com/1/users/show.xml?screen_name=" + user.Trim();
        //string URL = "http://google.com/#hl=en&sclient=psy-ab&q=" + user.Trim();
        string URL = "http://api.twitter.com/1/users/show.json?screen_name=" + user.Trim();
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(URL);
        try
        {
            var webResponse = (HttpWebResponse)webRequest.GetResponse();
            return true;
        }
        //this part onwards does not matter
        catch (WebException ex)
        {
            if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
            {
                var resp = (HttpWebResponse)ex.Response;
                if (resp.StatusCode == HttpStatusCode.NotFound)
                {
                    return false;
                }
                else
                {
                    throw new Exception("Unknown level 1 Exception", ex);
                }
            }
            else
            {
                throw new Exception("Unknown level 2 Exception", ex);
            }
        }
    }

問題は、Google 検索クエリを含め、コメントされている URL のいずれかを使用して、メソッドを呼び出しても 2、3 回以上機能しない (応答がない) ことです (Twitter が原因である可能性があると思いました)。 API 制限)。デバッグ時に、次の場所でスタックしていることを示しています。

var webResponse = (HttpWebResponse)webRequest.GetResponse();

これが私がそれを呼び出す方法です:

Console.WriteLine(TwitterFollowers.checkUserExists("handle1"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle2"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle3"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle4"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle5"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle6"));

せいぜい2〜3行の出力が得られます。誰かが間違っていることを指摘できますか?

更新 1:
15 秒ごとに 1 つのリクエストを送信しましたが (十分に制限内)、それでもエラーが発生します。一方、リクエストを送信し、アプリを閉じて再度実行すると、非常にうまく機能します (平均して、5 秒ごとに 1 つのリクエストが発生します)。レート制限は 1 時間あたり 150 回の呼び出しTwitter FAQです。

また、しばらく待ったところ、レベル 2 でこの例外が発生しました: http://pastie.org/3897499

更新 2: 意外に聞こえるかもしれませんが、フィドラーを実行すると完全に動作します。このプロセスをターゲットにするかどうかに関係なく!

4

2 に答える 2

4

表示されている効果は、ほぼ確実に、Twitter APIのレート制限タイプのポリシー(複数のリクエストが連続して発生する)によるものです。彼らはあなたが彼らのAPIをどのように使用しているかを注意深く見守っています:最初のステップは彼らの利用規約とレート制限に関するポリシーをチェックし、あなたが準拠していることを確認することです。

2つのことが私に飛び出します:

  1. 複数のリクエストが連続してAPIにヒットしています。Google検索を含むほとんどのRESTAPIでは、これを実行できません。これらのAPIは非常に目に見えるターゲットであり、サービス拒否攻撃の防止に積極的に取り組むことは理にかなっています。
  2. リクエストにユーザーエージェントが指定されていません。ほとんどのAPIでは、APIがユーザーを識別できるようにするために、意味のあるUAを送信する必要があります。
于 2012-05-11T22:40:05.087 に答える
2
  1. の下にある管理されていないリソースを扱っていることに注意してくださいHttpWebResponseDispose()そのため、適切なタイミングで呼び出すか、usingステートメントでオブジェクトをラップすることは賢明であるだけでなく、ブロックを回避するためにも重要です。
  2. また、var は匿名型や Linq クエリの結果などを処理するのに最適ですが、松葉杖にはなりません。型を十分に認識しているのに、なぜ var を使用するのでしょうか。(つまり、すでに へのキャストを実行していますHttpWebResponse。)
  3. 最後に、このようなサービスは、悪用を防ぐために、1 秒あたりの接続速度や同時接続数を制限することがよくあります。HttpWebResponse オブジェクトを破棄しないと、許可されている同時接続数に違反する可能性があります。頻繁にクエリを実行すると、レート制限を破ることになります。
于 2012-05-11T22:57:22.220 に答える