Распознавание капч с помощью сервиса ruCaptcha.com в Human Emulator.
ruCaptcha — это сервис для автоматического распознавания изображений. Сервис позволяет решать капчу, а также конвертировать в текст любые изображения, которые может распознать человек. API сервиса позволяет быстро и легко автоматизировать выполнение этих задач.
Процесс распознавания капчи.
- Отправляем изображение на сервер сервиса.
- Сервер возвращает уникальный идентификатор задачи (Captcha ID).
- Запускаем цикл, который проверяет, решена ли капча.
- В итоге мы получаем или текст капчи или данные для подстановки в исходники страницы, или ошибку от сервиса.
Работа с API ruCaptcha в программе максимально упрощена. Для этого в Human Emulator были добавлены объект rucaptcha — для работы с https://rucaptcha.com и объект twocaptcha для работы с английской версией сервиса https://2captcha.com/. Оба объекта имеют одинаковый функционал и примеры с использованием rucaptcha будут актуальны и для twocaptcha и наоборот.
Пройдёмся по основным функциям для работы с сервисом.
Распознавание обычных капч.
Для распознавания простых капч с искажённым текстом используется функция recognize.
В результате работы функция возвращает строку с решением капчи, которую мы подставляем далее в поле для ввода на сайте.
с помощью параметров функции можно выставить любой тип подобной капчи, текст или цифры, язык, количество символов в капче и т.д.
Параметры:
filename – путь к файлу с капчей
apikey – ключ для идентификации на сервисе
path – путь к сервису
is_verbose — включить/выключить verbose mode (комментирование происходящего): false(выключить), true(включить)
rtimeout — задержка между опросами статуса капчи
mtimeout — время ожидания ввода капчи
is_phrase — 0 либо 1 — флаг «в капче 2 и более слов»
is_regsense — 0 либо 1 — флаг «регистр букв в капче имеет значение»
is_numeric — 0 либо 1 — флаг «капча состоит только из цифр»
min_len — 0 (без ограничений), любая другая цифра указывает минимальную длину текста капчи
max_len — 0 (без ограничений), любая другая цифра указывает максимальную длину текста капчи
is_russian — 0 либо 1 — флаг «капча должна демонстрироваться только русскоязычным работникам»
Пример использования на php:
1 2 3 4 5 6 7 8 9 10 11 |
// API ключ $rucaptcha->api_key="cdbecaf74aaf1aadafbd97189886ab92"; // 1 echo "1. Перейдем на полигон : "; echo $browser->navigate("http://www.humanemulator.net/poligon/image.html")."<br>"; // 2 echo "2. Распознать каптчу используя сервис rucaptcha.com (как цифры) : "; echo $image->screenshot_by_src("tmp/1.jpg","images/captcha",false)." "; echo $rucaptcha->recognize($debug->get_cur_script_folder()."tmp\\1.jpg",$rucaptcha->api_key,"http://www.rucaptcha.com",true,5,120,0,0,1)."\n"; |
В результате работы примера в панели отладки Human Emulator появится текст распознанной капчи.
Распознавание текстовых капч.
Текстовая капча это когда надо ответить на какой то вопрос. Например: круглый ли шар (да/нет)?
Для распознавания таких капч используем функцию recognize_text
В качестве параметра передаём текст на который надо ответить.
В результате получаем правильный ответ, который нужно будет либо ввести в поле ввода, либо выбрать из списка.
Пример использования функции на php:
1 2 3 4 |
// API ключ $rucaptcha->api_key="cdbecaf74aaf1aadafbd97189886ab92"; // распознать текст echo $rucaptcha->recognize_text("круглый ли шар (да/нет)?")."<br>"; |
В результате работы примера в панели отладки Human Emulator появится текст с правильным ответом.
Распознавание ReCaptcha V2 и Invisible ReCaptcha V2.
Очень популярная капча от Google. Отличие Invisible ReCaptcha V2 от обычной ReCaptcha V2, в том что невидимая капча появляется только после какого то действия, скажем нажатия на кнопку или поле, а ReCaptcha V2 видна на странице сразу и выглядит вот так:
Есть два вариант решения этих капч. Первый получение токена и подстановка этого токена в поле на сайте, и кликанье по заданным картинкам. Рассмотрим оба варианта.
1.Распознавание через получение токена.
Для этого используется функция recognize_recaptcha_v2. В качестве параметров эта функция принимает:
pageurl — полный URL страницы, на которой вы хотите решить ReCaptcha
googlekey — так называем ключ сайта sitekey. Для каждого сайта он свой, и его можно найти в исходном тексте капчи:
invisible — тип капчи. По умолчанию: 0 . 1 — говорит нам, что на сайте невидимая ReCaptcha.
proxy — прокси. При аутенификации по IP: IP_адрес:ПОРТ. Пример: proxy=123.123.123.123:3128. При аутенификации по логину и паролю: логин:пароль@IP_адрес:ПОРТ. Пример: proxy=proxyuser:strongPassword@123.123.123.123:3128
proxytype — тип вашего прокси: HTTP, HTTPS, SOCKS4, SOCKS5. Пример: proxytype=SOCKS4
Для работы без прокси параметры proxy и proxytype не задаются.
После отправки этих параметров на сервер rucaptcha, в ответ приходит токен это текст вот такого вида:
1 2 |
03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB-50GQHPEBJUHNnhJyDzwRoRAkVzrf7UkV8wKCdTwrrWqiYDgbrzURfHc2ESsp020MicJTasSiXmNRgryt-gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3-egcplD1uLGh79wC34RF49Ui3eHwua4S9XHpH6YBe7gXzz6_mv-o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q |
Как правило токен мы подставляем в поле с id «g-recaptcha-response«, но это зависит от сайта, могут быть варианты с другими полями или вызовом так называемых Callback функций.
Смотрите подробное описание нюансов распознавания ReCaptcha V2 на rucaptcha.com
Пример использования функции для обоих вариантов ReCaptcha V2 на php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// API ключ $rucaptcha->api_key="cdbecaf74aaf1aadafbd97189886ab92"; // Пример : ReCaptcha V2 echo "1. Перейдем на полигон ReCaptcha V2: "; echo $browser->navigate("https://www.google.com/recaptcha/api2/demo")."<br>"; sleep(1); echo "2. Получение токена от сервиса распознавания: "; echo $result = $rucaptcha->recognize_recaptcha_v2($webpage->get_url(),"6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"); echo "<br>"; echo "3. Используем полученный токен для обхода капчи: "; // установим токен в скрытое поле g-recaptcha-response $textarea->set_value_by_name("g-recaptcha-response", $result); // нажимаем на кнопку Submit $button->click_by_id("recaptcha-demo-submit"); echo "<br>"; // пауза 5 сек sleep(5); // Пример: Invisible ReCaptcha V2 echo "1. Перейдем на полигон Invisible ReCaptcha V2: "; echo $browser->navigate("https://www.google.com/recaptcha/api2/demo?invisible=true")."<br>"; sleep(1); echo "2. Получить текущий урл страницы для отправки на сервер: "; echo $url_loc = $webpage->get_url()."<br>"; echo "<br>"; echo "3. Получение токена от сервиса распознавания: "; echo $result = $rucaptcha->recognize_recaptcha_v2($webpage->get_url(),"6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs",1); echo "<br>"; echo "3. Используем полученный токен для обхода капчи: "; // установим токен в скрытое поле g-recaptcha-response $textarea->set_inner_html_by_name("g-recaptcha-response", $result); // вызов коллбек-функции $browser->run_java_script('onSuccess();'); // нажимаем на кнопку Submit $btn->click_by_id("recaptcha-demo-submit"); |
В результате правильного распознавания капч в программе будет открываться страница с текстом «Verification Success… Hooray!«.
2. Кликанье по картинкам для распознавания ReCaptcha V2.
Для решения ReCaptcha V2 этим методом используется функция recognize_click_captcha
Функция принимает следующие параметры:
filename – путь к картинке капчи
textinstructions – Текст того, что нужно выбрать на картинке в кодировке UTF-8. Данный параметр не обязателен, если по картинке понятно куда нужно кликнуть — можно не присылать.
Пример работы распознавания ReCaptcha V2 с помощью кликов по картинкам на php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
// API ключ $rucaptcha->api_key="cdbecaf74aaf1aadafbd97189886ab92"; // 1 echo "1. Перейдем на полигон : "; echo $browser->navigate("https://www.google.com/recaptcha/api2/demo")."<br>"; // 2 echo("2. Нажмем я не робот : "); while (!$div->get_by_attribute("class","recaptcha-checkbox-checkmark",false,0)->is_visibled())sleep(1); echo $check=$div->get_by_attribute("class","recaptcha-checkbox-checkmark",false,0)->send_mouse_click(mt_rand(1,4),mt_rand(1,4))."\n"; // 3 echo "3. Сохраним картинку и вопрос :"; while (!$image->get_by_src("www.google.com/recaptcha/api2/payload",false,1)->is_visibled())sleep(1); sleep(3); echo $image->screenshot_by_src("test\\tmp.jpeg","www.google.com/recaptcha/api2/payload",false,1)." "; // сохраним текст echo $describtion=explode("\n",$div->get_inner_text_by_attribute("class","imageselect-desc",false,1))[0]; // 4 // преобразуемв UTF для отправки в сервис рукапчи $describtion=iconv("windows-1251","utf-8",$describtion); // распознаем капчу - как ту где нужно сделать клики $solution=$rucaptcha->recognize_click_captcha("test\\tmp.jpeg",$describtion); // 5 echo "5. Кликнем по полученным координатам : \n\n"; if (strpos($solution,"coordinates:")!=-1) { $solution=str_replace("coordinates:","",$solution); $solution=str_replace(";",",",$solution); $coords=explode(",",$solution); $image->get_by_src("test\\tmp.jpeg","www.google.com/recaptcha/api2/payload",false,1)->focus(); for ($i=0;$i<count($coords);$i+=2) { $x=str_replace("x=","",$coords[$i]) ; $y=str_replace("y=","",$coords[$i+1]); echo "click at (".$x." ".$y.") : на картинке капчи : "; echo $image->get_by_src("recaptcha/api2/payload",false,1)->send_mouse_move($x,$y)." "; usleep(50000); echo $image->get_by_src("recaptcha/api2/payload",false,1)->send_mouse_click($x,$y)."\n"; usleep(mt_rand(300000,1000000)); } echo "\n"; } $btn->click_by_id("recaptcha-verify-button", "1"); |
В результаты работы примера программа кликает по нужным картинкам. В случае повторения картинки, требуется отправить новый вариант и т.д.
Как видно из примеров решение ReCaptcha V2 через токен намного проще, чем вариант клика по картинкам, но в любом случае оба эти варианта рабочие. Второй способ к тому же подходит для любых типов капч, где надо кликать по картинкам.
Распознавание GeeTest капчи.
В GeeTest капчах, требуется выбрать несколько объектов или передвинуть кусок пазла в нужном порядке.
Для распознвания это типа капч в Human Emulator используется функция recognize_geetest.
Для корректного распознавания требуется передать следующие параметры:
pageurl — полный URL страницы, на которой вы хотите решить ReCaptcha
gt — публичный ключ сайта (статический)
challenge — динамический ключ задания
api_server — домен API (обязателен для некоторых сайтов)
proxy — прокси. При аутенификации по IP: IP_адрес:ПОРТ. Пример: proxy=123.123.123.123:3128. При аутенификации по логину и паролю: логин:пароль@IP_адрес:ПОРТ. Пример: proxy=proxyuser:strongPassword@123.123.123.123:3128
proxytype — тип вашего прокси: HTTP, HTTPS, SOCKS4, SOCKS5. Пример: proxytype=SOCKS4
Для работы без прокси параметры proxy и proxytype не задаются.
Параметры gt, challenge, api_server определяются различными способами на странице, где используется GeeTest капча. При этом параметр challenge меняется каждый раз при переходе на эту страницу.
В результате работы функции приходит ответ с тремя параметрами в виде JSON строки:
1 2 3 |
"challenge":"1a2b3456cd67890e12345fab678901c2de", "validate":"09fe8d7c6ba54f32e1dcb0a9fedc8765", "seccode":"12fe3d4c56789ba01f2e345d6789c012|jordan" |
Для решения капчи необходимо подставить значения в соответствующие поля geetest_challenge, geetest_validate, geetest_seccode и кликнуть на кнопку с текстом «Click to verify».
Пример распознавания GeeTest капчи в программе Human Emulator на php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
// API ключ $rucaptcha->api_key="cdbecaf74aaf1aadafbd97189886ab92"; // 1 echo "1. Перейдем на полигон для тестирования geetest капчи: "; echo $browser->navigate("https://www.geetest.com/en")."<br>"; // перейдём на пример капчи $anchor->click_by_inner_text("Demo"); sleep(1); $li->set_focus_by_number(10); // 2 echo "2. Распознать geetest капчу используя сервис rucaptcha.com : <br>"; // данные для отправки на сайт $api_server="api.geetest.com"; $date = new DateTime(); echo $t=$date->getTimestamp(); echo "<br>"; // получить gt и challenge для отправки на сервис echo $res = file_get_contents("https://www.geetest.com/demo/gt/register-enFullpage-official?t=$t"); echo "<br>"; // разбеёрм полученные данные из ответа $gt = get_string($res, '"gt":"', '",'); $challenge = get_string($res, '"challenge":"', '",'); echo "gt=$gt<br>challenge=$challenge<br>"; echo "<br>"; // отправляем запрос на сервис $result = $rucaptcha->recognize_geetest("https://www.geetest.com/en", $gt, $challenge, $api_server); // разбираем ответ от сервиса $geetest_challenge=get_string($result, 'geetest_challenge":"', '",'); $geetest_validate=get_string($result, 'geetest_validate":"', '",'); $geetest_seccode=get_string($result, 'geetest_seccode":"', '",'); // полученный результат вводим в поля $hiddeninput->set_value_by_name("geetest_challenge", $geetest_challenge); $hiddeninput->set_value_by_name("geetest_validate", $geetest_validate); $hiddeninput->set_value_by_name("geetest_seccode", $geetest_seccode); // нажимем на кнопку Click to verify $span->click_by_inner_text("Click to verify"); // конец echo "<hr><br>"; // разобрать строку по префиксам function get_string($str1, $pr1, $pr2, &$ind_st = 0) { //получаем стартовый индекс $ind1 = strpos($str1, $pr1, $ind_st); if($ind1 === false) { return ""; } $ind1_1 = $ind1 + strlen($pr1); //получаем финишный индекс $ind2 = strpos($str1, $pr2, $ind1_1); if ($ind2 === false) { return ""; } // получим результат $sres = substr($str1, $ind1 + strlen($pr1), $ind2 - $ind1_1); return trim($sres); } |
В результате работы примера появится зелёная галочка на кнопке «Click to verify«.
Мы рассмотрели наиболее часто используемые типы капч. Все типы капч, которые можно распознавать с помощью сервиса https://rucaptcha.com, а также тарифы можно узнать на сайте сервиса.
Если вам нужно добавить распознавание какого то типа капч, которого нет в программе напишите нам на форуме.
Обсудить статью, а также посмотреть примеры на других языках можно там же на форуме.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.