Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 25.11.2013, 22:57   #1
 Разведчик
Аватар для AJIeKCaHDp
 
AJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небе
Регистрация: 14.12.2009
Сообщений: 2
Популярность: 775
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для AJIeKCaHDp с помощью ICQ Отправить сообщение для AJIeKCaHDp с помощью Skype™
 
По умолчанию Урок 1. Авторизация [Работа с vk.com]

Приветствую тебя дорогой %username%,полазив по форуму,я заметил что большую часть аудитории интересует авторизация и парсинг страниц vk.com
Вот ко мне и пришла мысль написать подобное Руководство
Просьба людей "Правильного кода" не беспокоить меня,каждый кодит как может и как хочет.Теперь думаю можно и начать!
P.S. Код не целиком мой(некоторые куски спёрты с других проектов и успешно впилины сюда)

Для начала нам нужно создать новый проект,я назвал его Vk.auth
[Ссылки могут видеть только зарегистрированные пользователи. ]

После подготовить форму для дальнейшей работы с ней
[Ссылки могут видеть только зарегистрированные пользователи. ]
На форме использовано:
2 - Label
1 - Button
2 - textBox
1 - panel(для наглядности отображения,в онлайне сейчас или нет)
К textBox'y пароля применено свойство UseSystemPasswordChar(для моей безопасности)

Далее мы создаем новый класс,я назвал его vk
[Ссылки могут видеть только зарегистрированные пользователи. ]

В этом классе объявляем зависимости
Код:
using System.Collections;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Drawing;
[Ссылки могут видеть только зарегистрированные пользователи. ]

После объявим 2 глобальных переменных
Код:
string ssid;
public string llc;
ssid будет у нас хранить ID текущей сессии
llc хранит наши куки

Теперь создадим метод внутри нашего класса
Код:
        public string gHtml(string url, string postData) //Возвращает содержимое поданной страницы
        {
            string HTML = "";

            Regex rex1 = new Regex("remixsid=(.*?);", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
            if (url == "0") return "0"; //Проверяем не получили ли мы ошибку
            HttpWebRequest mRequest = (HttpWebRequest)HttpWebRequest.Create(url);
            //mRequest.Proxy = new WebProxy("127.0.0.1", 8888); //Если нужно то юзаем прокси ^_^
            if (!string.IsNullOrEmpty(postData)) mRequest.Method = "POST"; // устанавливаем метод общения с сайтом в POST
            mRequest.Referer = "https://vk.com";
            mRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";// Мою userAgent который я вытащил блогодоря httpanalyzer
            mRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword";
            mRequest.Headers.Add("Accept-Language", "ru");
            mRequest.ContentType = "application/x-www-form-urlencoded";
            mRequest.KeepAlive = false;

            // передаем Сookie, полученные в предыдущем запросе
            if (!string.IsNullOrEmpty(this.ssid))
            {
                llc = "remixchk=5;remixsid=" + ssid;
            }
            if (!string.IsNullOrEmpty(llc))
            {
                mRequest.Headers.Add(System.Net.HttpRequestHeader.Cookie, llc);
            }
            // ставим False, чтобы при получении кода 302, не делать 
            // автоматического перенаправления
            mRequest.AllowAutoRedirect = false;

            // передаем параметры
            string sQuerystring = postData;
            byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQuerystring); //Вконтакте использует кирилическую кодировку
            try
            {
                if (!string.IsNullOrEmpty(postData))
                {
                    mRequest.ContentLength = ByteArr.Length;
                    mRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
                };

                // делаем запрос
                HttpWebResponse mResponse = (HttpWebResponse)mRequest.GetResponse();
                StreamReader mReader;

                //Сохраняем Cookie 
                llc = string.IsNullOrEmpty(mResponse.Headers["Set-Cookie"]) ? "" : mResponse.Headers["Set-Cookie"];
                Match matc1 = rex1.Match(llc);

                //Если есть имя сессии, то подменяем Cookie 
                if (matc1.Groups.Count == 2) { this.ssid = matc1.Groups[1].ToString(); llc = "remixchk=5;ssid=" + this.ssid; }
                if (mResponse.Headers["Content-Type"].IndexOf("windows-1251") > 0)
                {
                    mReader = new StreamReader(mResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("windows-1251"));
                }
                else
                {
                    mReader = new StreamReader(mResponse.GetResponseStream(), System.Text.Encoding.UTF8);
                }
                HTML = mReader.ReadToEnd();
                if (HTML == "") //Проверяем на редирект
                {
                    HTML = this.gHtml(mResponse.Headers["Location"].ToString(), "");

                }
            }
            catch (Exception err)
            {
                //Ошибка в чтении страницы
                return "0";
            }
            return HTML;
        }
В итоге наш класс выглядит таким образом
[Ссылки могут видеть только зарегистрированные пользователи. ]

После того как начальная стадия авторизации готова,переходим к обработчику Click на нашей кнопки авторизации,в этом обработчике нам нужно будет создать новый объект нашего класса и отправить POST запрос контакту на авторизацию

Но перед этим создадим глобальную переменную userid и наш экземпляр объекта в файле Form1.cs(далее работаем с ним)

Код:
string userid;
vk http = new vk();
Продолжаем описывать наше событие на клик по кнопке

Код:
            string post = "email=" + textBox1.Text + "&pass=" + textBox2.Text + "&q=1&act=login&q=1&al_frame=1&from_host=vk.com&from_protocol=http&ip_h=4e78766a2890ac1115&quick_expire=1";// генерируем POST запрос
            string html = http.gHtml("https://vk.com/", ""); 
            html = http.gHtml("https://login.vk.com/?act=login", post); // Отправляем запрос на авторизацию
            Regex rex4 = new Regex("parent\\.onLoginDone\\(\'(.*?)\'\\)", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); //Создаём правило для парсинга
            Match matc4 = rex4.Match(html);// Примерняем его для нашего ответа от VK,в котором должен хранится ID нашей страницы
            userid = matc4.Groups[1].ToString().Replace("/id", ""); // удаляем лишний мусор который остался от нашего парса
После выполнения данного кода у нас в переменную userid должен записаться ваш ID вконтакте

Но тут появляется вопрос как узнать точно,авторизовались мы или нет,на него я отвечу в следующем коде(Продолжаем писать его в событии Click кнопки)
Добавляем 1 строчу кода в Click кнопки
Код:
html = http.gHtml("https://vk.com/id" + userid, "");
И переключаемся в файл vk.cs
Добавляем в него метод для проверки на авторизацию
Код:
        private int CheckAuth(string html)
        {
            int status;
            if (html.IndexOf("login?act=blocked") > 0) { status = 2; return status; } // Проверяем не заблокирован ли наш аккаунт
            if (html.IndexOf("onLoginFailed") > 0) { status = 3; return status; } // проверяем была ли попытка успешной
            Regex rex1 = new Regex("href=\"\\/edit\"", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
            Match matc1 = rex1.Match(html);
            if (matc1.Groups[0].Length == 0) { status = 4; return status; } // Проверяем есть ли у нас возможность редактировать страницу
            status = 1; // если всё успешно то возвращаем 2
            return status;
        }
Также сразу добавим проверку присутствует ли у нас капча на странице
Код:
        public string CheckCaptch(string html)
        {

            Regex rex1 = new Regex("captcha_sid\\\":\\\"(\\d*)\\\"", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
            Match matc1 = rex1.Match(html);
            if (matc1.Groups[1].Length == 0) return "0";
            return matc1.Groups[1].ToString(); // возвращаем ID капчи
        }
Тутже в классе vk объявим метод для получения картинки(в основном капчи)
Код:
        public Image GetImg(string url, Image image) //Возвращает изображение
        {
            string postData = "";
            string HTML = "";
            HttpWebRequest mRequest =
              (HttpWebRequest)HttpWebRequest.Create(
                url);
            //mRequest.Proxy = new WebProxy("127.0.0.1", 8888);
            if (!String.IsNullOrEmpty(postData)) mRequest.Method = "POST";
            mRequest.Referer = "http://vk.com";
            mRequest.UserAgent = "Mozila/4.0 (compatible; MSIE 6.0;Windows NT 5.1; SV1; MyIE2;";
            mRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword";
            mRequest.Headers.Add("Accept-Language", "ru");
            mRequest.ContentType = "application/x-www-form-urlencoded";
            mRequest.KeepAlive = false;

            // передаем Cookie, полученные в предыдущем запросе        
            if (!String.IsNullOrEmpty(ssid))
            {
                llc = "remixchk=5;remixsid=" + ssid;
            }
            if (!String.IsNullOrEmpty(llc))
            {
                mRequest.Headers.Add(HttpRequestHeader.Cookie, llc);
            }
            // ставим False, чтобы при получении кода 302, не делать 
            // автоматического перенаправления
            mRequest.AllowAutoRedirect = true;
         
            // передаем параметры
            string sQueryString = postData;
            byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);

            if (!String.IsNullOrEmpty(postData))
            {
                mRequest.ContentLength = ByteArr.Length;
                mRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
            };

            // делаем запрос

            try
            {
                HttpWebResponse mResponse = (HttpWebResponse)mRequest.GetResponse();
                StreamReader mReader;
               

                if (mResponse.Headers["Content-Type"].IndexOf("windows-1251") > 0)
                {
                    mReader = new StreamReader(mResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("windows-1251"));
                }
                else
                {
                    mReader = new StreamReader(mResponse.GetResponseStream(), System.Text.Encoding.UTF8);
                }
                image = Image.FromStream(mResponse.GetResponseStream());
                HTML = mReader.ReadToEnd();
                mResponse.Close();
                if (HTML == "") HTML = mResponse.Headers["Location"].ToString();
            }
            catch (Exception err)
            {
                //Ошибка в чтении страницы
                return image;
            }
            return image;
        }
Теперь возвращаемся в наш файл Form1.cs с чистой душой

И в нем нам нужно будет объявить метод для добавление капчи в pictureBox
Но перед эти добавим pictureBox на нашу форму
[Ссылки могут видеть только зарегистрированные пользователи. ]

И переходим к коду,добавляем метод
Код:
        public void Addcap(string sid)
        {
            this.img = "http://vk.com/captcha.php?sid=" + sid;           
            Image image = net.GetImg(img, pictureBox1.Image);
            pictureBox1.Image = image;

        }
Теперь переходим к нашему обработчику Click кнопки и добавляем код
Код:
            int stat = http.CheckAuth(html); // Проверяем всё ли успешно
            if (stat == 1) // если всё успешно
                panel1.BackColor = Color.Green; // то перекрашиваем наш индикатор в зеленый цвет
На данном этапе мой код выглядит вот так
vk.cs
[Ссылки могут видеть только зарегистрированные пользователи. ]
Form1.cs
[Ссылки могут видеть только зарегистрированные пользователи. ]

Теперь можно и проверить нашу программу,запускаем ее,вводим логин и пароль и смотрим что получилось

[Ссылки могут видеть только зарегистрированные пользователи. ]

Всем спасибо за внимание,если что это мой первый урок,оч строго не судите. Также скоро будет продолжение(если нужно конечно,напишите в коментах) Удачи в программировании!
  Ответить с цитированием
Пользователь сказал cпасибо:
крайслер (29.11.2013)
Старый 25.11.2013, 23:40   #2
 Разведчик
Аватар для spangebob951
 
spangebob951 на правильном путиspangebob951 на правильном пути
Регистрация: 02.11.2010
Сообщений: 37
Популярность: 138
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 26 сообщениях
Отправить сообщение для spangebob951 с помощью ICQ Отправить сообщение для spangebob951 с помощью Skype™
 
По умолчанию Re: Урок 1. Авторизация [Работа с vk.com]

http://zhyk.ru/forum/showthread.php?t=163583
разница?
  Ответить с цитированием
Старый 26.11.2013, 00:04   #3
 Разведчик
Аватар для AJIeKCaHDp
 
AJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небеAJIeKCaHDp лучик света в грозовом небе
Регистрация: 14.12.2009
Сообщений: 2
Популярность: 775
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для AJIeKCaHDp с помощью ICQ Отправить сообщение для AJIeKCaHDp с помощью Skype™
 
По умолчанию Re: Урок 1. Авторизация [Работа с vk.com]

Цитата:
Сообщение от spangebob951Посмотреть сообщение
http://zhyk.ru/forum/showthread.php?t=163583
разница?

Тот способ 2011 года,который еще осуществлялся через GET запрос,только что попробовал через GET запрос авторизоваться и он мне выдал что пароль не верный. Также я собираюсь продолжать цепь уроков,и работать со своим кодом будет мне в будущем удобней
  Ответить с цитированием
Старый 26.11.2013, 01:08   #4
Читер-спонсор
 Рыцарь-защитник
Аватар для Nickitee
 
Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(
Регистрация: 28.08.2009
Сообщений: 603
Популярность: 19129
Золото Zhyk.Ru: 500
Сказал(а) спасибо: 84
Поблагодарили 602 раз(а) в 321 сообщениях
 
По умолчанию Re: Урок 1. Авторизация [Работа с vk.com]

Очень много лишнего кода
Код:
    public string GetRequestPost(string url, string post, ref CookieContainer CC, string browser, bool allowautoredirect, string reffer)
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        byte[] buffer = Encoding.UTF8.GetBytes(post);
        request.UseDefaultCredentials = false;
        request.ContentLength = buffer.Length;
        request.CookieContainer = CC;
        request.UserAgent = browser;
        request.Referer = reffer;
        request.ContentType = "application/x-www-form-urlencoded";
        request.Method = "POST";
        request.Timeout = 10000;

        Stream newStream = request.GetRequestStream();
        newStream.Write(buffer, 0, post.Length);
        newStream.Close();

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader strReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("windows-1251"));
        string WorkingPage = strReader.ReadToEnd();
        response.Close();
        return WorkingPage;
    }
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
  Ответить с цитированием
Пользователь сказал cпасибо:
the-boxi (04.12.2013)
Старый 26.11.2013, 08:01   #5
 Разведчик
Аватар для NerdyCodingKid
 
NerdyCodingKid на правильном путиNerdyCodingKid на правильном пути
Регистрация: 18.11.2013
Сообщений: 3
Популярность: 197
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 9 сообщениях
 
По умолчанию Re: Урок 1. Авторизация [Работа с vk.com]

И слишком много ненужных скриншотов. Код классов можно было положить в тег code, а не делать скрины со студии.
  Ответить с цитированием
Старый 29.04.2015, 17:11   #6
 Разведчик
Аватар для lenokk002
 
lenokk002 никому не известный тип
Регистрация: 26.03.2011
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Урок 1. Авторизация [Работа с vk.com]

подскажите действующий способ авторизации с последующим использованием cookies
  Ответить с цитированием
Старый 30.04.2015, 12:16   #7
 Разведчик
Аватар для Kacha
 
Kacha излучает ауруKacha излучает ауруKacha излучает ауруKacha излучает ауруKacha излучает ауруKacha излучает ауру
Регистрация: 19.09.2012
Сообщений: 38
Популярность: 640
Сказал(а) спасибо: 6
Поблагодарили 43 раз(а) в 29 сообщениях
 
По умолчанию Re: Урок 1. Авторизация [Работа с vk.com]

Цитата:
Сообщение от lenokk002Посмотреть сообщение
подскажите действующий способ авторизации с последующим использованием cookies

Использовать целый CookieContainer в классе авторизации.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
  Ответить с цитированием
Старый 21.02.2016, 22:48   #8
 Разведчик
Аватар для Dima.Myrzich
 
Dima.Myrzich никому не известный тип
Регистрация: 21.02.2016
Сообщений: 2
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Урок 1. Авторизация [Работа с vk.com]

[Ссылки могут видеть только зарегистрированные пользователи. ] (не реклама)
Вот посмотри на досуге
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Базы] Урок по бруту вк. Dima Glazov Халява для Читера 58 22.11.2014 19:13
[Руководство] Урок по созданию бота для тюряги на C# игровая валюта урок №2 Hlebnikov C# 9 05.12.2012 21:56
[Руководство] Урок по созданию бота для тюряги на C# скок убито боссов урок №3 Hlebnikov C# 0 25.04.2012 22:49
Трой dumawka Школа Читера 16 23.04.2012 20:22

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 05:12.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net