[C#] Нужна помощь в работе с Cookies

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by skier529, 24 Aug 2012.

  1. skier529

    skier529 New Member

    Joined:
    8 May 2009
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Добрый вечер.
    Только начал осваивать web-программирование на C#. С этим языком был довольно хорошо знаком, но никогда не применял для автоматизации действий в интернете.
    Пошел по пути наименьшего сопростивления: т.е начал использовать библиотеку ViKing.Engine.
    Сайт автора очень помог, но самостоятельно никак не могу справиться с авторизацией Яндекса. Т.е авторизоваться получается, но пользоваться Яндексом из-под совего логина совсем не получается.
    Например:
    Code:
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {            
                string page = VkRequest.Request("http://yandex.ru").Content;
                string post = string.Format("login=LOGIN&passwd=PASSWORD");
                var result = VkRequest.Request("http://passport.yandex.ru/passport?mode=auth&retpath=http%3A%2F%2Fmail.yandex.ru", post);
                    string page22 = VkRequest.Request("http://news.yandex.ru/").Content;
                    textBox2.AppendText(page22);
            }
        }
    }
    В данном коде я пытался добиться того, чтобы, при загрузке страницы _news.yandex.ru, в правом верхнем углу показывался мой логин, а не слово "вход".
    Как я понимаю тут нужно передавать куки, но вопрос в том: как можно это сделать?
    P.S И стоит ли продолжать углубленное изучение данной библиотеки или все-таки стоит переключиться на что-то другое?
     
    #1 skier529, 24 Aug 2012
    Last edited: 24 Aug 2012
  2. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    авторизация на яше через дополнительные библиотеки? пффф не смеши! максимум - самопальная обертка для классов httpwebrequest и httpwebresponse.
    а авторизация так: слушаешь снифером какой запрос посылается, через httpwebrequest отсылаешь его, при этом инициализируешь свойство cookiecontainer и предварительно сделав гетзапрос на главную страницу чтоб получить куки
     
  3. skier529

    skier529 New Member

    Joined:
    8 May 2009
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Ну ViKing.Engine - специальная библиотека для web-программирования.
    Принципе все так и делал, как вы сказали.

    За cookiecontainer спасибо, попробую.
     
  4. vicgerrard

    vicgerrard New Member

    Joined:
    4 Apr 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Code:
    static void Main(string[] args)
    {
    CookieContainer container = new CookieContainer();
    string login = "LOGIN";
    string password = "PASSWORD";
    string temp = Post("https://passport.yandex.ru/passport?mode=auth&retpath=http%3A%2F%2Fmail.yandex.ru", string.Format("login={0}&passwd={1}&twoweeks=yes&timestamp={2}", login, password, DateTime.Now.Ticks), true, ref container);
    temp = Get("http://yandex.ru", ref container);
    File.WriteAllText("two.html", temp);
    }
    private static string Post(string url, string data, bool clearCookie, ref CookieContainer container, WebProxy proxy = null)
            {
                string output = null;
                try
                {
                    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
                    if (clearCookie) WebReq.CookieContainer = new CookieContainer();
                    else WebReq.CookieContainer = container;
                    byte[] buffer = Encoding.ASCII.GetBytes(data);
                    WebReq.Method = "POST";
                    WebReq.AllowAutoRedirect = true;
                    WebReq.ContentType = "application/x-www-form-urlencoded";
                    WebReq.ContentLength = buffer.Length;
                    Stream PostData = WebReq.GetRequestStream();
                    PostData.Write(buffer, 0, buffer.Length);
                    PostData.Close();
                    HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
                    Stream Answer = WebResp.GetResponseStream();
                    container = WebReq.CookieContainer;
                    StreamReader _Answer = new StreamReader(Answer);
                    output = _Answer.ReadToEnd();
                    return output.Trim() + "\n";
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }