PDA

Просмотр полной версии : [Руководство] Урок 1. Авторизация [Работа с vk.com]


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

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

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

Далее мы создаем новый класс,я назвал его 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"; //Проверяем не получили ли мы ошибку
[Ссылки могут видеть только зарегистрированные и активированные пользователи] mRequest = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])[Ссылки могут видеть только зарегистрированные и активированные пользователи](url);
//mRequest.Proxy = new WebProxy("127.0.0.1", 8888); //Если нужно то юзаем прокси ^_^
if (!string.IsNullOrEmpty(postData)) mRequest.Method = "POST"; // устанавливаем метод общения с сайтом в POST
mRequest.Referer = "[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
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 который я вытащил блогодоря [Ссылки могут видеть только зарегистрированные и активированные пользователи]
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-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
mRequest.KeepAlive = false;

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

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

// делаем запрос
[Ссылки могут видеть только зарегистрированные и активированные пользователи] mResponse = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])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=[Ссылки могут видеть только зарегистрированные и активированные пользователи]";// генерируем POST запрос
string html = [Ссылки могут видеть только зарегистрированные и активированные пользователи]("[Ссылки могут видеть только зарегистрированные и активированные пользователи]", "");
html = [Ссылки могут видеть только зарегистрированные и активированные пользователи]("[Ссылки могут видеть только зарегистрированные и активированные пользователи]", 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 = [Ссылки могут видеть только зарегистрированные и активированные пользователи]("[Ссылки могут видеть только зарегистрированные и активированные пользователи]" + 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 = "";
[Ссылки могут видеть только зарегистрированные и активированные пользователи] mRequest =
([Ссылки могут видеть только зарегистрированные и активированные пользователи])[Ссылки могут видеть только зарегистрированные и активированные пользователи](
url);
//mRequest.Proxy = new WebProxy("127.0.0.1", 8888);
if (!String.IsNullOrEmpty(postData)) mRequest.Method = "POST";
mRequest.Referer = "[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
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-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
mRequest.KeepAlive = false;

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

// передаем параметры
string sQueryString = postData;
byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQ ueryString);

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

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

try
{
[Ссылки могут видеть только зарегистрированные и активированные пользователи] mResponse = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])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 = "[Ссылки могут видеть только зарегистрированные и активированные пользователи]" + sid;
Image image = net.GetImg(img, pictureBox1.Image);
pictureBox1.Image = image;

}


Теперь переходим к нашему обработчику Click кнопки и добавляем код

int stat = [Ссылки могут видеть только зарегистрированные и активированные пользователи](html); // Проверяем всё ли успешно
if (stat == 1) // если всё успешно
panel1.BackColor = Color.Green; // то перекрашиваем наш индикатор в зеленый цвет


На данном этапе мой код выглядит вот так
vk.cs
[Ссылки могут видеть только зарегистрированные и активированные пользователи] ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Form1.cs
[Ссылки могут видеть только зарегистрированные и активированные пользователи] ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

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

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

Всем спасибо за внимание,если что это мой первый урок,оч строго не судите. Также скоро будет продолжение(если нужно конечно,напишите в коментах) :pandal: Удачи в программировании!

spangebob951
25.11.2013, 23:40
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
разница?

AJIeKCaHDp
26.11.2013, 00:04
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
разница?

Тот способ 2011 года,который еще осуществлялся через GET запрос,только что попробовал через GET запрос авторизоваться и он мне выдал что пароль не верный. Также я собираюсь продолжать цепь уроков,и работать со своим кодом будет мне в будущем удобней

Nickitee
26.11.2013, 01:08
Очень много лишнего кода

public string GetRequestPost(string url, string post, ref CookieContainer CC, string browser, bool allowautoredirect, string reffer)
{
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])[Ссылки могут видеть только зарегистрированные и активированные пользователи](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-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
request.Method = "POST";
request.Timeout = 10000;

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

[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
StreamReader strReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("windows-1251"));
string WorkingPage = strReader.ReadToEnd();
response.Close();
return WorkingPage;
}

NerdyCodingKid
26.11.2013, 08:01
И слишком много ненужных скриншотов. Код классов можно было положить в тег code, а не делать скрины со студии.

lenokk002
29.04.2015, 17:11
подскажите действующий способ авторизации с последующим использованием cookies

Kacha
30.04.2015, 12:16
подскажите действующий способ авторизации с последующим использованием cookies

Использовать целый CookieContainer в классе авторизации.

Dima.Myrzich
21.02.2016, 22:48
[Ссылки могут видеть только зарегистрированные и активированные пользователи] (не реклама)
Вот посмотри на досуге