0

数日間、画像を画像ホスト (imgur.com) にリモートアップロードするプログラムを作成しようとしました。Wireshark を使用して、ブラウザーから送信された http 要求をスニッフィングし、同様のヘッダーとパラメーターを使用して HttpWebRequest を作成しました。しかし、サーバーはいつも何か奇妙なものを私に送り返してきます。コードを見てください (このコードは単純化されています):

static void Main(string[] args)
    {
        ServicePointManager.Expect100Continue = false;
        CookieContainer cc = new CookieContainer();
        List<string> formData = new List<string>();

        //The first request - login
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://imgur.com/signin");
        configRequest(request, cc);
        //add POST params
        add(formData, "username", "abcdefgh"); //this is a working account,
        add(formData, "password", "abcdefgh"); //feel free to use it if you 
        add(formData, "remember", "remember"); //want to test
        add(formData, "submit", "");
        writeToRequestStream(request, formData);
        //send request
        request.GetResponse();

        //The second request - remote upload image
        request = (HttpWebRequest)WebRequest.Create("http://imgur.com/upload?sid_hash=9efff36179fef47dc5e078a4575fd96a");
        configRequest(request, cc);
        //add POST params
        formData = new List<string>();
        add(formData, "url", "http://img34.imageshack.us/img34/8425/89948070152259768406.jpg");
        add(formData, "create_album", "0");
        add(formData, "album_title", "Optional Album Title");
        add(formData, "album_layout", "b");
        add(formData, "edit_url", "0");
        writeToRequestStream(request, formData);
        //send request
        Stream s = request.GetResponse().GetResponseStream();
        StreamReader sr = new StreamReader(s);
        string html = sr.ReadToEnd();
        sr.Close();s.Close();
        Console.WriteLine(html + "\n\n");
    }
    static void add(List<string> formData, string key, string value)
    {
        formData.Add(HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(value));
    }
    static void configRequest(HttpWebRequest request, CookieContainer cc)
    {
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
        request.CookieContainer = cc;
        request.Credentials = CredentialCache.DefaultCredentials;
        request.Accept = "*/*";
        request.KeepAlive = true;
        request.Referer = "http://imgur.com/";
        request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15";
        request.Headers.Add("Accept-Language", "en-us,en;q=0.5");
        request.Headers.Add("Accept-Encoding", "gzip,deflate");
        request.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        request.Headers.Add("Keep-Alive", "115");
        request.Headers.Add("X-Requested-With", "XMLHttpRequest");
        request.Headers.Add("Pragma", "no-cache");
        request.Headers.Add("Cache-Control", "no-cache");
    }
    static void writeToRequestStream(HttpWebRequest request, List<string> formData)
    {
        //build request stream
        string queryString = String.Join("&", formData.ToArray());
        byte[] byteArray = Encoding.UTF8.GetBytes(queryString);
        //write to stream
        request.ContentLength = byteArray.Length;
        Stream rs = request.GetRequestStream();
        rs.Write(byteArray, 0, byteArray.Length);
        rs.Close();
    }

ここで、アップロード リクエスト (2 番目のリクエスト) をスニッフィングし、ブラウザのリクエストと比較します。違いは 2 つだけです。

  • ブラウザの「接続」ヘッダー =「キープアライブ」ですが、私のものは存在しません (request.Keep-alive が「true」に設定されていますが、理由はわかりません)

  • 一部のブラウザの Cookie は、私のブラウザには表示されません。

応答は、次のような JSON である必要があります。

{"hashes":"[\"QcvII\"]","hash":"QcvII","album":false,"edit":false}

しかし、サーバーは特殊文字の山によって私の要求に応答します...上記の2つの違いのどれが私のコードを機能させないのかわかりません。このコードを機能させるのを手伝っていただければ、非常に感謝しています。私は初心者なので、私のコードや式がばかげている場合でも、私を責めないでください。

このコードを機能させるのを手伝ってくれる人はいますか?

P/S: 私は .net フレームワーク 4 を使用しています

4

4 に答える 4

1

私の推測では、画像をアップロードしようとする際のsid_hash urlパラメーターは、ログイン時に変更する必要のあるセッションIDです。

于 2011-03-18T15:33:51.340 に答える
1

OK、幸いなことに、解決策を見つけました。私の関数 configRequest() のすべてを忘れてください (最初の 3 行を除く)。解決策は、ログイン要求を送信した後、別の要求をホームページに送信することです (パラメーターは必要ありませんが、最初の要求で受け取った Cookie を含めることを忘れないでください)。sid_hash は、返された HTML に含まれています。その sid_hash を使用して、リモート アップロード リクエストを作成します。

みんなありがとう。

于 2011-03-18T17:46:52.133 に答える
0

ほとんどの場合、2番目のリクエストにはセッションIDCookieが含まれています。これらのCookieがないと、サーバーはユーザーを認識できないため、アップロードは機能しません。

キープアライブを自分で設定することもできますが、最初のリクエストに応答ヘッダーのスニペットを投稿して、サポートできるようにすることをお勧めします。


アップデート

更新によると、次のCookieを含める必要があります。

IMGURSESSION=iliutpm33rhl2rugn5vcr8jq60

明らかに、値はロギングごとに変化します。

于 2011-03-18T15:33:41.427 に答える
0

あなたのコードについてはわかりませんが、ClipUploadはオープン ソース プロジェクトであり、あなたが望むことを既に行っているようです:

クリップボードにあるものをインターネットにすばやくアップロードします。FTP、Imgur.com、Pastebin.com、SendSpace.com をサポートしています。使用法?ステップ 1: コピーします。ステップ 2: システム トレイ アイコンをクリックします。ステップ 3: 公開リンクを貼り付けます。クリップボードを共有する最も簡単な方法!

于 2011-03-18T15:31:33.233 に答える