Пятница, 29.03.2024, 18:27 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024  
delphicode » Delphi » Вопросы по Delphi » Авторизация В соц. сети Вконтакте.ру{DELPHI} (Учусь пользоваться HTTP протоколом, вот повис над проблемой.)
Авторизация В соц. сети Вконтакте.ру{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
Когда то нашел пример авторизации и проверки акка на валид.
Кидаю...
Хотел его подработать и продавать) Не забудь про +
Прикрепления: vkontakte.rar (172.8 Kb)


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
 
delphicode » Delphi » Вопросы по Delphi » Авторизация В соц. сети Вконтакте.ру{DELPHI} (Учусь пользоваться HTTP протоколом, вот повис над проблемой.)
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz