Работа с AntiCaptcha (ac-service.info) в С++

Пример, выложенный на сайте самого сервиса – не компилируется minGW, поэтому я его пофиксил и немного доработал – результаты разгаданной капчи теперь не пролетают на экране, а сохраняются в файл.

Мои исправления:

— функция sleep(10) – должна быть записана с большой буквы и в микросекундах – Sleep(10000)  – теперь скрипт будет спать 10 секунд.

— исправлен адрес сервиса, который везде был проставлен как anticaptcha.com – на ac-service.info

— добавлена функция file_put_contents(файл, содержимое) (о, пхп!). Функция сохраняет ответ антикапчи в указанный файл.

Вот код:

/*
Anti-captcha.com C++ w/CURL usage example
1. replace variable "ackey" with your own
2. replace variable "captchafile" with your own captcha filename
3. compile with g++ option -lcurl
*/


#include
#include
//#include
//#include <sys/stat.h>
//#include
#include
#include
#include <curl/curl.h>

using namespace std;
string contents,tempstr;

string ackey="4ba8e36d76d571c4f37f786509834e19";
string captchafile="captcha.jpg";

size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream);
bool myCheckIn(string& HTML, int *pos, string str, bool reg);
int strpos(string& haystack, const char * needle);
string substr(string& str, int pos, int offset);
void file_put_contents(char *name, string res);

int main()
{

int captcha_id=0;
CURL *hCurl = NULL;
CURLcode cc;
char error_buffer[1024];
char tmp_char[256];
   if (!hCurl)
   {
      cc = curl_global_init(CURL_GLOBAL_ALL);
      hCurl = curl_easy_init();
   }

   if (hCurl)
   {

    char *url = "https://ac-service.info/in.php";

    struct curl_httppost *post=NULL;
    struct curl_httppost *last=NULL;
    curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, handle_data);
    curl_easy_setopt(hCurl, CURLOPT_URL, url);
    curl_easy_setopt(hCurl, CURLOPT_ERRORBUFFER, &error_buffer);
    curl_formadd(&post, &last,   CURLFORM_COPYNAME, "method",   CURLFORM_COPYCONTENTS, "post", CURLFORM_END);
    curl_formadd(&post, &last,   CURLFORM_COPYNAME, "key",   CURLFORM_COPYCONTENTS, ackey.c_str(), CURLFORM_END);
    curl_formadd(&post, &last,   CURLFORM_COPYNAME, "file",   CURLFORM_FILE, captchafile.c_str(), CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END);

    //setting form fields to handler
    curl_easy_setopt(hCurl, CURLOPT_HTTPPOST, post);

    //posting
    curl_easy_perform(hCurl);

    //cleaning
    curl_formfree(post);
    curl_easy_cleanup(hCurl);
    curl_global_cleanup();

    //checking for error
    if (strpos(contents,"ERROR")!=-1)
    {
        printf("found error: %sn",contents.c_str());
        exit(1);
    }

    //getting id
    tempstr=substr(contents,3,10);
    captcha_id=atoi(tempstr.c_str());
    printf("captcha id: %dn",captcha_id);
    contents="";

    //creating new url
    sprintf(tmp_char,"https://ac-service.info/res.php?key=%s&action=get&id=%d",ackey.c_str(),captcha_id);

    //sleeping for 10-second periods and pinging anti-captcha
    while (1)
    {
        printf("sleeping for 10 seconds....n");
        Sleep(10000);
        printf("checking for captcha result...");
        hCurl = curl_easy_init();
        if (hCurl)
        {
            curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, handle_data);
            curl_easy_setopt(hCurl, CURLOPT_URL, tmp_char);
            curl_easy_setopt(hCurl, CURLOPT_ERRORBUFFER, &error_buffer);
            curl_easy_perform(hCurl);
            curl_easy_cleanup(hCurl);
            curl_global_cleanup();
            if (strpos(contents,"NOT_READY")!=-1)
            {
                printf("captcha is not ready yetn");
            }
            if (strpos(contents,"ERROR")!=-1)
            {
                //found error
                printf("error: %sn",contents.c_str());
                exit(1);
            }
            if (strpos(contents,"OK")!=-1)
            {
                //captcha is ready
                tempstr=substr(contents,3,30);
                printf("captcha result: %sn",tempstr.c_str());
                string res = "captcha result: ";
                res.append(tempstr.c_str());
                file_put_contents("test.txt", res);
                break;
            }
            contents="";
        } else { printf("CURL errorn"); exit(1); }
    }

   } else printf("CURL errorn");
 printf("donen");

}

size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
    int numbytes = size*nmemb;
    char lastchar = *((char *) ptr + numbytes - 1);
    *((char *) ptr + numbytes - 1) = '';
    contents.append((char *)ptr);
    contents.append(1,lastchar);
    *((char *) ptr + numbytes - 1) = lastchar;
    return size*nmemb;
}
bool myCheckIn(string& HTML, int *pos, string str, bool reg)
{
 if(HTML.size() < *pos + str.size()) return false;
 for(unsigned int i = 0; i < str.size(); i++)
 {
  if(str[i] != HTML[i + *pos]) return false;
 }
 *pos += str.size() - 1;
 return true;
}
int strpos(string& haystack, const char * needle)
{
    string tmp;
    tmp=needle;
    unsigned int hsize = haystack.size();
    for (unsigned int i=0;i<hsize;i++)
    {
        if (myCheckIn(haystack, (int *) &i,tmp,true)) return (i-tmp.size()+1);
    }
    return -1;
}
string substr(string& str, int pos, int offset)
{
    int i;
    string res;
    for (i=pos;i<(pos+offset);i++)
    {
        res += str[i];
    }
    return res;
}

void file_put_contents(char *name, string res)
{
    ofstream fout(name);
    fout << res;
    fout.close();
}

 

Рейтинг
( Пока оценок нет )
Загрузка ...