на тебе на примере логина вк. Код взят из моего компонента, так что некоторые строчки тупо удаляй Code: // ---- Вывод диалога ввода кода капчи ---- 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, исходя из количества несущей информации выше заданного вопроса, можно твёрдо сказать, что вряд-ли он поймет хотя бы начало твоего кода ArkNet, твой вопрос идентичен:"Что такое стенка? Она покрашена". Мой тебе совет: 1. Напиши язык программирования, на котором ты кодишь. 2. Опиши конкретней цели, которые ты преследуешь. А то же НИЧЕРТА непонятно, ты хочешь вывести капчу в виде текстовой строки в текстовое поле? Или ты хочешь его вывести как картинку? Отправить обратно куда? И что значит "расшифрованную"?
RedFern.89 розобрался с твоим кодом.Его смысл такой Отправляем пост запрос пустой, если вылезла капча то для вывода ее используем самую верхнюю процедуру. Потом отправляем пост запросс с нашими данными. А теперь скажы что у тебя в USES И какой надо Инди чтоб твой ВК компонент установить?
инди 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;
=))) Интерессно, а как ты загрузишь что-то в класс TStringList, не создаве его в памяти как объект? о_О в начале напиши: Tmp := TStringList.Create; APost := TStringList.Create;