Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Vkontakte


Автор: Proxin 23.8.2009, 00:47
Собственно, проблема такая. На вконтакт авторизовался успешно - в ответ на post-запрос получаю good и рандомные циферки, как надо. Но когда я пытаюсть с этого же tidhttp получить get-ом страничку vkontakte.ru/feed2.php, то получаю только id=-1 - как бы даже и не логинился секунду до этого. AllowCookies стоит True, тидкукисманаджер - подключён, хендлередиректс - тоже тру. Версия инди - свеженькая, последняя, delphi версии седьмой.
В коде идёт так -
somestring:=http.post('http://www.vkontakte.ru/login.php',dt); {тут получаю good и циферки}
а дальше
somestring2:=http.get('http://www.vkontakte.ru/feed2.php');
{уже получаю то самое id=-1, как будто и не заходил.}
Подозрение, что тидкукисманаджер не сохраняет кукизов от пост-запроса. 
Полный код - вот:
Код

procedure login(mail,pass:string);
var dt:tstringlist;s,name:string;
    {coom:tidcookiemanager;}
begin
frmcl.http.HandleRedirects:=true;
{cm:=tidcookiemanager.Create(frmcl.http);}
frmcl.http.CookieManager:=frmcl.coom;
frmcl.http.AllowCookies:=true;
dt:=tstringlist.Create;
dt.Add('op=a_login_attempt');
dt.add('email='+mail);
dt.Add('pass='+pass);
dt.add('expire=0');
s:=frmcl.http.Post('http://www.vkontakte.ru/login.php',dt);
if (pos(s,'good')=0) then messagebox(0,'Auth sucsess','Message',0);
s:=frmcl.http.Get('http://www.vkontakte.ru/feed2.php');
frmcl.Memo1.Text:=s;
end;

В чём может быть ошибка? 

Автор: mr_smit 23.8.2009, 09:18
Тема контакта уже вылизана до блеска. http://forum.vingrad.ru/topic-159803.html

Автор: Proxin 23.8.2009, 13:34
Понятно, в принципе. Но не получается.
Пытался сделать метод override'ом, но пишет, что нельзя. А если изменить в исходниках и кинуть tidcookiemanager.pas в проект, то вылазит куча ошибок, в том числе и  c idhttp.
Как правильно запихнуть изменённый idcookiemanager в проект?

Автор: Proxin 23.8.2009, 18:49
Всё, разобрался.
Если что - вот код готовой авторизации на вконтакте в виде процедуры(мыло, пароль). Требует компоненты idhttp и idcookiemanager.

Код

procedure getcookie(st:string);
var i,j:integer;
    ncookie:string;
begin
ncookie:='';
for i:=1 to length(st) do
if copy(st,i,10) = 'Set-Cookie' then
begin
for j := i+11 to length(st) do
if st[j] = ';' then
begin
ncookie := ncookie + copy(st,i+11,j-i-10);
break;
end;
end;
if length(ncookie) > 50 then
begin
ncookie := 'Connection: Keep-Alive'+#13+'Cache-Control: no-cache'+#13+'Cookie: remixchk=5'+'Cookie: '+ncookie;
frmcl.http.Request.CustomHeaders.Clear;
frmcl.http.Request.CustomHeaders.Add(ncookie);
end;
end;

procedure login(mail,pass:string);
var dt:tstringlist;s:string;
begin
frmcl.http.HandleRedirects:=true;
frmcl.http.CookieManager:=frmcl.coom;
frmcl.http.AllowCookies:=true;
dt:=tstringlist.Create;
dt.Add('op=a_login_attempt');
dt.add('email='+mail);
dt.Add('pass='+pass);
dt.add('expire=0');
s:=frmcl.http.Post('http://www.vkontakte.ru/login.php',dt);
if (pos('good',s)<>0) then begin {messagebox(0,'Auth sucsess','Message',0);} LoggedIn:=true; end;
if (s='failed') then begin {messagebox(0,'Login attempt falied','Message',0);} LoggedIn:=false; end;
if (LoggedIn) then begin
dt.Clear;
dt:=frmcl.http.Response.RawHeaders;
{got cookies. response ok.}
getcookie(dt.Text);
{set the fucking cookie to normal state. ok.}
s:=frmcl.http.Get('http://www.vkontakte.ru/feed2.php');
if (s='{"user": {"id": -1}}') then LoggedIn:=false else LoggedIn:=true;
end;
if (not LoggedIn) then messagebox(0,'Вход не выполнен. Возможно, вы указали'+#13#10+'неверную пару логин/пароль.','Ошибка',0);
if (LoggedIn) then messagebox(0,'U sucsessfuly logged in','Info',0);
end;

Упд. Компоненты нужны (по крайней мере, точно будет работать всё) из indy10, свежие. Тидкукиманаджер и тидхттп - те,что были в пакетах, не измененные. 

Автор: Proxin 13.9.2009, 22:50
Уютный вконтактик сменил способ авторизации - теперь она идёт через отдельный сервер login.vk.com. Выкладываю новый рабочий - кому надо - пользуйте и разбирайтесь. Нужно всё то же - тидкукисманагер и тидхттп из библиотеки инди.
Код

uses idhttp,idcookiemanager;
var http:tidhttp;
      coom:tidcookiemanager;
procedure getcookie(st:string);
var i,j:integer;
    ncookie:string;
begin
ncookie:='';
for i:=1 to length(st) do
if copy(st,i,10) = 'Set-Cookie' then
begin
for j := i+11 to length(st) do
if st[j] = ';' then
begin
ncookie := ncookie + copy(st,i+11,j-i-10);
break;
end;
end;
if length(ncookie) > 50 then
begin
ncookie := 'Connection: Keep-Alive'+#13+'Cache-Control: no-cache'+#13+'Cookie: remixchk=5'+'Cookie: '+ncookie;
http.Request.CustomHeaders.Clear;
http.Request.CustomHeaders.Add(ncookie);
end;
end;

procedure login(mail,pass:string);
var reqs:tstringlist;resp,s:widestring;
begin
http:=TIdHTTP.Create(nil);
coom:=TIdCookieManager.Create(http);
http.AllowCookies:=true;
http.CookieManager:=coom;
http.HandleRedirects:=true;
http.ProtocolVersion:=pv1_1;
reqs:=tstringlist.Create;
reqs.Add('email='+mail);
reqs.Add('pass='+pass);
reqs.Add('vk=');
resp:=http.Post('http://login.vk.com/?act=login',reqs);
delete(resp,1,pos('value=',resp)-1+length('value='''));
s:=copy(resp,1,pos('''',resp)-1);
reqs.Clear;
reqs.Add('s='+s);
resp:=http.Post('http://vkontakte.ru/login.php?op=slogin',reqs);
reqs:=http.Response.RawHeaders;
getcookie(reqs.Text);
end;


Автор: Proxin 21.10.2009, 17:25
Вконтактик опять сменил способ авторизации. Апдейт кода:
Код

uses idhttp,idcookiemanager;
var http:tidhttp;
      coom:tidcookiemanager;
procedure getcookie(st:string);
var i,j:integer;
      ncookie:string;
begin
ncookie:='';
for i:=1 to length(st) do
if copy(st,i,10) = 'Set-Cookie' then
begin
for j := i+11 to length(st) do
if st[j] = ';' then
begin
ncookie := ncookie + copy(st,i+11,j-i-10);
break;
end;
end;
if length(ncookie) > 50 then
begin
ncookie := 'Connection: Keep-Alive'+#13+'Cache-Control: no-cache'+#13+'Cookie: remixchk=5'+'Cookie: '+ncookie;
http.Request.CustomHeaders.Clear;
http.Request.CustomHeaders.Add(ncookie);
end;
end;

procedure VKlogin(mail,pass:string);
var reqs:tstringlist;resp,s:widestring;
begin
http:=TIdHTTP.Create(nil);
coom:=TIdCookieManager.Create(http);
http.AllowCookies:=true;
http.CookieManager:=coom;
http.HandleRedirects:=true;
http.ProtocolVersion:=pv1_1;
reqs:=tstringlist.Create;
reqs.Add('act=login');
reqs.Add('success_url=');
reqs.Add('fail_url=');
reqs.Add('try_to_login=1');
reqs.Add('to=');
reqs.Add('vk=');
reqs.Add('email='+mail);
reqs.Add('pass='+pass);
reqs.Add('expire=');
resp:=http.Post('http://login.vk.com/',reqs);
delete(resp,1,pos('id=''s''',resp)+13);
s:=copy(resp,1,pos('''',resp)-1);
reqs.Clear;
reqs.Add('op=slogin');
reqs.Add('redirect=1');
reqs.Add('expire=0');
reqs.Add('to=');
reqs.Add('s='+s);
resp:=http.Post('http://vkontakte.ru/login.php?',reqs);
reqs:=http.Response.RawHeaders;
getcookie(reqs.Text);
end;

Автор: MetalFan 21.10.2009, 18:10
вконтактники наверное от таких и шифруются) что-то зачастили смены алгоритма авторизации)

Автор: Proxin 10.11.2009, 23:24
Снова сменили авторизацию. Вот код:
Код

uses idhttp,idcookiemanager;
var http:tidhttp;coom:tidcookiemanager;
procedure getcookie(st:string);
var i,j:integer;
    ncookie:string;
begin
ncookie:='';
for i:=1 to length(st) do
if copy(st,i,10) = 'Set-Cookie' then
begin
for j := i+11 to length(st) do
if st[j] = ';' then
begin
ncookie := ncookie + copy(st,i+11,j-i-10);
break;
end;
end;
if length(ncookie) > 50 then
begin
ncookie := 'Connection: Keep-Alive'+#13+'Cache-Control: no-cache'+#13+'Cookie: remixchk=5'+'Cookie: '+ncookie;
http.Request.CustomHeaders.Clear;
http.Request.CustomHeaders.Add(ncookie);
end;
end;
procedure login(mail,pass:string);
var reqs:tstringlist;resp,s:widestring;
begin
http:=TIdHTTP.Create(nil);
coom:=TIdCookieManager.Create(http);
http.AllowCookies:=true;
http.CookieManager:=coom;
http.HandleRedirects:=true;
http.ProtocolVersion:=pv1_1;
reqs:=tstringlist.Create;
reqs.Add('email='+mail);
reqs.Add('pass='+pass);
reqs.Add('expire=');
reqs.Add('vk=');
resp:=http.Post('http://login.vk.com/?act=login',reqs);
delete(resp,1,pos('id=''s''',resp)+13);
s:=copy(resp,1,pos('''',resp)-1);
reqs.Clear;
reqs.Add('op=slogin');
reqs.Add('redirect=1');
reqs.Add('expire=0');
reqs.Add('to=');
reqs.Add('s='+s);
resp:=http.Post('http://vkontakte.ru/login.php?',reqs);
reqs:=http.Response.RawHeaders;
getcookie(reqs.Text);
end;

УПД: Скажите, полезен ли материал?

Автор: Roen 11.11.2009, 15:23
Да, материал очень полезен  smile 

Автор: Ergoz 13.11.2009, 04:32
Ещё как полезен!!! мне нубу для изучения и вдупления как же всё таки поправлены кукисы )

буду ждать дальнейших апдейтов

Автор: MetalFan 13.11.2009, 14:35
Proxin, кстати, для работы кукименеджера необязательно его создавать. достаточно указать AllowCookies = true.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)