Статья расчитана на новичков, желающих понять как работать с капчей и сервисом Антикапча. И так делать было нечего, решил посмотреть на сервис Антикапчи, заодно подкину Инвайт: fb9ac24a58. Цель выбрал сайт Украинского Мобильного Оператора MTC, скрипт отправки СМС - http://www.mts.com.ua/ukr/sendsms.php Вообщем дальше исходники и коментарии к ним: Файл mts.php PHP: <?php $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4'; $ch = curl_init('http://www.mts.com.ua/ukr/sendsms.php'); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_REFERER, 'http://www.mts.com.ua/ukr/sendsms.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); curl_close($ch); ### Func ### function get_session($var) { preg_match('#PHPSESSID=(.*);#',$var,$matches); $session = $matches[1]; return $session; } ############ $session = get_session($res); if(preg_match('#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#',$res,$matches)) { $rnd = $matches[2]; $ch = curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd"); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session); curl_setopt($ch, CURLOPT_REFERER, 'http://www.mts.com.ua/ukr/sendsms.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); curl_close($ch); file_put_contents('cap.jpg',$res); } ####################################### function recognize($filename, $apikey, $is_verbose = true, $rtimeout = 3, $mtimeout = 200, $is_phrase = 0, $is_regsense = 0, $is_numeric = 0, $min_len = 0, $max_len = 0) { if (!file_exists($filename)) { if ($is_verbose) echo "file $filename not found\n"; return false; } $postdata = array( 'method' => 'post', 'key' => $apikey, 'file' => '@'.$filename, //полный путь к файлу 'phrase' => $is_phrase, 'regsense' => $is_regsense, 'numeric' => $is_numeric, 'min_len' => $min_len, 'max_len' => $max_len, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://ac-service.info/in.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); $result = curl_exec($ch); if (curl_errno($ch)) { if ($is_verbose) echo "CURL returned error: ".curl_error($ch)."\n"; return false; } curl_close($ch); if (strpos($result, "ERROR")!==false) { if ($is_verbose) echo "server returned error: $result\n"; return false; } else { $ex = explode("|", $result); $captcha_id = $ex[1]; if ($is_verbose) echo "ID $captcha_id \n"; $waittime = 0; if ($is_verbose) echo "<br>sleep $rtimeout \n"; sleep($rtimeout); while(true) { $result = file_get_contents('http://ac-service.info/res.php?key='.$apikey.'&action=get&id='.$captcha_id); if (strpos($result, 'ERROR')!==false) { if ($is_verbose) echo "server returned error: $result\n"; return false; } if ($result=="CAPCHA_NOT_READY") { if ($is_verbose) echo "<br>captcha is not ready yet\n"; $waittime += $rtimeout; if ($waittime>$mtimeout) { if ($is_verbose) echo "<br>timelimit ($mtimeout) hit\n"; break; } if ($is_verbose) echo "<br>waiting for $rtimeout seconds\n"; sleep($rtimeout); } else { $ex = explode('|', $result); if (trim($ex[0])=='OK') return trim($ex[1]); echo '<br>'.$ex[1]; } } return false; } } ####################################### $captcha=recognize($_SERVER['DOCUMENT_ROOT'].'cap.jpg','e49c7453ae....ca85ec7661',true); $nocache = rand(1,9999999); echo '<br> <img src="cap.jpg?'.$nocache.'"><br> <form method="post" enctype="application/x-www-form-urlencoded" action="go.php"> <input type="text" name="txt" value="'.$captcha.'"> <input type="hidden" name="session" value="'.$session.'"> <input type="hidden" name="captcha" value="'.$captcha.'"> <input type="submit"> </form>'; exit; ?> Файл go.php PHP: <?php $operator = '38050'; $mobile = '1234567'; $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4'; $captcha = $_POST['captcha']; $session = $_POST['session']; $txt = $_POST['txt']; ### $ch = curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php'); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_REFERER, "http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat"); curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session.';'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); $res = curl_exec($ch); curl_close($ch); ?> Коменты к файлу mts.php: PHP: $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4'; $ch = curl_init('http://www.mts.com.ua/ukr/sendsms.php'); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_REFERER, 'http://www.mts.com.ua/ukr/sendsms.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); curl_close($ch); Данную часть кода думаю не стоит коментировать, обыкновенный cURL посредством которого мы заходим на страничку http://www.mts.com.ua/ukr/sendsms.php PHP: ### Func ### function get_session($var) { preg_match('#PHPSESSID=(.*);#',$var,$matches); $session = $matches[1]; return $session; } ############ $session = get_session($res); Функция получения PHPSESSID при помощи регулярного выражения: '#PHPSESSID=(.*);#' Данная сессия будет использована в процессе всего скрипта, важная чать(!). Далее как вы видите в свойстве капчи : мы имеем еще помимо PHPSESSID переменную rnd=1998968323, видимо какойто рандомчик, неважно, сейчас мы его отпарсим на всякий случай: PHP: if(preg_match('#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#',$res,$matches)) { $rnd = $matches[2]; $ch = curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd"); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session); curl_setopt($ch, CURLOPT_REFERER, 'http://www.mts.com.ua/ukr/sendsms.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); curl_close($ch); file_put_contents('cap.jpg',$res); } Как видите парсим при помощи регулярного выражения: И важно парсить страничку уже с нашей сессией которую мы получили при помощи функции get_session($var) : PHP: curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session); Теперь составляем URL к капче уже с внесенной сессией в ссылку и отпарсеной переменной rnd: PHP: $ch = curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd"); Результат (т.е. капчу) сохраняем в отдельный файл: PHP: $res = curl_exec($ch); curl_close($ch); file_put_contents('cap.jpg',$res); Теперь может открыть папку и увидеть саму капчу в файле cap.jpg Дальше идет функция от самого сервиса Антикапчи по получению текста с картинки, тут без коментариев: PHP: function recognize($filename, $apikey, $is_verbose = true, $rtimeout = 3, $mtimeout = 200, $is_phrase = 0, $is_regsense = 0, $is_numeric = 0, $min_len = 0, $max_len = 0) { if (!file_exists($filename)) { if ($is_verbose) echo "file $filename not found\n"; return false; } $postdata = array( 'method' => 'post', 'key' => $apikey, 'file' => '@'.$filename, //полный путь к файлу 'phrase' => $is_phrase, 'regsense' => $is_regsense, 'numeric' => $is_numeric, 'min_len' => $min_len, 'max_len' => $max_len, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://ac-service.info/in.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); $result = curl_exec($ch); if (curl_errno($ch)) { if ($is_verbose) echo "CURL returned error: ".curl_error($ch)."\n"; return false; } curl_close($ch); if (strpos($result, "ERROR")!==false) { if ($is_verbose) echo "server returned error: $result\n"; return false; } else { $ex = explode("|", $result); $captcha_id = $ex[1]; if ($is_verbose) echo "ID $captcha_id \n"; $waittime = 0; if ($is_verbose) echo "<br>sleep $rtimeout \n"; sleep($rtimeout); while(true) { $result = file_get_contents('http://ac-service.info/res.php?key='.$apikey.'&action=get&id='.$captcha_id); if (strpos($result, 'ERROR')!==false) { if ($is_verbose) echo "server returned error: $result\n"; return false; } if ($result=="CAPCHA_NOT_READY") { if ($is_verbose) echo "<br>captcha is not ready yet\n"; $waittime += $rtimeout; if ($waittime>$mtimeout) { if ($is_verbose) echo "<br>timelimit ($mtimeout) hit\n"; break; } if ($is_verbose) echo "<br>waiting for $rtimeout seconds\n"; sleep($rtimeout); } else { $ex = explode('|', $result); if (trim($ex[0])=='OK') return trim($ex[1]); echo '<br>'.$ex[1]; } } return false; } } Функция на офф сайте: http://ac-service.info/curl.txt Теперь вызываем саму функцию: PHP: $captcha=recognize($_SERVER['DOCUMENT_ROOT'].'cap.jpg','e49c74........661',true); У нас она принимает параметры - Полный путь к картинке, ключь пользователя Антикапчи, Коментарии(включить/выключить) Полное описание параметров принимаемых функцией читайте тут - http://ac-service.info/curl.txt или же ниже =) Дальше выводим саму капчу: PHP: $nocache = rand(1,9999999); echo '<br> <img src="cap.jpg?'.$nocache.'"><br> Переменная $nocache генерирует случайное число в дипозоне, для того чтоб мы добавили его в путь картинки, ето предотвратит кэширование изображения выводимого в браузер. Теперь при просмотре капчи в браузере ссылка будет примерно такого вида: Финальная часть етого файла - это вывод формы отправки СМС: PHP: <form method="post" enctype="application/x-www-form-urlencoded" action="go.php"> <input type="text" name="txt" value="'.$captcha.'"> <input type="hidden" name="session" value="'.$session.'"> <input type="hidden" name="captcha" value="'.$captcha.'"> <input type="submit"> </form>'; exit; ?> В поле ввода сообщения будет введет код капчи, тоесть скрипт будет слать на указаный номер код капчи которую он сам распознает при помощи сервиса Антикапча. Коменты к файлу go.php: PHP: $operator = '38050'; $mobile = '1234567'; $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4'; $captcha = $_POST['captcha']; $session = $_POST['session']; $txt = $_POST['txt']; Коментарии излишни, единственное ето две перменные: Забыл добавить что данный файл ето обработчик формы предыдущего файла. Следующая часть кода ето отправка Пост пакета с заполненой формой - оператор, мобильный номер, текст, капча: PHP: $ch = curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php'); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_REFERER, "http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat"); curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session.';'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); $res = curl_exec($ch); curl_close($ch); Скрипт принимающий заполненую форму: PHP: $ch = curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php'); Как видите специфический Реферер, с параметрами: PHP: curl_setopt($ch, CURLOPT_REFERER, "http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat"); Сессия, полученая с предыдущего файла в HIDDEN поле: PHP: curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session.';'); А вот и скрытые поля из формы: PHP: <input type="hidden" name="session" value="'.$session.'"> <input type="hidden" name="captcha" value="'.$captcha.'"> В них как видите передается распознаный текст капчи и сессия. Далее сам POST пакет: PHP: curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha"); Вот и все. Надеюсь кому-то поможет в начинаниях при работе с капчей.
регулярку Code: '#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#' можна немного оптимизировать Code: '#PHPSESSID=([a-f0-9]+)&rnd=(\d+)#' з.ы.: АК на перле от Каими: http://kaimi.ru/2009/05/anticaptcha-perl/
Можно было много чего оптимизировать, но т.к. с расчетом на новичка нестал заморачиваться, а так можно было все сделать на функциях, классе.
Писал спаммер\флудер давно, тоже через mts.com.ua ток на перле З.Ы. Там ограничений вроде нет, пару сотен смс отправил с одного ИП, вроде норм все
Нет =) Он передается в куках, смотри полностью листинг файла go.php PHP: curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session.';');
В общем моя ошибка в том, что я попутал твою форму с формою МТС. Только что искал в исходном коде МТС формы hidden поле session, но потом понял, что речь идет о твоем файле mts.php. Сразу же разобрался с вопросом о PHPSESSID. Спасибо в общем, статья норм, а в своей ошибке я разобрался.
Ну на самом сайте ас есть примеры работы python - http://anti-captcha.com/om_anti_cap.py php с curl - http://anti-captcha.com/curl.txt php без curl - http://anti-captcha.com/phpnocurl.txt шарпень - http://anti-captcha.com/cnet.txt плюсы - http://anti-captcha.com/cplus.cpp ps. где то был скрипт на питоне для автоматического получения уинов с http://www.free-uin.org/ с применнием ас.
Работа с Капчей и Антикапчей на примере mts.com.ua Чевото у меня не получилось при проверки смс не приходили наверно мтс уже поменял и скрипт не работает
Люди отпишитесь у кого работает я на двух хостингах пробывал капчу выдаёт а при на жатие на отправить па подаешь на пустой файл go.php разумется с писаным мобильным номерам как указана в скрипте пробовал по всякому на 2хостингах но смс не приходят отпишитесь работает скрипт в наше время или нет??? можно ко мне на почту [email protected]