mail - прикрутить антикапчу

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by greki_hoy, 4 Dec 2010.

  1. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    кто возмется прикрутить антикапчу
    сейчас работает ручной ввод
    регает мыльники на @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();
    }
    
    
    
    
    
    
    
    
    
    
     
    #1 greki_hoy, 4 Dec 2010
    Last edited: 29 Dec 2010
    1 person likes this.
  2. Eicca

    Eicca New Member

    Joined:
    19 Jul 2010
    Messages:
    13
    Likes Received:
    1
    Reputations:
    0
    Если подойдет, то могу поделиться кодом Qt, скачивает капчу разбитую на 3 части, переводит в QPixmap, склеивает и отправляет на антигейт.