Показать сообщение отдельно

  #2  
Старый 20.05.2010, 20:22
RedFern.89
Постоянный
Регистрация: 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;
 
Ответить с цитированием