[php] Разгадываем капчи

Статус
В этой теме нельзя размещать новые ответы.

wolgast

Профессор
Регистрация
8 Дек 2006
Сообщения
297
Реакции
35
Давай подумаем зачем оно нам нужно?! Капчами сейчас защищают практически все формы заполняемые случайными посетителями. Их используют при регистрации на форумах, регистрации ящиков.. да вообще везде. А теперь представь, что ты достал большую базу каталогов ссылок на каком-то определенном движке и там для размещения ссылки нужно вводить капчу!

Если бы капчи не было, то все было бы очень просто, спамь и все. А что делать если капча есть? Да на самом деле все так же просто, только нужно еще научиться использовать сервис anti-captcha.com! Поехали...

Для начала нужно зарегистрироваться на сайте anti-captcha.com. Стоимость одной капчи - $0.001- ИМХО - цена очень приятная ($1 за 1000 загрузок)

Инвайты для регистрации можно

После регистрации нужно пополнить счет и посмотреть свой ключ (дальше $key) в настройках. Для экспериментов сделал вот такую вот простую формочку:



Форма-имитатор регистрации с капчей. Вводим любое имя и значение с капчи. Если капчу ввели правильно, то получаем сообщение:

Привет кодер
тест пройден

В противном случае:

Вернись и введи правильный код!

Для начала нужно провести анализ полей формы. У нас есть следующие поля:

user - имя пользователя
captcha - значение капчи
act=reg - скрытое поле

Все это нужно посылать методом POST. Картинку нам отдает скрипт img.php

Еще следует помнить, что значение капчи привязано к сессии, а значит после первого подключения нам нужно будет сохранить идентификатор сессии.

Алгоритм:

1. Сливаем капчу ( ) и сохраняем идентификатор сессии
2. Отправляем капчу на разгадывание. Получаем значение
3. Имея значение капчи и идентификатор сессии заканчиваем регистрацию

Вот так вот, все просто. Начнем.

Основная функция в скрипте - geturl(). С ее помощью будем сливать и постить.

Принимает URL к которому подключиться, массив $postdata с данными для POST и параметр $header. Если последний равен единице, то выводим только заголовки страницы

PHP:
<?php
function geturl($url,$postdata=0,$header=0)
{
	$poststr="";
	if ($postdata)
		while (list($name,$value)=each($postdata)){
	    	if (strlen($poststr)>0)
	    		$poststr.="&";
	    	$poststr.=$name."=".urlencode($value);
	        }

	// инициализация сеанса
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);

	if ($header){
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_NOBODY, 1);
	}else{
		curl_setopt($ch, CURLOPT_HEADER, 0);
	}

	if ($postdata){
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $poststr);
	}

	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$res = curl_exec($ch);
	curl_close($ch);
	return $res;
}

?>

Для начала нужно получить идентификатор сессии. Для этого получаем заголовки

PHP:
$header = geturl('http://myseoincome.ru/php/anticaptcha/',0,1);

Ответ

HTTP/1.1 200 OK
Date: Sat, 13 Dec 2008 09:16:20 GMT
Server: Apache/1.3.34 (Debian)
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
X-Powered-By: PHP/5.2.0-8+etch13
Set-Cookie: PHPSESSID=edd8be2ff7a1577cc048734b43607415; path=/
Connection: close
Content-Type: text/html

Из этого всего вытаскиваем ID сессии (edd8be2ff7a1577cc048734b43607415)

PHP:
preg_match('|PHPSESSID=(.*);|U', $header, $out);
$session = $out[1];

Теперь, имея идентификатор, можно слить капчу и отправляем ее на anti-captcha.com Рассказывать о том, какие параметры принимает этот сервис и зачем, я не буду, документации на их сайте хватает.

PHP:
$postdata = array(
	'PHPSESSID' => $session

);
$captcha = geturl('http://myseoincome.ru/php/anticaptcha/img.php',$postdata);

$postdata = array(
    'method'    => 'base64',
    'key'       => $key,
    'body'      => base64_encode($captcha),
    'ext' 	=> 'png'
);
$rev = geturl("http://anti-captcha.com/in.php",$postdata);

if (substr($rev,0,2)=='OK'){
	//получаем id капчи в системе
	$anti_captcha_id = substr($rev,3);
}else{
	echo "Upload ERROR";
	exit;
}
//ждем 15 сек и проверяем капчу
sleep(15);

$postdata = array(
    'key'       => $key,
    'action'    => 'get',
    'id' 	=> $anti_captcha_id
);

$cap = geturl("http://anti-captcha.com/res.php",$postdata);

if (substr($cap,0,2)=='OK'){
	$captcha_value = substr($cap,3);
}else{
	echo "ERROR";
	exit;
}

О этом куске кратко. Сначала используя ID сессии сливаем капчу и постим ее в антикапчу. Из ответа антикапчи получаем ID операции, по которому потом будет проверять ее статус. Поскольку эти капчи вводят люди и для распознания им нужно время, то я сделал перед проверкой значения, паузу в 15 секунд! Правильнее было бы проверять статус каждые 5 сек. в цикле, но усложнять этот пример я не буду, сами допишете.

В итоге, если все прошло без ошибок, мы получим значение введенной капчи. Остается только запостить форму!

PHP:
$postdata = array(
	"user" => "SEO-шник",
	"captcha" => $captcha_value,
	"act" => "reg",
	"PHPSESSID" => $session

);
$recdata = geturl('http://myseoincome.ru/php/anticaptcha/',$postdata);
echo $recdata;

Я получил в ответ:

Привет SEO-шник тест пройден

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

Вот и все. При перепечатывании очень прошу указывать сайт - Удачи!
 
  • Нравится
Реакции: BFox
C введением бронирования распознаваний у них появился сильный деффицит свободных слотов. Хотя, по цене это, пока что, лучшее предложение.
 
Хорошая статья для новичков.
Только можно добавить несколько слов о прокси. Если сайт с защитой-капчей серьёзный, то менять надо обязательно. Очень часто получал сообщение о просраченом ип, когда регил фри-хостинг)
 
Учту! Сам пока умудряюсь спамить без проксей, вот и не задел эту тему. Думаю скоро напишу вторую часть, там и прокси будут
 
Помню таким занимался:
Но разбирал тогда картинку в виде матрицы, сейчас поищу - может где то осталась реализация. Работало только с шрифтами Arial и Times New Roman
Да и год тогда был 2005 или 2004...
Если кому то нужно, а то искать нужно - оно на дивидюшке где то...
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху