Взаимодействие с другими сайтами через HTTP (HttpWebRequest
От: Немиро Алексей Россия http://kbyte.ru
Дата: 14.11.07 16:37
Оценка: 171 (8) -1
Статья:
Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse)
Автор(ы): Немиро Алексей
Дата: 31.07.2007
Статья рассказывает об организации взаимодействия между сайтами, программном заполнении и отправке Web-форм и использовании класов HttpWebRequest и HttpWebResponse.


Авторы:
Немиро Алексей

Аннотация:
Статья рассказывает об организации взаимодействия между сайтами, программном заполнении и отправке Web-форм и использовании класов HttpWebRequest и HttpWebResponse.
http://kbyte.ru — VB, ASP, Framework .NET
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: cadet354 Россия
Дата: 15.11.07 07:01
Оценка:
Здравствуйте, Немиро Алексей, Вы писали:

Почитал статью на сайте первоисточнике, странно зачем такие мучения если есть Watin? Для эмуляции действия пользователя подходит идеально, если конечно не делать эту эмуляцию в промышленных масштабах, но там другие проблемы возникнут.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: Аноним  
Дата: 28.12.07 10:53
Оценка: -2
Ну и зачем эта статья? В комментариях больше полезной информации, право же.
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: vip_delete  
Дата: 28.12.07 15:27
Оценка:
+1 велосипед
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: Oyster Украина https://github.com/devoyster
Дата: 02.01.08 11:13
Оценка: +2
Здравствуйте, Немиро Алексей, Вы писали:

Имхо, для работы с cookies удобно использовать CookieContainer вместо того, чтобы работать непосредственно с заголовками. Статья об этом умалчивает.
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: Аноним  
Дата: 09.01.08 13:46
Оценка:
Здравствуйте, Немиро Алексей, Вы писали:

НА>Статья:

НА>Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse)
Автор(ы): Немиро Алексей
Дата: 31.07.2007
Статья рассказывает об организации взаимодействия между сайтами, программном заполнении и отправке Web-форм и использовании класов HttpWebRequest и HttpWebResponse.


НА>Авторы:

НА> Немиро Алексей

НА>Аннотация:

НА>Статья рассказывает об организации взаимодействия между сайтами, программном заполнении и отправке Web-форм и использовании класов HttpWebRequest и HttpWebResponse.

Странно, но при использовании HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); выдается ошибка: "Удаленный сервер возвратил ошибку: (407) Требуется проверка подлинности посредника."
Пробовал с прокси и без. У прокси задавал рабочие логин и пароль (настройки ИЕ). Не помогло
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: tks Россия  
Дата: 20.04.08 09:49
Оценка:
Здравствуйте, Немиро Алексей.

Спасибо, мне статья понравилась
Понравилась на столько, что я "не отходя от кассы" написал по её мотивам простенькую утилитку для себя, чтобы просматривать статистику посещения своего ЖЖ. Вроде все работает

using System;
using System.Collections.Generic;
using System.Text;

using System.Net;
using System.Text.RegularExpressions;

namespace httpReq_LJ
{
    class Program
    {
        static HttpWebRequest create(String url, String method, String cookie)
        {
            Console.Write("."); 
            HttpWebRequest rq;
            rq = (HttpWebRequest)HttpWebRequest.Create(url);
            //rq.Proxy = new WebProxy("127.0.0.1", 8888);
            rq.Method = method;
            rq.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application," + 
                " application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/" +
                "x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
            rq.Referer = "http://www.livejournal.ru/counter/guests";
            rq.Headers.Add("Accept-Language", "ru");
            rq.ContentType = "application/x-www-form-urlencoded";
            rq.Headers.Add("UA-CPU", "x86");
            rq.Headers.Add("Accept-Encoding", "gzip, deflate");
            rq.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media" +
                " Center PC 5.0; .NET CLR 3.0.04506; InfoPath.1)";
            if (cookie.Length > 0) rq.Headers.Add(HttpRequestHeader.Cookie, cookie);
            rq.AllowAutoRedirect = false;
            return rq;
        }

        static String cutCookie(String s, String cookieName)
        {
            Int32 pos = s.IndexOf(cookieName);
            if (pos < 0) return "";
            else
            {
                s = s.Substring(pos);
                pos = s.IndexOf(";");
                if (pos < 0) return s;
                else return s.Substring(0, pos + 1); 
            }
        }

        static String cutUrl(String s)
        {
            Int32 posb = s.IndexOf("<A HREF=") + 9;
            Int32 pose = s.IndexOf("\">", posb) - 1;
            String url = s.Substring(posb, pose - posb + 1);
            url = url.Replace("&amp;", "&");
            return url;
        }

        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("(C) Konstantin Tkachuk, Moscow, Russia, http://ra-orion.livejournal.com");
                Console.WriteLine("Special thanks to http://www.rsdn.ru/article/inet/httpweb.xml");

                if (args.Length != 2)
                {
                    Console.WriteLine("Usage:\n\thttpReq_LJ.exe <login> <password>\n"); 
                    return;
                }

                HttpWebRequest rq; HttpWebResponse rs;
                System.IO.StreamReader sr;
                String bd, url;

                String timeMark = Math.Floor((DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds).ToString();
                String url1 = String.Format(
                    "http://account.livejournal.ru/async?time={0}&form_url=http%3A%2F%2Fwww.livejournal.ru%2Fljauth" +
                    "%2Fok&reload_url=http%3A%2F%2Fwww.livejournal.ru%2Fljauth%2Freload",
                    timeMark);
                rq = create(url1, "Get", "");
                rs = (HttpWebResponse)rq.GetResponse();
                String ljsid = cutCookie(rs.Headers["Set-Cookie"], "ljsid");
                String testcookie = cutCookie(rs.Headers["Set-Cookie"], "testcookie");

                String url2 = String.Format(
                    "http://account.livejournal.ru/async/chkcookies?time={0}&form_url=http%3A%2F%2Fwww.livejournal.ru" +
                    "%2Fljauth%2Fok&reload_url=http%3A%2F%2Fwww.livejournal.ru%2Fljauth%2Freload",
                    timeMark);
                rq = create(url2, "Get", ljsid + " " + testcookie);
                rs = (HttpWebResponse)rq.GetResponse();
                String chk_whoami = cutCookie(rs.Headers["Set-Cookie"], "chk_whoami");
                String account_cookie = ljsid + " " + testcookie + " " + chk_whoami;

                rq = create("http://www.livejournal.com/login.bml?nojs=1", "Post", "");
                bd = String.Format(
                    "submitted__loginlj=1&ret=http%3A%2F%2Faccount.livejournal.ru%2Flogin%2Fljwho%3Fback%3Dhttp%253a%252f" +
                    "%252fwww%252elivejournal%252eru%252fcounter%252fguests&ret_fail=http%3A%2F%2Faccount.livejournal.ru" + 
                    "%2Flogin%2Fljfault%3Fback%3Dhttp%253a%252f%252fwww%252elivejournal%252eru%252fcounter%252fguests%26code" +
                    "%3D&user={0}&password={1}&x=42&y=14",
                    args[0], args[1]);
                Byte[] ba = Encoding.GetEncoding(1251).GetBytes(bd);
                rq.ContentLength = ba.Length;
                rq.GetRequestStream().Write(ba, 0, ba.Length);

                rs = (HttpWebResponse)rq.GetResponse();

                String lj_cookie = rs.Headers["Set-Cookie"];
                String[] nm = 
                    {
                        "ljmastersession",
                        "ljuniq",
                        "ljloggedin",
                        "ljsession",
                        "BMLschemepref",
                        "langpref"
                    };
                String t = ""; foreach (String n in nm) { t = t + cutCookie(lj_cookie, n) + " "; }
                lj_cookie = t;

                sr = new System.IO.StreamReader(rs.GetResponseStream(), Encoding.GetEncoding(1251));
                bd = sr.ReadToEnd();
                url = cutUrl(bd);

                rq = create(url, "Get", account_cookie);
                rs = (HttpWebResponse)rq.GetResponse();
                sr = new System.IO.StreamReader(rs.GetResponseStream(), Encoding.GetEncoding(1251));
                bd = sr.ReadToEnd();
                url = cutUrl(bd);

                rq = create(url, "Get", lj_cookie);
                rs = (HttpWebResponse)rq.GetResponse();
                sr = new System.IO.StreamReader(rs.GetResponseStream(), Encoding.GetEncoding(1251));
                bd = sr.ReadToEnd();
                url = cutUrl(bd);

                rq = create(url, "Get", account_cookie);
                rs = (HttpWebResponse)rq.GetResponse();
                sr = new System.IO.StreamReader(rs.GetResponseStream(), Encoding.GetEncoding(1251));
                bd = sr.ReadToEnd();
                url = cutUrl(bd);

                rq = create(url, "Get", account_cookie);
                rs = (HttpWebResponse)rq.GetResponse();
                sr = new System.IO.StreamReader(rs.GetResponseStream(), Encoding.UTF8);
                bd = sr.ReadToEnd();

                Console.WriteLine(); Console.WriteLine();
                bd = bd.Substring(bd.IndexOf("new myGuestsDrawer(["));
                bd = bd.Substring(0, bd.IndexOf("</script>"));
                Regex rxr = new Regex(@"\{.u:.(?'name'\'.+\'),.jt:....,.p:.(?'url'\'.+\'),.t:.(?'time'\'.+\')\s+}");
                foreach (Match m in rxr.Matches(bd))
                    Console.WriteLine(m.Groups["time"] + "\t" +
                        m.Groups["name"] + "\t" +
                        m.Groups["url"]);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);  
            }
        }
    }
}


Жалко, что три месяца назад я ничего не знал про Вашу статью. Как раз на работе возникла задача посылать отчеты с территории заказчика через Web-интерфейс его почтовой системы… Эх…
Программист — это не тот, кто пишет программы, а тот, чьи программы работают.
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: Аноним  
Дата: 07.07.08 12:46
Оценка:
Здравствуйте, Немиро Алексей, Вы писали:

Почитал статью на сайте. Решил написать отправку большого файла на сайт. И возник вопрос:
как узнать что некоторые данные уже отосланы. Тоесть если читать файл по частям и отправлять на
сервер то значения прогресс бара будут неверны.

 fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
 ...
 i = fs.Read(buf, 0, buf.Length);
 myHttpWebRequest.GetRequestStream().Write(buf, 0, buf.Length);
 this.progressBar1.Value++;
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: RoloTomasi Смерть хохлопидарам.
Дата: 11.01.09 15:57
Оценка:
Здравствуйте, Немиро Алексей, Вы писали:

Что-то не работает пример с Яндексом. Выкидывает на страницу, что куки не включены.
Придется с фидлером покопаться.
I am Jack's Bugged Code.
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: Leon PRO  
Дата: 25.06.09 04:42
Оценка: 1 (1)
Отличная статья для новичка! Спасибо!
Я бы еще добавил, что без инициализации CookieContainer в HTTPresponce куки будут просто отсутствовать. Обратившись к справке видим, что это сделано в целях безопасности.
Соответственно после инициализации конструктора

myHTTTPrequest.CookieContainer = new CookieContainer();


куки появляются в принятом заголовке.
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От: sunshine Россия https://angel.ru/?src=rsdn
Дата: 03.09.09 10:29
Оценка:
Мне статья сильно помогла, спасибо. Как раз, ковырялся с тем, чтобы наладить авторизацию на Яндексе — нужно программно оттуда ленту своих RSS получать. Без этой статьи я бы хрен знает сколько с этой авторизацией провозился.
Однако, код пришлось доточить, т.к. в представленном виде он не работал. Да и лишние места в нем есть.
Возможно, все это потому, что с момента написания статьи прошло много времени.
Не работало из-за того, что в указанном коде передача куков осуществлялась через заголовки, добавляемые в объекты запросов. А нужно так:

            myHttpWebRequest.CookieContainer = new System.Net.CookieContainer();
            myHttpWebRequest.CookieContainer.Add( myHttpWebResponse.Cookies );


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

        string GetArticlesHtml(){
            string sTest = "";
            HttpWebResponse myHttpWebResponse = null; 
            HttpWebRequest myHttpWebRequest = null;
            string sAccept = 
                "image/gif, image/x-xbitmap, image/jpeg, " +
                "image/pjpeg, application/x-shockwave-flash, " +
                "application/vnd.ms-excel, " +
                "application/vnd.ms-powerpoint, application/msword, */*";
            string sUserAgent = 
                "Mozila/4.0 (compatible; MSIE 6.0; " +
                "Windows NT 5.1; SV1; MyIE2;";
            string sLogin = "***";
            string sPassword = "***";
            string sTargetUrl = "http://lenta.yandex.ru/unread.xml";

            //Отправка логина и пароля, делать мы это будем методом POST.
            //Если вы 
            //сделаете все правильно, то сервер возвратит код 302, в противном 
            //случае – код 200, со страницей, содержащей информацию об ошибке, 
            //либо форму авторизации. 
            myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create( 
                        "http://passport.yandex.ru/passport?mode=auth" );
            myHttpWebRequest.Method = "POST";
            myHttpWebRequest.UserAgent = sUserAgent;
            myHttpWebRequest.Accept = sAccept;
            myHttpWebRequest.Headers.Add("Accept-Language", "ru");
            myHttpWebRequest.CookieContainer = new System.Net.CookieContainer();
            myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
            //Очень важно не забыть указать значение False свойства 
            //AllowAutoRedirect. Если этого не сделать, то, при получении кода 
            //301/302, HttpWebRequest автоматически перейдет на указанную в 
            //заголовках страницу, при этом могут потеряться важные данные, 
            //например, cookie, и, следовательно, сервер не пустит нас на 
            //нужную страницу.            
            myHttpWebRequest.AllowAutoRedirect = false;
            // передаем параметры
            string sQueryString = 
                "retpath=" + 
                    System.Web.HttpUtility.UrlEncode(sTargetUrl) +
                "&login=" + System.Web.HttpUtility.UrlEncode(sLogin) +
                "&passwd=" + System.Web.HttpUtility.UrlEncode(sPassword);
            byte[] ByteArr = 
              System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);
            myHttpWebRequest.ContentLength = ByteArr.Length;
            myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);

            // выполняем запрос
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            //sTest = GetResponseText( myHttpWebResponse );

            //Переход на целевую страницу
            myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create( sTargetUrl );
            myHttpWebRequest.Referer = 
                "http://passport.yandex.ru/passport?mode=auth";
            myHttpWebRequest.UserAgent = sUserAgent;
            myHttpWebRequest.Accept = sAccept;
            myHttpWebRequest.Headers.Add("Accept-Language", "ru");
            myHttpWebRequest.CookieContainer = new System.Net.CookieContainer();
            myHttpWebRequest.CookieContainer.Add( myHttpWebResponse.Cookies );
            myHttpWebRequest.ContentType = "text/plain";

            // выполняем запрос
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            sTest = GetResponseText( myHttpWebResponse );

            return sTest;
        }

        string GetResponseText( HttpWebResponse response ){
            string sResult = null;
            using( Stream resst = response.GetResponseStream() ){
                sResult = new StreamReader(resst, Encoding.GetEncoding(1251)).ReadToEnd();
            }

            return sResult;
        }


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