февраля 2, 2010 | by Макс | Темой для этой статьи решил выбрать “разгадывание” капчей (captcha). Во-первых давай подумаем зачем оно нам нужно?! Капчами сейчас защищают практически все формы заполняемые случайными посетителями. Их используют при регистрации на форумах, регистрации ящиков.. да вообще везде. А теперь представь, что ты достал большую базу каталогов ссылок на каком-то определенном движке и там для размещения ссылки нужно вводить капчу! Если бы капчи не было, то все было бы очень просто, спамь и все. А что делать если капча есть? Да на самом деле все так же просто, только нужно еще научиться использовать сервис anti-captcha.
com (новый URL: ac-service. info)! Поехали… Для начала нужно зарегистрироваться на сайте anti-captcha. com. Стоимость одной капчи – $0.001- ИМХО – цена очень приятная ($1 за 1000 загрузок) После регистрации нужно пополнить счет и посмотреть свой ключ (дальше $key) в настройках. Для экспериментов была сделана вот такая простая формочка: h++p://myseoincome. ru/php/anticaptcha/ Форма-имитатор регистрации с капчей. Вводим любое имя и значение с капчи. Если капчу ввели правильно, то получаем сообщение: Привет кодер тест пройден В противном случае: Вернись и введи правильный код! Для начала нужно провести анализ полей формы. У нас есть следующие поля: user – имя пользователя captcha – значение капчи act=reg – скрытое поле Все это нужно посылать методом POST. Картинку нам отдает скрипт img. php Еще следует помнить, что значение капчи привязано к сессии, а значит после первого подключения нам нужно будет сохранить идентификатор сессии. Алгоритм: Сливаем капчу (h++p://myseoincome. ru/php/anticaptcha/img. php) и сохраняем идентификатор сессии Отправляем капчу на разгадывание. Получаем значение Имея значение капчи и идентификатор сессии заканчиваем регистрацию Вот так вот, все просто. Начнем. Основная функция в скрипте – geturl(). С ее помощью будем сливать и постить. Принимает URL к которому подключиться, массив $postdata с данными для POST и параметр $header. Если последний равен единице, то выводим только заголовки страницы 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; } ?> Для начала нужно получить идентификатор сессии. Для этого получаем заголовки $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) preg_match(‘|PHPSESSID=(.*);|U’, $header, $out); $session = $out[1]; Теперь, имея идентификатор, можно слить капчу и отправляем ее на anti-captcha. com Рассказывать о том, какие параметры принимает этот сервис и зачем, я не буду, документации на их сайте хватает. $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 сек. в цикле, но усложнять этот пример я не буду, сами допишете. В итоге, если все прошло без ошибок, мы получим значение введенной капчи. Остается только запостить форму! $postdata = array( “user” => “SEO-шник”, “captcha” => $captcha_value, “act” => “reg”, “PHPSESSID” => $session ); $recdata = geturl(‘http://myseoincome. ru/php/anticaptcha/’,$postdata); echo $recdata; Я получил в ответ: Привет SEO-шник тест пройден Пример может подвиснуть если антикапча перегружена, а по ответам антикапчи можно определить когда заканчиваются средства на счете или когда просто нет свободных слотов. Все это найдете на страницы документации сервиса. Вот и все. Удачи! h++p://myseoincome. ru/2008/12/php_anticaptcha/ Теги: captcha, php, капча