Приветствую тебя дорогой %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 на нашу форму
[Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь переходим к нашему обработчику Click кнопки и добавляем код
Код:
int stat = http.CheckAuth(html); // Проверяем всё ли успешно
if (stat == 1) // если всё успешно
panel1.BackColor = Color.Green; // то перекрашиваем наш индикатор в зеленый цвет
На данном этапе мой код выглядит вот так
vk.cs
[Ссылки могут видеть только зарегистрированные пользователи. ]
Form1.cs
[Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь можно и проверить нашу программу,запускаем ее,вводим логин и пароль и смотрим что получилось
[Ссылки могут видеть только зарегистрированные пользователи. ]
Всем спасибо за внимание,если что это мой первый урок,оч строго не судите. Также скоро будет продолжение(если нужно конечно,напишите в коментах) Удачи в программировании!
Тот способ 2011 года,который еще осуществлялся через GET запрос,только что попробовал через GET запрос авторизоваться и он мне выдал что пароль не верный. Также я собираюсь продолжать цепь уроков,и работать со своим кодом будет мне в будущем удобней