кто возмется прикрутить антикапчу сейчас работает ручной ввод регает мыльники на @mail.ru пример вывода YOUR MAILBOX: 1b62d448c9cd4e0a@mail.ru PASS: 705ceef81c134912 код реентрабельный легко распараллелить и регать через прокси в несколько потоков Code: #define _CRT_SECURE_NO_WARNINGS #include <c++> #include <curl.h> #include <Rpcdce.h> #include <atlfile.h> // this random from vx.netlux.org static unsigned long mwc(){ static unsigned long x = 123456789, y = 362436069, z = 77465321, c = 13579; unsigned long long t; t = 916905990LL * x + c; x = y; y = z; c = t >> 32; return z = t & 0xffffffff; } static string random_str(){ UUID id; UuidCreate(&id); stringstream ss; ss<<hex<<id.Data1<<id.Data2<<id.Data3; return ss.str(); } static size_t reader(char *ptr, size_t size, size_t nmemb, string &out) { out.append(ptr, ptr + size * nmemb); return size * nmemb; } static void find_link(string &buf, stack<string> &k){ string::size_type es = 0, os; for (;;){ os = buf.find("x_image", es); if (os == string::npos) break; es = buf.find_first_of("\"", os); string x("http://win.mail.ru/cgi-bin/"); x.append(buf, os, es - os); k.push(x); } } #define SET(Opt,Val) curl_easy_setopt(easy, CURLOPT_##Opt, Val) static void download_captcha(stack<string> &k){ CURL *easy; string jpeg; easy = curl_easy_init(); while (k.size()){ SET(URL, k.top().c_str()); SET(WRITEDATA, &jpeg); SET(WRITEFUNCTION, &reader); curl_easy_perform(easy); stringstream ss; ss<<k.size()<<".jpeg"; CAtlFile of; of.Create(ss.str().c_str(), GENERIC_WRITE, 0, CREATE_ALWAYS); of.Write(jpeg.c_str(), jpeg.length()); k.pop(), jpeg.clear(); } curl_easy_cleanup(easy); } static void save_captcha(string &buf){ stack<string> k; find_link(buf, k); download_captcha(k); } static void btf(const char *&p, const char *&q, const char *n, string &buf){ if (n) p = strstr(buf.c_str(), n); while (*p != 'x' || p[1] != '_') p++; q = p; while (*++q != '"'); } static void addname_and_surname(string &buf, string &os){ const char *p, *e; btf(p, e, "<span class=\"sig1\">Имя</span>", buf); os.append(p, e - p); os.append("=").append(random_str()).append("&"); btf(p, e, "<span class=\"sig1\">Фамилия</span>", buf); os.append(p, e - p); os.append("=").append(random_str()); os.append("&"); } static void add_dd_mm_yy(string &buf, string &os){ stringstream dd; const char *p, *e; dd << mwc() % 28 + 1; btf(p, e, "<span class=\"sig1\">День рождения</span>", buf); os.append(p, e - p).append("="); os.append(dd.str()); os.append("&BirthMonth="); stringstream mm; mm << mwc() % 11 + 1; os.append(mm.str()).append("&"); btf(++p, e, NULL, buf); os.append(p, e - p).append("="); stringstream yy; yy << mwc() % 30 + 1970; os.append(yy.str()).append("&"); } static void add_girl_or_boy_sign(string &buf, string &os){ const char *p, *e; btf(p, e, "<span class=\"sig1\">Пол</span>", buf); os.append(p, e - p).append("=1&"); } static void add_mailslot_and_password(string &buf, string &os, string &mail, string &pass){ const char *p, *e; btf(p, e, "<span class=\"sig1\">Почтовый ящик</span>", buf); os.append(p, e - p).append("="); mail = random_str(); os.append(mail).append("&"); os.append("RegistrationDomain=mail.ru&"); btf(p, e, "<span class=\"sig1\">Пароль</span>", buf); os.append(p, e - p).append("="); pass = random_str(); os.append(pass).append("&"); btf(p, e, "<span class=\"sig1\">Повторите пароль</span>", buf); os.append(p, e - p).append("="); os.append(pass).append("&"); } static void add_question_and_answer(string &buf, string &os){ os.append("Password_Question=%C4%E5%E2%E8%F7%FC%FF+%F4" "%E0%EC%E8%EB%E8%FF+%EC%E0%F2%E5%F0%E8"); os.append("&"); const char *p, *e; btf(p, e, "<span class=\"sig1\">Свой вопрос</span>", buf); os.append(p, e - p).append("=").append("&"); btf(p, e, "<span class=\"sig1\">Ответ</span>", buf); os.append(p, e - p).append("="); os.append(random_str()).append("&"); btf(p, e, "<span class=\"sig1\">Дополнительный e-mail</span>", buf); os.append(p, e - p).append("=").append("&"); } static void add_captcha_code(string &buf, string &os, string &cap){ const char *p, *e; btf(p, e, "<span class=\"sig1\">Код на картинке</span>", buf); os.append(p, e - p).append("=").append(cap); } static void add_id_and_xregid(string &buf, string &os){ const char *q = buf.c_str(); os.append("signup_b=1&ID="); const char *p = strstr(q, "\"ID\" value=\""); while (*p++ != '='); const char *e = ++p; while (*++e != '"'); os.append(p, e - p); os.append("&Count=1&back=&browserData=NoJS&Mrim" ".Country=0&Mrim.Region=0&x_reg_id="); p = strstr(q, "x_reg_id"); while (*p++ != '='); e = ++p; while (*++e != '"'); os.append(p, e - p); os.append("&security_image_id=&geo_countryId=undefined" "&geo_cityId=undefined&geo_regionId=undefined&geo_country=&geo_place=&"); } static string make_post_data(string &buf, string &cap, string &mail, string &pass){ string os; add_id_and_xregid(buf, os); addname_and_surname(buf, os); add_dd_mm_yy(buf, os); os.append("your_town=&"); add_girl_or_boy_sign(buf, os); add_mailslot_and_password(buf, os, mail, pass); os.append("RemindPhone=&"); add_question_and_answer(buf, os); os.append("my_create=1&"); add_captcha_code(buf, os, cap); return os; } static bool is_registration_succeeded(string &buf){ if (buf.find("зарегистрирован") != string::npos && buf.find("успешно") != string::npos) { return true; } return false; } static string captcha(string &buf){ save_captcha(buf); puts("enter:"); string cap; cin>>cap; return cap; } static void download_form(CURL *easy, string &buf){ char null = 0x00; SET(URL, "http://win.mail.ru/cgi-bin/signup"); SET(HEADER, TRUE); SET(FOLLOWLOCATION, TRUE); SET(ENCODING, &null); SET(VERBOSE, TRUE); SET(AUTOREFERER, TRUE); SET(COOKIEFILE, &null); SET(WRITEDATA, &buf); SET(WRITEFUNCTION, &reader); curl_easy_perform(easy); } static void outer_valid_mailbox(string &buf, string &mail, string &pass){ if (is_registration_succeeded(buf)) cout<<"\n\n\nYOUR MAILBOX: "<<mail<<"@mail.ru"<<"\nPASS: "<<pass<<'\n'; else puts("error ?"); } static void run(){ string buf; string mail, pass; CURL *easy = curl_easy_init(); download_form(easy, buf); /* * connect to anti-captcha.com * here and now simply manual input */ string cap = captcha(buf); //... string post = make_post_data(buf, cap, mail, pass); // hmm... can be use proxy for post requests // lock(this_thread) proxy = next_proxy(mutltithread_proxy_list) // unlock(this_thread) SET(PROXY, proxy) SET(URL, "http://win.mail.ru/cgi-bin/reg"); SET(POST, TRUE); SET(POSTFIELDS, post.c_str()); buf.clear(); curl_easy_perform(easy); outer_valid_mailbox(buf, mail, pass); curl_easy_cleanup(easy); } int main(){ curl_global_init(CURL_GLOBAL_ALL); // or QueueUserWorkItem(run) for multithread run(); curl_global_cleanup(); }
Если подойдет, то могу поделиться кодом Qt, скачивает капчу разбитую на 3 части, переводит в QPixmap, склеивает и отправляет на антигейт.