Авторизация В соц. сети Вконтакте.ру{DELPHI}
|
REMiX
|
Дата: Воскресенье, 16.01.2011, 18:22 | Сообщение # 1
|
Был не раз
Зарегистрирован: 11.01.2010
Группа: Пользователи
Сообщений: 22
Статус: Offline
|
Прошу сильно не пинать)
Пытаюсь авторизироваться Вконтакте.
Версия Indy: 10.5.7;
Компилирую в DELPHI XE(Embarcadero RAD Studio XE)
Вот собственно код:
Code
procedure TForm1.aVK;
var
http:TIDHHTP;
data:Tstrings;
logs:TMEMO;
error:boolean;
Cookie:TIDCookieManager;
begin
data:=Tstringlist.Create;
HTTP.AllowCookies:=true;
HTTP.HandleRedirects:=false;
data:=tstringlist.create;
data.add('act=login');
data.add('q=1');
data.add('al_frame=1');
data.Add('expire=');
data.add('captcha_sid=');
data.add('captcha_key=');
data.add('from_host=vkontakte.ru');
data.Add('vk=');
data.Add('email='+login.Text); // логин для авторизации
data.Add('pass='+pass.Text); // пароль для авторизации
error:=false;
try
http.Post('http://login.vk.com/?act=login', data);
except on e : EIDHttpProtocolException do
Begin
if e.ErrorCode = 302 then
begin
try
// получаем новый адрес - адрес перенаправления
if pos('hash',http.Response.Location)<>0 then begin
logs.Lines.Add('Авторизация прошла успешно');
http.get(HTTP.Response.Location);
Cookie.cookieCollection.Clear;
Cookie.cookieCollection.AddClientCookie(copy(http.Response.RawHeaders.text,pos('remixsid',http.Response.RawHeaders.te xt),pos('Vary: Accept-Encoding',http.Response.RawHeaders.text)-pos('remixsid',http.Response.RawHeaders.text)));
try
logs.lines.add(http.get('http://vkontakte.ru'));
except on e : EIDHttpProtocolException do
Begin
if e.ErrorCode = 302 then
begin
try
// получаем новый адрес - адрес перенаправления
// logs.Lines.Add('Авторизация прошла не успешно');
// Cookie.cookieCollection.AddClientCookie(copy(http.Response.RawHeaders.text,pos('remixsid',http.Response.RawHeaders.text),pos('Vary: Accept-Encoding',http.Response.RawHeaders.text)-pos('remixsid',http.Response.RawHeaders.text))); // items[1].cookieText:
logs.lines.add(http.get(HTTP.Response.Location));
except on e:Exception do
// предусматриваем, что исключение может возникнуть и тут
ShowMessage('Авторизация не пройдена'+e.Message);
end;
end
else
//http 404, 501 и так далее
ShowMessage('Ошибка другого вида, не 302:'+e.Message);
end;
on e:Exception do
ShowMessage('Ошибка: ' + e.Message);
end;
end
else begin
error:=true;
logs.Lines.Add('Авторизация прошла не успешно');
end;
except on e:Exception do
// предусматриваем, что исключение может возникнуть и тут
ShowMessage('Ошибка при получении нового адреса.'+e.Message);
end;
end
else
//http 404, 501 и так далее
ShowMessage('Ошибка другого вида, не 302:'+e.Message);
end;
on e:Exception do
ShowMessage('Ошибка: ' + e.Message);
end;
end;
Вот что то подобное. REMIXSID - получаеться, но при запросе на главную строницу, вместо перенаправления получаю главную страницу, т.е. не проходит авторизация. Прошу помощи)))Зарание спасибо.
P.S. Надеюсь, что поймете проблему...
Начинающий программист, DELPHI user, а так же могу помочь с фотошопом.





Сообщение отредактировал REMiX - Понедельник, 17.01.2011, 18:17
|
|
|
|
|
gravitas
|
Дата: Воскресенье, 16.01.2011, 18:47 | Сообщение # 2
|
Авторитетный
Зарегистрирован: 01.05.2010
Группа: Пользователи
Сообщений: 385
Статус: Offline
|
Когда то нашел пример авторизации и проверки акка на валид.
Кидаю...
Хотел его подработать и продавать) Не забудь про +
TheDeduction

Для ускорения получения ответов на ваши вопросы рекомендуется подкармливание в виде +'ов в рейтинг :)
|
|
|
|
|
REMiX
|
Дата: Воскресенье, 16.01.2011, 18:59 | Сообщение # 3
|
Был не раз
Зарегистрирован: 11.01.2010
Группа: Пользователи
Сообщений: 22
Статус: Offline
|
gravitas, нет, это не то, я это то же реализавал, редирект происходит, т.е. пароль и т.д. контакт получает и обрабатывает, кукисы вроде дает, я их добавляю и с жтими куками иду на вконтакте.ру, меня должно редиректнуть на profile.php, о это не происходит, заместо этого он открывает главную страницу,а не страницу профиля(((( но за сокеты спс)
P.S. Где "+"?)))) я чет не нашёл))
Начинающий программист, DELPHI user, а так же могу помочь с фотошопом.





Сообщение отредактировал REMiX - Воскресенье, 16.01.2011, 19:02
|
|
|
|
|
dolphin
|
Дата: Воскресенье, 16.01.2011, 23:36 | Сообщение # 4
|
Администратор
Сообщений: 904
Статус: Offline
|
Самая простая авторизация Доступно только для пользователей
Система: Windows 10 x64, Windows XP
Среды программирования: Delphi 7, Delphi 10 Seattle
Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
|
|
|
|
|
cool1
|
Дата: Понедельник, 17.01.2011, 12:48 | Сообщение # 5
|
Участник
Зарегистрирован: 14.07.2010
Группа: Пользователи
Сообщений: 238
Статус: Offline
|
Я както намудрил тут у мну все получилось http://delphiexpert.ru/view_lesson.php?id=97

За помощь ставьте +!
|
|
|
|
|
REMiX
|
Дата: Понедельник, 17.01.2011, 18:02 | Сообщение # 6
|
Был не раз
Зарегистрирован: 11.01.2010
Группа: Пользователи
Сообщений: 22
Статус: Offline
|
cool1,
Quote (cool1)
http://delphiexpert.ru/view_lesson.php?id=97
Немного не то, тут сделано через десктоп приложения и через API вконтакте, мне же надо просто авторизироваться, но при этом не используя веб браузер. dolphin, у меня это не прокатывает(((авторизация не проходит(
Начинающий программист, DELPHI user, а так же могу помочь с фотошопом.




|
|
|
|
|
cool1
|
Дата: Суббота, 22.01.2011, 14:38 | Сообщение # 7
|
Участник
Зарегистрирован: 14.07.2010
Группа: Пользователи
Сообщений: 238
Статус: Offline
|
Порылся: (Источник google)
Code
var PageProfile:string;
begin
IdHTTP1.AllowCookies:=true;
IdHTTP1.HandleRedirects:=true;
try
PageProfile:=IdHTTP1.Get('http://vkontakte.ru/login.php?email=ваш_логин&pass=пароль');
except
end;
if Pos('logout', PageProfile)<>0 then
Memo1.Lines.Add('Авторизация удалась')
else
Memo1.Lines.Add('Авторизация не удалась');
end;
Code
var data:tstringlist;
PageProfile:string;
error:boolean;
begin
IdHTTP1.AllowCookies:=true;
IdHTTP1.HandleRedirects:=false;
data:=tstringlist.create;
data.Add('email=ваш_логин'); // логин для авторизации
data.Add('pass=пароль'); // пароль для авторизации
data.Add('expire=');
data.Add('vk=');
error:=false;
try
PageProfile:=IdHTTP1.Post('http://login.vk.com/?act=login', data);
except
error:=true;
end;
if not(error) then
begin
data.Clear;
data.Add('s='+Copy(PageProfile, Pos('value', PageProfile)+7, 56));
data.Add('op=slogin');
data.Add('redirect=1');
data.Add('expire=0');
data.Add('to=');
IdHTTP1.HandleRedirects:=true;
try
PageProfile:=IdHTTP1.Post('http://vkontakte.ru/login.php', data);
except
end;
Memo1.Lines.Add('Авторизация удалась');
end
else
Memo1.Lines.Add('Авторизация не удалась');
Data.Free;
end;
Code
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientSocket1.Active = true then
ClientSocket1.Active := false;
ClientSocket1.Active := true;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].Text := 'Connect Success';
ClientSocket1.Socket.SendText('POST /login.php HTTP/1.1'#13#10+
'Accept: */*'#13#10+
'Referer: http://vkontakte.ru/login.php?u=1'#13#10+
'Accept-Language: ru'#13#10+
'Content-Type: application/x-www-form-urlencoded'#13#10+
'User-Agent: Mozilla/4.0'#13#10+
'Host: vkontakte.ru'#13#10+
'Content-Length: '+inttostr(length('success_url=&fail_url=&try_to_login=1&email='+edit1.Text+'&pass='+edit2.Text))+#13#10+
'Connection: Keep-Alive'#13#10+
'Cache-Control: no-cache'#13#10#13#10+
'success_url=&fail_url=&try_to_login=1&email='+edit1.text+'&pass='+edit2.Text);
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].Tex t:= 'Disconnected';
end;
procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
statusbar1.Panels[0].Text := 'Error #'+ inttostr(ErrorCode);
end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
ans : string;
begin
ans := ClientSocket1.Socket.ReceiveText;
if pos('HTTP/1.1 302 Found', ans) <>0 then
statusbar1.Panels[0].Text := 'Success login';
if pos('<div id="error" />',ans) <> 0 then
statusbar1.Panels[0].Text:= 'Bad login';
end;

За помощь ставьте +!
|
|
|
|
|
REMiX
|
Дата: Вторник, 25.01.2011, 18:23 | Сообщение # 8
|
Был не раз
Зарегистрирован: 11.01.2010
Группа: Пользователи
Сообщений: 22
Статус: Offline
|
cool1, Блин, ты сам то проверял? В гугле я и сам рыл. У кого-нибудь получилось зайти на свою страницу вконтакте , не использую Webbrowser ?
Начинающий программист, DELPHI user, а так же могу помочь с фотошопом.




|
|
|
|
|
REMiX
|
Дата: Среда, 16.03.2011, 23:19 | Сообщение # 9
|
Был не раз
Зарегистрирован: 11.01.2010
Группа: Пользователи
Сообщений: 22
Статус: Offline
|
Проблему решил, полный алгоритм авторизации выложу чуть попозже. Вообщем там проблема с куками была. Вообще советую при создании подобных программ активно пользоваться сниффером(я использую HTTP Analyzer v5). |
|
|
|
|
REMiX
|
Дата: Четверг, 17.03.2011, 00:07 | Сообщение # 10
|
Был не раз
Зарегистрирован: 11.01.2010
Группа: Пользователи
Сообщений: 22
Статус: Offline
|
Вот написал функцию, если авторизировались то вернет true если нет false)) всё подробно закоментил)
Code
function avtorizing(Login:string;Pass:string):boolean;
var
data: TstringList; //переменная для отправки данных
s: String;//Переменная куда будим грузить страницу
HTTP: Tidhttp;
Cookie: TIDcookieManager;
procedure indexs;
begin
try
http.Get('http://vkontakte.ru/'); //идем на главную страницу, впринципе можно парсить предыдущие запросы и получить ссылку на страницу запроса, но по моему проще получить перенаправление;)
except on e : EIDHttpProtocolException do
Begin
if e.ErrorCode = 302 then //собственно код ошибки перенаправления
begin
S:=http.Get(Http.Response.Location); //грузим страницу профиля в s
end;
End;
end;
end;
begin
result:=false;
HTTP.HandleRedirects:=false;//Отключаем автоматическое перенаправление
data:=tstringlist.create; //Инициализация переменной с данными
data.Add('act=login'); //менять не нужно
data.add('q=1');
data.add('al_frame=1');
data.Add('expire=');
data.add('captcha_sid=');
data.add('captcha_key=');
data.add('from_host=vkontakte.ru');
data.Add('email='+login); // логин для авторизации
data.Add('pass='+Pass); //Пароль авторизации
try //так как мы отключили редирект, то ловим перенаправление сами
HTTP.Post('http://login.vk.com/', data);//отправка данных
except on e : EIDHttpProtocolException do
Begin
if e.ErrorCode = 302 then //код ошибки, если равен 302 то значит куда то послали:)
begin
if pos('s=1',Http.Response.Location)<>0 then //Проверка на правильность ввода логина и пароля если всё правильно то в конце адресса перенаправления будет "s=1"
begin
HTTP.Request.CustomHeaders.Text:= 'Cookie: ' + Cookie.cookieCollection. items[0].CookieName+'='+Cookie.cookieCollection. items[0].Value; //добавляем куку(remixchk)
http.Get(Http.Response.Location); //Собственно запрос на перенаправляемую страницу
HTTP.Request.CustomHeaders.Text:= 'Cookie: ' + Cookie.cookieCollection. items[0].CookieName+'='+Cookie.cookieCollection. items[0].Value+'; '+Cookie.cookieCollection. items[4].CookieName+'='+Cookie.cookieCollection. items[4].Value;// добавляем в запрос куки(remixchk и remixsid);
indexs;//Внутренняя процедура, вынес из-за Try-except))больно уж много там "end" <img src="http://s5.ucoz.net/sm/2/smile.gif" border="0" align="absmiddle" alt="smile"> грузит в переменную s страницу профиля
if pos('editProfile.php',s)<>0 then //ищем на странице "editProfile.php"- я взял это как признак того что мы зашли на свою страницу как владелец
result:=true; //ну и пишем в результат true)))
end
else
exit; //выход из процедуры(можно поставить что-то другое) если не найдена "s=1"
end;
end;
end;
end;
Пример использования:
Code
avtorizing(Login,pass)//Login-Логин вконтакте, пароль -пароль вконтакте
Сообщение отредактировал REMiX - Четверг, 17.03.2011, 00:08
|
|
|
|
|