Антикапча C++ Builder

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Zuldrak, 28 Apr 2010.

  1. Zuldrak

    Zuldrak New Member

    Joined:
    15 Jan 2010
    Messages:
    45
    Likes Received:
    1
    Reputations:
    0
    Может кто нить будь дать простой пример работы с AC в билдере,

    Тупо отправка капчи - Ожидание - Прием

    Спасибо

    Желательно пример с Id Http а не на сокетах

    Компилятор желательно C++ Builder 6 или 9
     
    #1 Zuldrak, 28 Apr 2010
    Last edited: 28 Apr 2010
  2. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    PHP:
    //---------------------------------------------------------------------------
    String CheckCaptcha(String filenameString apikeybool is_phrasebool is_regsensebool is_numericint min_lenint max_len)
    {
        
    String sFtype "image/pjpeg";
        
    String sTmpstr "";
        
    String sCaptcha_id "";
        
    TIdMultiPartFormDataStream *multi = new TIdMultiPartFormDataStream;
        
    TIdHTTP *http = new TIdHTTP(0);
        
    multi->AddFormField("method""post");
        
    multi->AddFormField("soft_id""5");    
        
    multi->AddFormField("key"apikey);
        
    multi->AddFile("file"filenamesFtype);
        if(
    is_phrase)
            
    multi->AddFormField("phrase""1");
        if(
    is_regsense)
            
    multi->AddFormField("regsense""1");
        if(
    is_numeric)
            
    multi->AddFormField("numeric""1");
        if(
    min_len)
            
    multi->AddFormField("min_len"IntToStr(min_len));
        if(
    max_len)
            
    multi->AddFormField("max_len"IntToStr(max_len));

        
    sTmpstr http->Post("http://antigate.com/in.php"multi);

        if(
    sTmpstr.Pos("ERROR_"))
        {
            
    delete multi;
            
    delete http;
            return 
    sTmpstr;
        }
        if(
    sTmpstr.Pos("OK"))
        {
            
    sCaptcha_id sTmpstr.SubString(sTmpstr.Pos("|") + 1sTmpstr.Length() - sTmpstr.Pos("|"));
        }
        if(
    sCaptcha_id == "")
        {
            
    delete multi;
            
    delete http;
            return 
    "ERROR: bad captcha id!";
        }
        for(
    int i 012i++)
        {
            
    Sleep(5000);

            
    sTmpstr http->Get("http://antigate.com/res.php?key="+apikey+"&action=get&id="+sCaptcha_id);

            if(
    sTmpstr.Pos("ERROR_"))
            {
                
    delete multi;
                
    delete http;
                return 
    sTmpstr;
            }
            if(
    sTmpstr.Pos("OK|"))
            {
                
    delete multi;
                
    delete http;
                return 
    sTmpstr.SubString(sTmpstr.Pos("|") + 1sTmpstr.Length() - sTmpstr.Pos("|"));
            }
        }
        
    delete multi;
        
    delete http;
        return 
    "ERROR_TIMEOUT!";
    }
    //---------------------------------------------------------------------------
     
  3. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    не подскажете как в 6 ом билдере это осуществить? ругается на TIdMultiPartFormDataStream *multi = new TIdMultiPartFormDataStream;
     
  4. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    PHP:
    #include <IdMultipartFormData.hpp>
     
  5. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    M_script, а вы по-прежнему передаете через стек в функции целые объекты типа string, вместо того, чтобы пользоваться ссылками и указателями? Это же чрезвычайно неэффективно.
     
  6. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    #include <IdMultipartFormData.hpp>

    неробит. вроде как для билдера 6.0 класс отсутствует. прочитал в гугле.

    можно так поступить?

    TMemoryStream*cap=new TMemoryStream();
    cap->LoadFromFile("captcha.jpg");

    и передать?
     
    #6 good_man, 23 Aug 2010
    Last edited: 23 Aug 2010
  7. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Правильнее было бы заменить это:
    На

    Code:
    void CheckCaptcha(String& filename, String& apikey, String& answer, bool is_phrase, bool is_regsense, bool is_numeric, int min_len, int max_len) 
    Тут, вместо полного копирования объектов, будут передаваться лишь адреса на них. Вместо того, чтобы возвращать целый объект String из функции, что опять-таки приведет к его копированию, проще сделать параметр String& answer, чтобы функция могла в него записать необходимую информацию. Функцию придется немного переписать, но мы выиграем в быстродействии и сэкономим память.
    Можно, конечно, вернуть из функции указатель или ссылку на созданный динамически внутри функции объект String, но тогда придется его потом удалять вне тела функции после использования.
     
    #7 GRRRL Power, 23 Aug 2010
    Last edited: 23 Aug 2010
    1 person likes this.
  8. Spy2ex

    Spy2ex Elder - Старейшина

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    Вся эффективность теряется на тле протокола http, я не против оптимизации кода, просто если уже идти по вашей цепочке.
    Прощай С++ builder -> прощай curl -> привет сокеты (ведь это тоже потеря эффективности)
     
  9. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Я говорю не о теле протокола хттп (кстати что это вообще такое, вы сами придумали понятие?), я говорю о том, что через стек передавать объекты целиком очень неэффективно, это вызывает их копирование. Представьте, что вы хотите передать строку длиной 1000 символов в функцию. Так вот с таким подходом мы в итоге будем иметь две строки по 1000 символов, одна из которых по выходу из тела функции удалится. И это относится ко всем функциям, пусть мы пишем даже простой хеллоу ворлд, и ко всем компиляторам, а не только к билдеру. Стандарт для всех один.
     
    1 person likes this.
  10. Spy2ex

    Spy2ex Elder - Старейшина

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    Я это всё к тому что, вся эффективность теряется на стороне антикапчи, и тут как не оптимизируй быстрее не станет.

    з.ы я не противник ссылок.
     
    1 person likes this.
  11. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Ну, если в скорости сильно и не выиграем, то хотя бы памяти меньше будет уходить при вызове функции.
     
  12. Spy2ex

    Spy2ex Elder - Старейшина

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    Памяти меньше однозначно, но на соврмн. машинах это не столь чувствительно.

    Оптимизируй везде где только возможно. (с) slesh
     
  13. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    GRRRL Power, я еще локальную копию ключа антигейта создаю в каждом потоке, столько памяти теряется, просто ужас. Если это так интересно, я не использую эту функцию.
    Поймите смысл - мои программы работают быстро и стабильно, а времени на их написание уходит очень мало. Это и требуется клиентам. Им не интересно, как объявлен массив TThread и как передаются параметры функции.
    Плохо конечно, что из-за функции распознавания капчи мы за сутки работы программы потеряем времени от пары секунд до нескольких минут, но для кого это важно?
     
    #13 M_script, 24 Aug 2010
    Last edited: 24 Aug 2010
  14. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    С таким подходом к делу вам сложно будет писать сложные проекты... Там потерялось 10 секунд, тут 10, там 1 мегабайт, тут 1 - и в итоге получаем программу, которая грузится 20 минут и жрет 500 мегабайт памяти при скудном функционале.

    Представьте себе, что многие веб-программисты тоже рассуждают "а, не буду делать здесь проверку, все равно никто sql-инъекцию не применит, кому это надо". А потом хоп - и сайт сломан.

    А, ладно. Не мне вас учить.

    Поддерживаю slesh'а, он советует верно. И если не там, где только возможно, то хотя бы там, где необходимо.
     
  15. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Не соглашусь. Практически ни в одной программе не требуется оптимизация всего кода. Только тех участков, производительность которых не устраивает. Если оптимизировать все и вся - времени на написание программы потребуется в РАЗЫ больше.
    Вообще говоря:
    1) напиши
    2) посмотри, устраивает ли производительность
    3) если не устраивает - найди узкие места и оптимизируй.

    Я промолчу, что оптимизация начинается с архитектуры...

    UPD: Уточню, что я имею в виду:
    Я не согласен с тем утверждением, что нужно оптимизировать все, что можно. Нужно писать код, отдавая себе отчет о том, как он будет работать, какие побочные эффекты вызовут те или иные решения. И только по факту нехватки производительности/перерасхода памяти/т.п. - заниматься оптимизацией отдельных участков кода. Но для этого надо хорошо понимать, что творится в коде, и отлично владеть навыками проектирования, алгоритмизации и кодирования.
    В противном случае - забудьте о сколько-нибудь серьезных проектах, ваш удел - различные вариации "Hello World".
    Например, сложно представить, чтобы опытный и умелый прогер передавал здоровенные параметры по значению, вместо простой, удобной и быстрой передачи по ссылке.
     
    #15 Bers, 24 Aug 2010
    Last edited: 24 Aug 2010
  16. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    блин... как исправть чтоб в билдере 6.0 работал IdMultipartFormData.hpp
    выдает ошибку
    E2209 Unable to open include file IdMultipartFormData.hpp

    Update: ее! в общем обновил инди ) OK|40541753 :)
     
    #16 good_man, 24 Aug 2010
    Last edited by a moderator: 24 Aug 2010