Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Вывод капчи в окно с VK (https://forum.antichat.xyz/showthread.php?t=205513)

ArkNet 20.05.2010 20:17

Вывод капчи в окно с VK
 
Как вывести капчу в Отдельное окно с Edit1, а потом отправить разшыфрованую обратно в ВК..? :confused:

RedFern.89 20.05.2010 20:22

на тебе на примере логина вк. Код взят из моего компонента, так что некоторые строчки тупо удаляй

Код:


// ---- Вывод диалога ввода кода капчи ----
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;


ArkNet 20.05.2010 20:23

При отправке ПОСТ запроса получаю в мемо такой код
{"ok":-2,"captcha_sid":"198480237911","text":"Enter code"}

ArkNet 20.05.2010 20:26

Спасибо за код RedFern.89 , как твой компонент установить.И какие методы есть и для чего они служат

Sams 20.05.2010 20:27

RedFern.89,
исходя из количества несущей информации выше заданного вопроса, можно твёрдо сказать, что вряд-ли он поймет хотя бы начало твоего кода :(

ArkNet
,
твой вопрос идентичен:"Что такое стенка? Она покрашена". Мой тебе совет:
1. Напиши язык программирования, на котором ты кодишь.
2. Опиши конкретней цели, которые ты преследуешь. А то же НИЧЕРТА непонятно, ты хочешь вывести капчу в виде текстовой строки в текстовое поле? Или ты хочешь его вывести как картинку? Отправить обратно куда? И что значит "расшифрованную"?

ArkNet 20.05.2010 20:45

RedFern.89 розобрался с твоим кодом.Его смысл такой
Отправляем пост запрос пустой, если вылезла капча то для вывода ее используем самую верхнюю процедуру.
Потом отправляем пост запросс с нашими данными.
А теперь скажы что у тебя в USES
И какой надо Инди чтоб твой ВК компонент установить?

RedFern.89 20.05.2010 20:55

инди 7-9, в uses idHTTP, idCookieManager, jpeg; - это конкретно для процедуры. а компонент установить легко - Component -> Install Component. Список функций, подробности установки и т.д. смотри тут: https://forum.antichat.ru/threadnav204126-1-10.html

ArkNet 20.05.2010 22:50

Компилируется нормально но при запуске выдает ошибку "access violation at address 00403404 in module 'Project1.exe'. Read of address D284562F"
Вот код:
Добавил на форму кукименеджер и связал его с ашттп.
procedure Dialog(const captcha_sid: string);
var
MS : TMemoryStream;
Jpg : TJPEGImage;
begin
Ms := TMemoryStream.Create;
Jpg := TJPEGImage.Create;
try
Form1.idHttp1.Get('http://vkontakte.ru/captcha.php?s=1&sid=' + captcha_sid, Ms);
Ms.Position := 0;
Jpg.LoadFromStream(ms);
Form1.Image1.Picture.Graphic:= Jpg;
finally
Jpg.Free;
Ms.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Hash, sid: string;
Tmp,APost: TStringList;
begin
Tmp.Text := IdHTTP1.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));
Dialog(sid);
APost.Add('op=a_login_attempt');
APost.Add('captcha_sid=' + sid);
APost.Add('captcha_key=' + Edit1.Text);
IdHTTP1.Post('http://vkontakte.ru/login.php', APost);
end;
APost.Clear;
APost.Add('act=login');
APost.Add('email=' + Edit2.Text);
APost.Add('pass=' + Edit3.Text);
Tmp.Text := IdHTTP1.Post('http://login.vk.com/', APost);
Hash:=copy(Tmp.Text, 286, 56);
APost.Clear;
APost.Add('op=slogin');
APost.Add('s=' + Hash);
Tmp.Text := IdHTTP1.Post('http://vkontakte.ru/login.php', APost);
Memo1.Text:=Tmp.Text;
Tmp.Free;
APost.Free;
end;

RedFern.89 21.05.2010 00:21

=)))
 
Интерессно, а как ты загрузишь что-то в класс TStringList, не создаве его в памяти как объект? о_О
в начале напиши:
Tmp := TStringList.Create;
APost := TStringList.Create;


Время: 17:43