C # - Отправить HttpWebRequest для удаленной загрузки изображения? - PullRequest
0 голосов
/ 18 марта 2011

В течение нескольких дней я пытался написать программу для удаленной загрузки изображений на хост изображений (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 различия:

  • Заголовок 'Connection' браузера = «keep-alive», но мой не существует (я не знаю почему, хотя request.Keep-alive установлено значение «true»)

  • Некоторые файлы cookie браузера не отображаются в моем.

Ответ должен быть в формате JSON, примерно так:

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

Носервер отвечает на мой запрос кучей специальных символов ... Я не могу определить, какие из двух приведенных выше различий делают мой код неработающим.Я буду очень признателен, если вы поможете мне заставить этот код работать.Я новичок, поэтому, пожалуйста, не вините меня, если мой код или мое выражение глупо.

Кто-нибудь может помочь заставить этот код работать?

P / S: я использую.Чистая рамка 4

Ответы [ 4 ]

1 голос
/ 18 марта 2011

Хорошо, теперь я нашел решение, к счастью.Забудьте все вещи в моей функции configRequest () (за исключением 3 первых строк), они просто делают что-то не так.Решение заключается в том, чтобы после отправки запроса на вход в систему отправить еще один запрос на домашнюю страницу (параметры не требуются, но не забудьте включить файлы cookie, полученные из первого запроса).Sid_hash может быть найден в возвращенном HTML.Используйте этот sid_hash, чтобы сделать запрос на удаленную загрузку.

Спасибо всем, ребята.

1 голос
/ 18 марта 2011

Я предполагаю, что параметр URL sid_hash при попытке загрузить изображение является идентификатором сеанса, который необходимо изменить при входе в систему.

0 голосов
/ 18 марта 2011

Скорее всего, второй запрос содержит куки с идентификатором сессии.Без этих файлов cookie сервер не сможет распознать вас, поэтому загрузка не будет работать.

Вы можете сами установить keep-alive, но я предлагаю опубликовать фрагмент заголовка ответа на первый запрос, чтобы мы моглиhelp.


UPDATE

В соответствии с вашими обновлениями вам необходимо включить этот файл cookie:

IMGURSESSION=iliutpm33rhl2rugn5vcr8jq60

Очевидно, что значение будет меняться при каждом ведении журнала.

0 голосов
/ 18 марта 2011

Не уверен насчет вашего кода, но ClipUpload - это проект с открытым исходным кодом, который, похоже, уже делает то, что вы хотите:

Быстро загружайте все, что есть в вашем буфере обмена, винтернет.Он поддерживает FTP, Imgur.com, Pastebin.com и SendSpace.com.Использование?Шаг 1: Скопируйте.Шаг 2: Щелкните значок на панели задач.Шаг 3: Вставить публичную ссылку.Самый простой способ поделиться своим буфером обмена!

...