0

C#プログラミング言語(Microsoft Visual Studio 2010)からサイトを操作する必要があります。サイト「http://m.vk.com」です。私はこのサイトで承認しました。それはすべて正常でした。承認後の最初のWebページは、私のプロファイルページでした。しかし、このサイトの別のページに移動したとき、私は許可を失いました。別のサイトページが表示されましたが、非認証モードでした。Cookieファイルを保存して別のクエリに書き込みました。次に、C#プログラミングコードを記述します。

私はこれらのディレクティブを使用しました:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using HtmlAgilityPack;

これは、メインボタンを押した後に開始されたメイン機能コードです。

private void button1_Click(object sender, EventArgs e)
{
     string login = textBox1.Text;
     string pass = textBox2.Text;
     bool avt = http_auth_vk(login, pass);

     if (avt == true)
     {
         toolStripStatusLabel1.Text = "Succes authorization !";
     }
     else 
     {
         toolStripStatusLabel1.Text = "Authorization data incorrect !";
     }
 }

これは関数「http_auth_vk」です:

    public bool http_auth_vk(string login, string pass)
    {
        //*****************************
        //Получаем action_url
        //*****************************
        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
        System.Net.WebRequest reqGET = System.Net.WebRequest.Create("http://m.vk.com/");
        System.Net.WebResponse resp = reqGET.GetResponse();
        System.IO.Stream stream = resp.GetResponseStream();
        System.IO.StreamReader sr = new System.IO.StreamReader(stream);
        string s = sr.ReadToEnd();


        //*****************************
        //Парсим
        //*****************************
        // Создаём экземпляр класса
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        // Загружаем в класс (парсер) наш html
        doc.LoadHtml(s);
        // Извлекаем значения
        HtmlNode bodyNode = doc.DocumentNode.SelectSingleNode("//div[@class='cont']/form");
        // Выводим на экран значиение атрибута src
        // у изображения, которое находилось
        // в теге <div> в слассом bla
        string result1 = bodyNode.Attributes["action"].Value;

        //*****************************
        //POST запрос
        //*****************************
        var cookies = new CookieContainer();
        ServicePointManager.Expect100Continue = false;
        var request = (HttpWebRequest)WebRequest.Create(result1);
        request.CookieContainer = cookies;
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        using (var requestStream = request.GetRequestStream())
        using (var writer = new StreamWriter(requestStream))
        {
            writer.Write("email=" + login + "&pass=" + pass);
        }

        using (var responseStream = request.GetResponse().GetResponseStream())
        using (var reader = new StreamReader(responseStream))
        {
            var result = reader.ReadToEnd();

            //*****************************
            //Парсим, поиск ID
            //*****************************                 
            HtmlAgilityPack.HtmlDocument doc2 = new HtmlAgilityPack.HtmlDocument();                
            doc2.LoadHtml(result);
            string result2;
            try
            {
                //textBox3.Text = result;

                HtmlNode bodyNode2 = doc2.DocumentNode.SelectSingleNode("//div[@class='user_wrap']/a");
                result2 = bodyNode2.Attributes["href"].Value.Substring(3);
                //Если ID найден, то авторизация удалась



                //ПЕРЕХОД НА СТРАНИЦУ ГРУППЫ

                //string sLocation = myHttpWebResponse.Headers["Location"];

                // получам cookie
                string sCookies = "";
                if (!String.IsNullOrEmpty(resp.Headers["Set-Cookie"]))
                {
                    sCookies = resp.Headers["Set-Cookie"];
                }

                MessageBox.Show(sCookies);

                // формируем запрос
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://m.vk.com/id100669061");
                //myHttpWebRequest.Proxy = new WebProxy("127.0.0.1", 8888);

                myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2;";
                myHttpWebRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
                myHttpWebRequest.Headers.Add("Accept-Language", "ru");
                myHttpWebRequest.ContentType = "text/plain";

                if (!String.IsNullOrEmpty(sCookies))
                {
                    myHttpWebRequest.Headers.Add(HttpRequestHeader.Cookie, sCookies);
                }

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


                StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));

                textBox3.Text = myStreamReader.ReadToEnd();


                MessageBox.Show(myStreamReader.ReadToEnd());


                //Console.WriteLine(myStreamReader.ReadToEnd());
                //Console.ReadKey();



                return true;
            }
            catch
            {
                //textBox3.Text = result;

                //Если ID не науден, то авторизация не удалась
                MessageBox.Show("Authorization error !");

                return false;
            }
        }
    }

次のページが通過した後、どうすれば認証を保存できますか?

4

1 に答える 1

0

少し調査した後、私はあなたの問題を見つけたと思います。.NET フレームワークが Cookie を処理します。Cookie の設定や後で使用するために Cookie を保存することについて心配する必要はありませんが、すべての要求に対して同じ CookieContainer を使用する必要があります。

まず、使用する Cookie コンテナーを設定します。

var cookies = new CookieContainer();

これも、sCookie を使用するすべてのコードを削除できます。

string sCookies = "";
if (!String.IsNullOrEmpty(resp.Headers["Set-Cookie"]))
{
      sCookies = resp.Headers["Set-Cookie"];
}
MessageBox.Show(sCookies);

そして、これを持つ代わりに2番目/3番目のリクエストで:

        if (!String.IsNullOrEmpty(sCookies))
        {
            myHttpWebRequest.Headers.Add(HttpRequestHeader.Cookie, sCookies);
        }

これが必要です(CookieContainer)

myHttpWebRequest.CookieContainer = cookies;
于 2012-08-08T11:44:01.870 に答える