Как отправить каптчу на антигейт

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by besfamilnyi, 13 Jan 2019.

  1. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    Всем доброго времени суток. Такое дело, формошлепствую в 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);
    
    Но опять же не понятно ничего, а точнее как мне это применить к антигейт.
    Подскажите пожалуйста кому не жалко, знаю сейчас не модно помогать другим в подобных вопросах, но все же может кому не жалко объяснить. С Уважением.
     
  2. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    В общем как я понимаю никакой 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!
    как туда добавить картинку каптчи?
     
  3. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    Блин ничего у меня не делается просто так.
    В общем нагуглил для кодирования в base64 в RadStudio есть компонент, на форме работает файл кодирует, но при динамичном создании TIdEncoderMIME * me1=new TIdEncoderMIME(NULL); (с подключенными нужными заголовочными файлами) в потоке не кодирует, в codeguard куча ошибок указывающих туда куда я не полезу естественно, куда то в глубины этого компонента, полез в гугл, случайно наткнулся на подобную проблему на форуме radstudio, forums.embarcadero.com/message.jspa?messageID=664770
    Кто нибудь может подсказать, вообще не понимаю что нужно сделать, как определить этот явный конструктор который перенаправляет в конструктор базового класса?

    версия моего инди 10.6.2.5263.
     
    #3 besfamilnyi, 14 Jan 2019
    Last edited: 14 Jan 2019
  4. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    Блин вообще не понимаю где этт базовый класс у компонента который я создаю динамически. Не и имеется ли ввиду что нельзя вообще создавать динамически этот элемент а только на форме, а из потоков вызывать метод типа Form1->IdEncoderMIME->Ecncode? Тогда почему сам компонент динамически как бы создается, а вот сам метод Encode не работает? Создал тему на другом форуме по билдеру, тоже никто не может помочь, тишина.
     
  5. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
  6. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    Спасибо, но не знаю как это использовать.
    В файле .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 кинуть на форму а из потоков вызывать в критических секциях...
     
  7. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    В общем кое как получилось воспользоваться этой 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' );
    но все примеры найденные не понял, не могу разобраться.
     
    #7 besfamilnyi, 20 Jan 2019
    Last edited: 21 Jan 2019
  8. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    В общем я туговато понимаю подсказки билдера, т.к. я всего лишь любитель, в общем то догадался в чем соль:

    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 проходов, то увидите неимоверный расход памяти :) что бы этого избежать нужно просто чуток додумать этот код.
     
    #8 besfamilnyi, 22 Jan 2019
    Last edited: 27 Jan 2019