
20.05.2010, 20:22
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
С нами:
8582863
Репутация:
69
|
|
на тебе на примере логина вк. Код взят из моего компонента, так что некоторые строчки тупо удаляй
Код:
// ---- Вывод диалога ввода кода капчи ----
procedure TidVKClient.ShowCaptchaDialog(const captcha_sid: string);
var
MS : TMemoryStream;
Jpg : TJpegImage;
begin
Ms := TMemoryStream.Create;
Jpg := TJpegImage.Create;
try
HTTP.Get('http://vkontakte.ru/captcha.php?s=1&sid=' + captcha_sid, Ms);
Ms.Position := 0;
Jpg.LoadFromStream(ms);
DlgForm.imgKey.Picture.Graphic := Jpg;
finally
Jpg.Free;
Ms.Free;
end;
DlgForm.Caption := 'Enter Code';
DlgForm.ShowModal;
end;
// ---- Авторизация ----
function TIdVKClient.Login: boolean;
var
Hash : string;
sid : string;
Tmp : TStringList;
APost : TStringList;
I : Integer;
Cookie : TidCookieManager;
begin
(* --- Авторизация начата --- *)
// Создаем объекты
Tmp := TStringList.Create;
APost := TStringList.Create;
HTTP := TidHTTP.Create(nil);
Cookie := TidCookieManager.Create(nil);
HTTP.AllowCookies := True;
HTTP.HandleRedirects := True;
HTTP.CookieManager := Cookie;
with HTTP.Request do
begin
UserAgent := FHeaders.UserAgent;
Accept := FHeaders.Accept;
AcceptLanguage := FHeaders.AcceptLanguage;
AcceptCharset := FHeaders.AcceptCharset;
ContentType := FHeaders.ContentType;
Connection := FHeaders.Connection;
CustomHeaders.AddStrings(FHeaders.CustomHeaders);
end;
Tmp.Text := HTTP.Post('http://vkontakte.ru/login.php', APost);
// Если капча, то покажем дилог ввода кода с картинки
If Pos('captcha_sid', tmp.Text) <> 0 Then
begin
sid := tmp.Text;
sid := Copy(sid, Pos('":"', sid) + 3, Length(sid));
Delete(sid, Pos(#34, sid), Length(sid));
(* Код для вывода дилога *)
ShowCaptchaDialog(sid);
APost.Add('op=a_login_attempt');
APost.Add('captcha_sid=' + sid);
APost.Add('captcha_key=' + key);
HTTP.Post('http://vkontakte.ru/login.php', APost);
end;
// Подготовка
APost.Clear;
APost.Add('act=login');
APost.Add('email=' + FEmail);
APost.Add('pass=' + FPass);
// Отсылаем запрос
Tmp.Text := HTTP.Post('http://login.vk.com/', APost);
// Проверка на ошибки ;)
If Pos('error', Tmp.Text) <> 0 Then LOGIN_FLAG := False Else LOGIN_FLAG := True;
Result := LOGIN_FLAG;
(* Следующий фрагмент кода будет правильно работать при успешной авторизации *)
// Ищем хэш в теле ответа и выдергиваем его
For I := 0 To Tmp.Count -1 Do // Крутим строки...
begin
If Pos('id='#39's'#39, Tmp[i]) <> 0 Then // Если нашли строку id='s', ...
begin // Вытаскиваем из нее хэш
Hash := Tmp[i];
Hash := Copy(Hash, Pos('value=', Hash) +7, Length(Hash));
Delete(Hash, Pos(#39, Hash), Length(Hash));
end;
end;
// Ура!!1!1 нашли хэш! Шлем его на сервер
APost.Clear;
APost.Add('op=slogin');
APost.Add('s=' + Hash);
Tmp.Text := HTTP.Post('http://vkontakte.ru/login.php', APost);
// Чистим память
Tmp.Free;
APost.Free;
(* --- Авторизация завершена --- *)
end;
|
|
|