Просмотр полной версии : Вывод капчи в окно с 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;
При отправке ПОСТ запроса получаю в мемо такой код
{"ok":-2,"captcha_sid":"198480237911","text":"Enter code"}
Спасибо за код RedFern.89 , как твой компонент установить.И какие методы есть и для чего они служат
RedFern.89,
исходя из количества несущей информации выше заданного вопроса, можно твёрдо сказать, что вряд-ли он поймет хотя бы начало твоего кода :(
ArkNet,
твой вопрос идентичен:"Что такое стенка? Она покрашена". Мой тебе совет:
1. Напиши язык программирования, на котором ты кодишь.
2. Опиши конкретней цели, которые ты преследуешь. А то же НИЧЕРТА непонятно, ты хочешь вывести капчу в виде текстовой строки в текстовое поле? Или ты хочешь его вывести как картинку? Отправить обратно куда? И что значит "расшифрованную"?
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
Компилируется нормально но при запуске выдает ошибку "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;
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot