Форум программистов, компьютерный форум, киберфорум
QVO
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Рейтинг: 3.00. Голосов: 1.

Авторизация на сайте vk.com в C++ Builder XE

Запись от QVO размещена 15.08.2012 в 18:42

Для авторизации на сайте vk.com первым делом создадим форму в IDE: C++ Builder Xe.
И разместим на ней такие компоненты:
  • 2 TEdit
  • 1 TButton
  • 1 TIdCookieManager
  • 1 TIdHTTP
Название: авторизация.png
Просмотров: 1583

Размер: 8.4 Кб

В дебри лезть не буду, сразу просмотрим ответ с vk.com при авторизации на сайте.
Нам нужно вытащить hash, а именно remixchk и remixsid.

Цитата:
Host: vk.com
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://vk.com/login?act=mobile
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Cookie: remixdt=-3600; remixlang=0; audio_time_left=0; remixchk=5; remixseenads=2; audio_vol=100; remixflash=11.3.31; remixsid=2e8e36403d20435ffce1ab1da0ab2c31d25562e5f404b0d0f1958cb88eab; remixreg_sid=; remixrec_sid=
Для этого я написал функцию с использованием библиотеки boost 1.39:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <boost/regex.hpp>
//-------------------------------------------
// Регулярные выражения
boost::regex pvremixCHK("remixchk\\=(.+?)\\;", boost::regex::perl | boost::regex::icase);
boost::regex pvremixSID("remixsid\\=(.+?)\\;", boost::regex::perl | boost::regex::icase);
//-------------------------------------------
// функция поиска Sid
const std::string __fastcall htmlParservremixSID(const std::string cmd)
{
    boost::smatch result;
    if(boost::regex_search(cmd, result, pvremixSID))
         return std::string(result[1]);
}
//-------------------------------------------
// функция поиска Chk
const std::string __fastcall htmlParservremixCHK(const std::string cmd)
{
    boost::smatch result;
    if(boost::regex_search(cmd, result, pvremixCHK))
         return std::string(result[1]);
}
//-------------------------------------------
Далее напишем функцию авторизации:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const bool __fastcall AuthVK(TIdCookieManager *IdCookieManager, TIdHTTP *IdHTTP, const AnsiString login, const AnsiString pass)
{
   AnsiString response, remixchk, remixsid;
   // Настраиваем IdHTTP для работы с куками vk.com
   IdHTTP->CookieManager    = IdCookieManager;
   IdHTTP->AllowCookies     = false;
   // Настраиваем автоматический переход на перенаправляемую страницу.
   IdHTTP->HandleRedirects  = false;
    // Делаем запрос к vk.com, передаем логин и пароль.
    try
    {
        response = IdHTTP->Get( L"http://vk.com/login.php?email="+ login +"&pass="+ pass );
    // Обрабатываем возникшие исключения
    }catch(EIdHTTPProtocolException &e)
    {
        switch(e.ErrorCode)
        {
            case 200: return false; break;
            case 303: return false; break;
            case 404: return false; break;
            default:break;
        }
    }catch(EIdSocketError &e)
    {
        if ( e.LastError == 11001 )
            MessageDlg ("Не удалось подключится к удалённому серверу vk.com", mtInformation, TMsgDlgButtons() <<mbOK, 0);
    }catch(EIdException &e)
    {
        MessageDlg ("Ошибка:\n\""+e.Message+"\"", mtError, TMsgDlgButtons() <<mbOK, 0);
    }
    // Ловим ответ "HTTP 302"
        if ( IdHTTP->ResponseCode == 302 )
        {
            // Читаем возращенные заголовки (куки)
            response = IdHTTP->Response->RawHeaders->Text;
            // Находим hash remixchk
            remixchk = htmlParservremixCHK(response.c_str()).c_str();
            // Находим hash remixsid
            remixsid = htmlParservremixSID(response.c_str()).c_str();
            // Передаем куки
            IdHTTP->Request->CustomHeaders->Text = "Cookie: remixchk="+ remixchk +"; remixsid="+ remixsid;
            IdHTTP->CookieManager->AddCookies(IdCookieManager);
            // Переходим на нашу страницуж vk.com/idxxxxxxxx
            response = IdHTTP->Get("http://vk.com"+ IdHTTP->Response->Location);
        }
    // Делаем проверку удачной авторизации.
    if ( ( response.Pos("Моя Страница") > 0 ) || ( response.Pos("Моя Сторінка") > 0) )
    return true;
    else return false;
}

Теперь осталось написать код в кнопке Войти:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
AnsiString message_err =
"Не удается войти.\nПожалуйста, проверьте правильность написания логина и пароля.\n- Возможно, нажата клавиша CAPS-lock?\n- Может быть у Вас включена неправильная раскладка? (русская или английская)\n- Попробуйте набрать свой пароль в текстовом редакторе и скопировать в графу «Пароль»";
//...
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    if ( Edit1->Text != "" && Edit2->Text != "" )
    {
        if ( AuthVK( IdCookieManager1, IdHTTP1, Edit1->Text, Edit2->Text ) )
        {
            MessageDlg ("Авторизация прошла успешно.", mtInformation, TMsgDlgButtons() <<mbOK, 0);
        }else MessageDlg (message_err, mtInformation, TMsgDlgButtons() <<mbOK, 0);
    }else MessageDlg ("Заполните пустые поля.", mtInformation, TMsgDlgButtons() <<mbOK, 0);
}
//---------------------------------------------------------------------------
Размещено в Без категории
Показов 8123 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    1.
    C++
    1
    2
    3
    4
    
       IdHTTP->AllowCookies     = false;
       // Настраиваем автоматический переход на перенаправляемую страницу.
       IdHTTP->HandleRedirects  = false;
        // Делаем запрос к vk.com, передаем логин и пароль.
    Может наоборот ?
    C++
    1
    2
    
    IdHTTP->AllowCookies     =  true; // Позволить сохранять кукисы
    IdHTTP->HandleRedirects  = true; // Автоматически переходит по перенаправляемым страницам ...
    2.
    C++
    1
    
    const std::string __fastcall htmlParservremixSID(const std::string cmd)
    Принимает std::string работающий с char в то время как передаваться может в коде wchar_t* возврашаемый String через метод с_str() при дефолтовых настройках Builder-а
    C++
    1
    
    remixsid = htmlParservremixSID(  response.c_str()   ).c_str();
    3.
    C++
    1
    2
    3
    4
    
    // Ловим ответ "HTTP 302"
            if ( IdHTTP->ResponseCode == 302 )
            {
    //...
    Лучше ловить через исколючения.

    4.
    C++
    1
    2
    3
    4
    5
    
     switch(e.ErrorCode)
            {
                case 200: return false; break;
                // ...
            }
    Зачем здесь break ?

    5. А если по регулярке не будет нечего найдено ?
    C++
    1
    2
    3
    4
    5
    6
    
    const std::string __fastcall htmlParservremixSID(const std::string cmd)
    {
        boost::smatch result;
        if(boost::regex_search(cmd, result, pvremixSID))
             return std::string(result[1]);
    }
    6.
    Непонятно почему регулярки объявлены глобально ?
    И почему ф-ции возвращают const std::string ?
    Запись от Avazart размещена 25.08.2012 в 03:41 Avazart вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru