Авторизация В соц. сети Вконтакте.ру{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 |
Администратор
Сообщений: 906
Статус: Offline
| Самая простая авторизация Доступно только для пользователей
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
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 |
|
| |
|