C# Авторизация ВКонтакте через http без api

      В этой инструкции рассмотрен метод авторизации клиента по логину и паролю, а так же получение булево значение true или false в зависимости от того, прошла авторизация или нет.


      При работе будет использоваться библиотека HtmlAgilityPack для парсинга Html. Подробнее об этой библиотеке можно прочесть тут.
      Авторизация проходит через мобильную версию сайта контакта, так как это проще в реализации.

Вот функция:

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();
    doc.LoadHtml(s);
    HtmlNode bodyNode = doc.DocumentNode.SelectSingleNode("//div[@class='cont']/form");
    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
        {                                     
            
            HtmlNode bodyNode2 = doc2.DocumentNode.SelectSingleNode("//div[@class='user_wrap']/a");
            result2 = bodyNode2.Attributes["href"].Value.Substring(3);
            //Если ID найден, то авторизация удалась
            return true;
        }
        catch
        {
            //Если ID не найден, то авторизация не удалась
            MessageBox.Show("Ошибка авторизации, проверьте правильность введённых данных.\nВозможно там капча.");
            return false;
        }
    }
}

Пример использования:

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 = "Авторизовались успешно";

    }
    else {
        toolStripStatusLabel1.Text = "Данные не верны, попробуйте снова";
    }
}

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

      Работа через Http без использования Api может быть нужна только лишь для проверки валидности аккаунта(ов), так как все остальные действия уже делать во много раз сложнее. Разработчики контакта пожизненно борются с ботами, которые работают через http и результат реально виден. Если вы хотите программным путём работать с группами, друзьями, пабликами и тд, то делать это будет логично только используя api.

Ссылка для скачивания HtmlAgilityPack: Rusfolder.net


Ссылка для скачивания примера: Rusfolder.net


4 комментария:

  1. постить от имени в группу (от её же имени) есть код?

    ОтветитьУдалить
  2. Пожалуйста напишите более конкретно, какой пример кода вам нужен!

    ОтветитьУдалить
  3. 19 HtmlNode bodyNode = doc.DocumentNode.SelectSingleNode("//div[@class='cont']/form");
    20 string result1 = bodyNode.Attributes["action"].Value;
    Значение переменной null и прога вылетат, что делать?

    ОтветитьУдалить
  4. В ВК изменились названия классов. Для восстановления работоспособности данного кода замените следующие строки кода:
    1)
    HtmlNode bodyNode = doc.DocumentNode.SelectSingleNode("//div[@class='cont']/form");
    на
    HtmlNode bodyNode = doc.DocumentNode.SelectSingleNode("//div[@class='form_item fi_fat']/form");

    2)
    HtmlNode bodyNode2 = doc2.DocumentNode.SelectSingleNode("//div[@class='user_wrap']/a");
    на
    HtmlNode bodyNode2 = doc2.DocumentNode.SelectSingleNode("//div[@class='ip_user_link']/a");

    ОтветитьУдалить

Большая просьба, не писать в комментариях всякую ерунду не по теме!