Всем доброго времени суток. Такое дело, формошлепствую в C++ Rad Studio, захотел прикрутить антикаптчу к софту, раньше это легко делал через TIdMultiPartFormDataStream пост-запросом через TIdHttp, сейчс вот зашел на антигейт почитать документацию а там как я понял все изменилось, теперь отправка идет через json-post, так вот блин а я понятия не имею с какой стороны к этому подойти, немного погуглил нашел что есть в RadStudio DBXJSON.hpp, TJSONObject *obj = new TJSONObject; но опять же понятия не имею как этим пользоваться, как заполнить этот объект нужными данными и отправить при помощи idhttp, так же не знаю как кодируют картинку в этот base64. так же нашел вот такой код: Code: TIdMultiPartFormDataStream *DataStream = new TIdMultiPartFormDataStream; DataStream->AddFormField("Script",Script); DataStream->AddFormField("Params",Params->ToJSON()); TMemoryStream *Result = new TMemoryStream; IdHTTP->Post(URL,DataStream,Result); и такой TStringList *DataStream = new TStringList; DataStream->Add("Script=" + Script); DataStream->Add("Params=" + Params->ToJSON()); TMemoryStream *Result = new TMemoryStream; IdHTTP->Post(URL,DataStream,Result); Но опять же не понятно ничего, а точнее как мне это применить к антигейт. Подскажите пожалуйста кому не жалко, знаю сейчас не модно помогать другим в подобных вопросах, но все же может кому не жалко объяснить. С Уважением.
В общем как я понимаю никакой TJSONObject *obj = new TJSONObject; мне не нужен, как я понимаю его юзают для парсинга JSON, а мне просто нужно составить строку со всеми параметрами, как то добавив туда картинку в base64. Значит надо юзать или TStringList или TIdMultiPartFormDataStream. В АПИ антигейта написано "Адрес метода: https://api.anti-captcha.com/createTask" то есть просто нужно на этот адрес отправить пост запрос с нужными параметрами? собственно параметры запроса : Code: { "clientKey":"dce6bcbb1a728ea8d563de6d169a2057", "task": { "type":"ImageToTextTask", "body":"BASE64_BODY_HERE!", "phrase":false, "case":false, "numeric":false, "math":0, "minLength":0, "maxLength":0 } } То есть грубо говоря нужно вот это отправить длинной строкой? Но ума не приложу как понимать вот эту строку BASE64_BODY_HERE! как туда добавить картинку каптчи?
Блин ничего у меня не делается просто так. В общем нагуглил для кодирования в base64 в RadStudio есть компонент, на форме работает файл кодирует, но при динамичном создании TIdEncoderMIME * me1=new TIdEncoderMIME(NULL); (с подключенными нужными заголовочными файлами) в потоке не кодирует, в codeguard куча ошибок указывающих туда куда я не полезу естественно, куда то в глубины этого компонента, полез в гугл, случайно наткнулся на подобную проблему на форуме radstudio, forums.embarcadero.com/message.jspa?messageID=664770 Кто нибудь может подсказать, вообще не понимаю что нужно сделать, как определить этот явный конструктор который перенаправляет в конструктор базового класса? версия моего инди 10.6.2.5263.
Блин вообще не понимаю где этт базовый класс у компонента который я создаю динамически. Не и имеется ли ввиду что нельзя вообще создавать динамически этот элемент а только на форме, а из потоков вызывать метод типа Form1->IdEncoderMIME->Ecncode? Тогда почему сам компонент динамически как бы создается, а вот сам метод Encode не работает? Создал тему на другом форуме по билдеру, тоже никто не может помочь, тишина.
Спасибо, но не знаю как это использовать. В файле .h подключаю #include <System.NetEncoding.hpp> в этом же файле .h пробовал и так: class PASCALIMPLEMENTATION TBase64Encoding { public: TNetEncoding; //и так //void __fastcall Encode(); }; и так: class PASCALIMPLEMENTATION TBase64Encoding : public TNetEncoding { Encode(); //и так //void __fastcall Encode(); }; на форме пытаюсь вызвать Encode() и ошибка и так пробовал TNetEncoding->Encode("123456"); короче мне это тоже как мартышке очки... Не хватает знаний... Не могли бы вы мне подсказать что нужно сделать что бы этим можно было воспользоваться? Я так понимаю это тоже для 1потока? Допустим мне нужно это делать в многопотоке, получается этим можно пользоваться только через CriticalSection? Но с таким же успехом можно и этот несчастный TIdEncoderMIME кинуть на форму а из потоков вызывать в критических секциях...
В общем кое как получилось воспользоваться этой System.NetEncoding.hpp но только для кодирования строки Memo1->Lines->Add(TNetEncoding::Base64->Encode("qwerty") ); Строку кодирует. пытаюсь кодировать ТMemoryStream fotofile это TMemoryStream TNetEncoding::Base64->Encode(fotofile->ToString()); Проверил что вообще там после преобразования fotofile->ToString(), тупо находится строка "TMemoryStream". так же нашел еще вот такое TBase64Encoding * Encoding = new TBase64Encoding( 64, '\n' ); но все примеры найденные не понял, не могу разобраться.
В общем я туговато понимаю подсказки билдера, т.к. я всего лишь любитель, в общем то догадался в чем соль: Code: TMemoryStream *fotofile = new TMemoryStream; TMemoryStream *out_file = new TMemoryStream; TStringList*list=new TStringList(); fotofile->LoadFromFile("file.jpg"); //что бы работать со stream билдер подсказывает что нужно делать так: //TNetEncoding::Base64->Encode(StreamIN, StreamOUT); т.е. что кодировать и во что поместить результат TNetEncoding::Base64->Encode(fotofile, out_file); //out_file->Seek(0, soFromBeginning);//или так, обязательно позицию в начало out_file->Position=0;//или так, так для меня попроще list->LoadFromStream(out_file); Memo1->Lines->Add(list->Text); delete fotofile; delete out_file; delete list; И так, это в принципе решает мою задачу, хотя и пришлось создавать 3 дополнительных компонента для этой операции, что не очень то и изящно, но файл кодирует в base64. Попробую конечно еще как то это улучшить, но пока так. Еще вопрос к знатокам: Если этот метод использовать в многопотоке, в копиях потока, вызов этой функции кодирования нужно синхронизировать? ------------------------------------------------------- p.s.: для тех кто потом увидит данное решение, особенно новички, сразу предупреждаю, что если вы запустите это в цикле даже на 10-20 проходов, то увидите неимоверный расход памяти что бы этого избежать нужно просто чуток додумать этот код.