Google recaptcha 2

Гугл рекапча (reCaptcha v2) перестала быть проблемой для наших пользователей. Мы внедрили интеграцию с популярным сервисов по обходу капчи Death By Captcha и теперь ваши скраперы могут легко обходить самые современные капчи.

Давайте посмотрим, как выглядит reCaptcha v2:

Обходим капчу: определяем reCaptcha v2

Если вы видите именно такую капчу на сайте. который вам нужно отпарсить, то эта статья вам обязательно поможет. Мы постараемя дать вам исчерпывающее руководство на реальном примере, так, чтобы вы смогли легко внедрить подобное решение для вашего сайта. Мы же будем парсить следующий сайт: http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao2.asp.

Для того, чтобы пользовать этим функционалом вам нужно иметь собственный аккаунт в службе Death by Captcha. Их услуги не бесплатны, стоимость решения 100 капч составляет примерно 2.89$ (цена актуальна на 28.02.2018).


Решение капчи происходит автоматически, вам нужно лишь загрузить страницу с капчей в ваш скрапер и вызвать специальную команду captcha_resolve с определенными параметрами:

prodiver: провайдер решений для капчи, нужно установить значение deathbycaptcha.com
type: тип капчи, нужно установить значение nocaptchav2
username: имя пользователя вашего аккаунта в системе death by captcha
password: пароль вашего аккаунта в системе death by captcha

ВНИМАНИЕ!!! Для того чтобы капча этого типа была успешно решена, люди, которые будут вручную решать вашу капчу должны будут это делать под тем же IP адресом, что использует ваш парсер. Поэтому, единственный вариант этого достичь — использовать ВАШ СОБСТВЕННЫЙ ПРОКСИ СЕРВЕР в конфигурации вашего диггера. Наши штатные прокси сервера не могут быть доступны с IP адресов, вне нашей основной сети, поэтому штатные прокси просто не будут работать в этом случае. В дальнейшем мы внедрим специальный пул прокси серверов для этой задачи, но пока вы должны будете использовать свой прокси.

Базовый код нашего парсера будет таким:

--- config:  debug: 2  agent: Firefo.    
password: ВАШ ПАРОЛЬ В СЛУЖБЕ DBC

Пока не запускайте ваш парсер, просто изучите код. Если капча решена успешно, токен будет сохранен в переменной captcha. Поэтому, первым делом после решения капчи мы должны проверить наличие токена в переменной. Если токен есть, мы отключим опцию repeat и передадим токен на сервер вместе с другими параметрами нашего запроса. Если токена нет, запрос будет повторен, поскольку опция repeat установлена в «yes».

--- config:  debug: 2  agent: Firefox  proxy: ВАШ ПРОКСИ НУЖНО ВСТАВИТЬ СЮДА do: # Мы будем повторять неудавшийся запрос, поэтому пропишем значение переменной, # которую будет использовать опция repeat - variable_set:  field: repeat  value: "yes" # Загружаем страницу с капчей - walk:  to: http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/cnpjreva_solicitacao2.asp  repeat: <%repeat%>  do:  # Решаем капчу  - captcha_resolve:  provider: deathbycaptcha.com  type: nocaptchav2  username: ВАШЕ ИМЯ ПОЛЬЗОВАТЕЛЯ В СЛУЖБЕ DBC  password: ВАШ ПАРОЛЬ В СЛУЖБЕ DBC  # Переходим в блок body  - find:  path: body  do:  # Читаем значение переменной captcha в регистр  - variable_get: captcha  # Проверяем, не пустой ли у нас регистр  - if:  match: w+  do:  # Если не пустой, отключаем repeat  - variable_set:  field: repeat  value: "no"  # Передаем токен и другие параметры на сайт с которого мы собираем информацию.    
В данном случае мы пытаемся получить данные о компании по его ИНН (CNPJ) - walk: to: post: http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/valida_recaptcha.asp data: origem: comprovante cnpj: 05754558000186 g-recaptcha-response: <%captcha%> submit1: Consultar search_type: cnpj do: - find: path: 'div#principal' do: - object_new: item - find: path: td:haschild(font:contains('NÚMERO DE INSCRIÇÃO')) b slice: 0 do: - parse - space_dedupe - trim - object_field_set: object: item field: registration_number - find: path: td:haschild(font:contains('DATA DE ABERTURA')) b slice: 0 do: - parse - space_dedupe - trim - object_field_set: object: item field: registration_date - find: path: td:haschild(font:contains('NOME EMPRESARIAL')) b slice: 0 do: - parse - space_dedupe - trim - object_field_set: object: item field: company_name - find: path: td:haschild(font:contains('CÓDIGO E DESCRIÇÃO DA ATIVIDADE ECONÔMICA PRINCIPAL')) b slice: 0 do: .
:haschild(font:contains('LOGRADOURO')) b slice: 0 do: - parse - space_dedupe - trim - object_field_set: object: item field: street - find: path: td:haschild(font:contains('BAIRRO/DISTRITO')) b slice: 0 do: - parse - space_dedupe - trim - object_field_set: object: item field: district - find: path: td:haschild(font:contains('MUNICÍPIO')) b slice: 0 do: - parse - space_dedupe - trim - object_field_set: object: item field: municipal - find: path: td:haschild(font:contains('TELEFONE')) b slice: 0 do: - parse - space_dedupe - trim - object_field_set: object: item field: phone - find: path: td:haschild(font:contains('E-MAIL')) b slice: 0 do: - parse - space_dedupe - trim - object_field_set: object: item field: email - object_save: name: item

Если вы запустите этот парсер вы получите следующий датасет

[{  "item": {  "company_name": "LIST - LOGISTICA INTEGRADA, SERVICOS E TRANSPORTES LTDA",  "d.    
o especificados anteriormente, sem operador", "77.19-5-99 - Locação de outros meios de transporte não especificados anteriormente, sem condutor", "52.29-0-99 - Outras atividades auxiliares dos transportes terrestres não especificadas anteriormente", "49.30-2-01 - Transporte rodoviário de carga, exceto produtos perigosos e mudanças, municipal", "52.50-8-03 - Agenciamento de cargas, exceto para o transporte marítimo" ], "street": "R PROFESSORA RAYMUNDA MAGALHAES" } }]

Подобные решения часто используются в сценариях типа «Данные по требованию». Когда пользователь на вашем сайте вводит номер, ваш сайт принимает ввод от пользователя и делает запрос на API платформы Diggernaut. Этот запрос запускает диггер с переданным параметром и возвращает собранные данные обратно на ваш сервер в режиме реального времени. А ваш сервер показывает их вашему пользователю. Однако примите во внимание, что процесс решения капчи может занимать продолжительное время, например решение reCaptcha v2 может занимать более 1 минуты. Это нужно учитывать при проектировании вашего приложения.


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

www.diggernaut.ru

// ==================== Все что нужно настроить ======================================== bool extendAlerts = true; // true - выводить сообщения в лог ZennoPoster string alertTitleLog = "Google ReCaptcha:"; // Заголовок перед сообщением в логе string captchaModule = "RuCaptcha.dll"; // Можно RuCaptcha.dll или MonkeyEnter.dll int checkElementTimeout = 10; // Время, в течении которого ищем элементы на странице int captchaLoadTimeout = 5; // Время ожидания загрузки формы с картинками int checkCaptchaCount = 3; // Количество попыток разгадывания // =====================================================================================  // ========== Цикл по количеству попыток разгадывания капчи ========== for (int i = 0; i < checkCaptchaCount; i++) {  project.SendInfoToLog("Разгадываем капчу. Попытка " + Convert.ToString(i + 1) + "/" + checkCaptchaCount, alertTitleLog, extendAlerts);    // ========== Цикл по в.    
k; } if (j == checkElementTimeout * 2 - 1) { project.SendWarningToLog("Время поиска элемента истекло. Не найден элемент <recaptcha-checkbox>", alertTitleLog, extendAlerts); throw new Exception(); } } // ========== Проверяем нужные элементы после клика ========== string reCaptcha_isChecked = string.Empty; // Состояние чекбокса. false - значит нужно разгадывать картинки HtmlElement imgForm = null; //HtmlElement imgText = null; string imgText = string.Empty; bool oldRecaptcha = false; for (int j = 0; j < checkElementTimeout * 2; j++) { System.Threading.Thread.Sleep(500); // ========== Получаем состояние чекбокса ========== HtmlElement reCaptcha_checked = instance.ActiveTab.FindElementByAttribute("span", "id", "recaptcha-anchor", "regexp", 0); if (!reCaptcha_checked.IsNull && !reCaptcha_checked.IsVoid) { reCaptcha_isChecked = reCaptcha_checked.GetAttribute("aria-checked"); if (reCaptcha.
gt; 0) { if (captchaModule == "RuCaptcha.dll" && imgs.Count == 16) { imgForm = instance.ActiveTab.FindElementByAttribute("div", "class", "rc-imageselect-challenge", "regexp", 0); var heText = instance.ActiveTab.FindElementByAttribute("div", "class", "rc-imageselect-desc", "regexp", 0); imgText = Regex.Replace(heText.GetAttribute("innerhtml"), "<[^>]+>", string.Empty); if (imgText == "") { heText = instance.ActiveTab.FindElementByAttribute("div", "class", "rc-imageselect-desc-no-canonical", "regexp", 0); imgText = Regex.Replace(heText.GetAttribute("innerhtml"), "<[^>]+>", string.Empty); } } else { oldRecaptcha = true; imgForm = instance.ActiveTab.FindElementByAttribute("div", "class", "rc-imageselect-payload", "regexp", 0); } .
sVoid) { project.SendInfoToLog("Не найдена форма с картинками. Скорее всего вылезла старая капча.", alertTitleLog, extendAlerts); break; } // Снимаем отметки с картинок var imgs = instance.ActiveTab.FindElementsByAttribute("div", "class", "rc-imageselect-checkbox", "regexp"); if (!imgs.IsVoid) { for (int k = 0; k < imgs.Count; k++) { string width = imgs.GetByNumber(k).GetAttribute("width"); if (width != "" && width != "0") imgs.GetByNumber(k).Click(); } } // Скриним форму с картинками и конвертируем в jpg string attribute = imgForm.DrawToBitmap(false); MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(attribute)); Image bmp = new Bitmap(ms); var msJpeg = new System.IO.MemoryStream(); string jpeg = string.Empty; if (captchaModule == "MonkeyEnter.dll" || oldRecaptcha) { bmp.Save(msJpeg, System.Drawing.Imaging.ImageFormat.Jpeg); } else { .
| oldRecaptcha) answer = ZennoPoster.CaptchaRecognition(captchaModule, jpeg, "id_constructor=23"); else answer = ZennoPoster.CaptchaRecognition(captchaModule, jpeg, "textinstruction=" + imgText + "&recaptcha=1"); // Приводим результат распознавания к нужному виду if (captchaModule == "RuCaptcha.dll") { // Разделяем ответ от RuCaptcha и складыванем в переменные var split = answer.Split(new [] { "-|-" }, StringSplitOptions.RemoveEmptyEntries); if (split.Length == 2) { recognition_Result = split[0]; recognition_WrongCaptcha = split[1]; } else { project.SendInfoToLog("Error: не удалось разгадать капчу", alertTitleLog, extendAlerts); continue; } // Проверяем ответ sorry if (recognition_Result == "sorry") { project.SendInfoToLog("Капча не распознана. RuCaptcha: sorry", alertTitleLog, extendAlerts); continue; } // Обрезаем начало ответа, оставляем только номера картинок, разделенные / recognition_Result = Regex.Match(recognition_Result, @"(?<=click:).*").Value; } else recognition_Result = answer; // Отображаем скрывшуюся капчу var e = instance.ActiveTab.FindElementByAttribute("div", "outerhtml", "z-index: 20000000", "regexp", 0); e.SetAttribute("style", "display: block; visibility: visible; position: absolute; width: 414px; left: 0px; top: 0px; height: 600px; z-index: 2000000000;"); // ===== Кликаем ===== do { // Выдераем номера картинок и кликаем по ним // Проверяем тип ответа string img_split = Regex.Match(recognition_Result, @"/").Value; if (img_split != "") { if (Regex.Match(recognition_Result, @"/$").Value == "") recognition_Result += "/"; img_split = Regex.Match(recognition_Result, @"^d{1,2}(?=/)").Value; if (img_split == "") img_split = Regex.Match(recognition_Result, @"^d{1,2}").Value; if (img_split == "") recognition_Result = Regex.Match(recognition_Result, @"(?<=^/).*").Value; // обрезаем разделитель / в начале строки else { recognition_Result = Regex.Match(recognition_Result, @"(?<=^d{1,2}/).*").Value; // обрезаем число и разделитель / в начале строки } } else { img_split = Regex.Match(recognition_Result, @"^d{1}").Value; recognition_Result = Regex.Match(recognition_Result, @"(?<=^d{1}).+").Value; } // Получаем картинку и кликаем string width = "0"; HtmlElement img = instance.ActiveTab.FindElementByAttribute("img", "class", "rc-image-tile-4", "regexp", Convert.ToInt32(img_split) - 1); if (img.IsVoid) { img = instance.ActiveTab.FindElementByAttribute("div", "class", "rc-image-tile-target", "regexp", Convert.ToInt32(img_split) - 1); if (img.IsVoid) img = instance.ActiveTab.FindElementByAttribute("div", "class", "rc-image-tile-wrapper", "regexp", Convert.ToInt32(img_split) - 1); } img.Click(); System.Threading.Thread.Sleep(500); } while (recognition_Result != ""); // ========= Подтверждаем ========= var verify_button = instance.ActiveTab.FindElementByAttribute("div", "id", "recaptcha-verify-button", "regexp", 0); if (!verify_button.IsVoid && !verify_button.IsNull) { verify_button.Click(); } // ========== Проверяем разгадали ли ========== string captchaError = string.Empty; // Тип ошибки reCaptcha_isChecked = string.Empty; // Состояние чекбокса. false - значит нужно разгадывать картинки for (int j = 0; j < 10; j++) { System.Threading.Thread.Sleep(500); // Получаем состояние чекбокса HtmlElement reCaptcha_checked = instance.ActiveTab.FindElementByAttribute("span", "id", "recaptcha-anchor", "regexp", 0); if (!reCaptcha_checked.IsNull && !reCaptcha_checked.IsVoid) { reCaptcha_isChecked = reCaptcha_checked.GetAttribute("aria-checked"); if (reCaptcha_isChecked == "true") break; } string textDom = instance.ActiveTab.DomText; // Получаем ошибку captchaError = Regex.Match(textDom, @"(?<=<div class=""rc-imageselect-error-select-one"" style="").*?(?="">)").Value; if (captchaError == "") { captchaError = "1"; break; } captchaError = Regex.Match(textDom, @"(?<=<div class=""rc-imageselect-error-select-more"" style="").*?(?="">)").Value; if (captchaError == "") { captchaError = "2"; break; } captchaError = Regex.Match(textDom, @"(?<=<div class=""rc-imageselect-incorrect-response"" style="").*?(?="">)").Value; if (captchaError == "") { captchaError = "3"; break; } } // ========= Отправляем ошибки на RuCaptcha ========= if (reCaptcha_isChecked == "false") { if (captchaModule == "RuCaptcha.dll") ZennoPoster.HttpGet(recognition_WrongCaptcha, "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 30000, "", "", true, 5, AdditionalHeaders: new [] {"Referer: "+ ""}); if (captchaError == "1") project.SendInfoToLog("Капча разгадана не верно! Нужно указать еще одно изображение.", alertTitleLog, extendAlerts); if (captchaError == "2") project.SendInfoToLog("Капча разгадана не верно! Нужно указать больше изображений.", alertTitleLog, extendAlerts); if (captchaError == "3") project.SendInfoToLog("Капча разгадана не верно! Нужно попытаться еще.", alertTitleLog, extendAlerts); continue; } } // ========= Все ОК ========= project.SendInfoToLog("Капча успешно разгадана!", alertTitleLog, extendAlerts); return "ok"; } // Количество попыток разгадывания превышено, завершаем экшен по неудаче throw new Exception();

zennolab.com

Step 1: Get Google reCaptcha API keys

You can’t use the reCaptcha on your website without special API keys. To get them go to the official Google Recaptcha website.

Now, register your website.

Google reCapatcha register your website

Once you have registered your website; it’s time to get your site key which is used to display the reCaptcha widget on your web page.

Google Recaptca Site Key

Also don’t forget to get your secret key because your site will use it for communicating with the reCaptcha server.

Google Recaptcha Secret Key

Step 2: Add the Google reCaptcha to your site

Open your website or the page where you want to use the reCaptcha with any text editor (Notepad++ is a good choice). Find your </head> closing tag and insert the following highlighted code:

  <head>   <!-- Here you can find many other tags. Leave them. -->   <script src='https://www.google.com/recaptcha/api.js'></script>  </head>  

Find the form where you would like to place your captcha, and insert the highlighted code:

  <form method="post">   <input type="text" name="username" />   <input type="password" name="password" />   <!-- You can have another form structure. It is just an example! -->   <div class="g-recaptcha" data-sitekey="PLACE YOUR SITE KEY HERE"></div>   <!-- A good idea to place Captcha before the submit button -->   <input type="submit">  </form>    

Done! But… Wait! We forgot to update the PHP file that proceeds all data from the form! Have a look on the code snippet below, and try to integrate it into your existing code.

  $secret_key = '6Lc6YjwUAAAAAKzgGGHAuJAb_thg9ipF2bc2ZiQr'; // Your Google reCaptcha secret key    if(!empty($_POST['g-recaptcha-response']))  {   // Request the Google server to validate our captcha   $request = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret_key.'&response='.$_POST['g-recaptcha-response']);   // The result is in a JSON format. Decoding..   $response = json_decode($request);     if($response->success)   {   // Here goes your code.   echo 'Congratulations! You have passed the reCaptcha!';   }   else   {   echo 'Please, try again. You must complete the Captcha!';   }  }  

Done.

webdew.tech

Всем доброго дня. Как только появилось свободное время я все таки решил написать статью посвященную установке Google reCaptcha.

Получение recaptcha ключей

Для начала работы с нашей гуглокапчей нам необходимо получить 2 специальных ключа.

Первый ключ используется для отображения виджета на вашем сайте.

Второй ключ(секретный) используется для аутентификации виджета капчи на вашем сайте, и серверами google для проверки результата отправленного людьми, или ботами.

Чтобы получить эти ключи у вас должна быть учетная запись гугл. Если таковая есть то переходите по данной ссылке и авторизуйтесь.

После авторизации вы увидите панель reCAPTCHA и форму регистрации вашего сайта.

Google recaptcha 2

 

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

capcha

 

Установка reCapcha на форму

Для примера я создал простую форму авторизации. Она будет отправлять данные POST запросом на сервер.

Следующим шагом после создания формы необходимо подключить скрипт капчи в секцию head вашего сайта, а также добавить блок с капчей в то место формы где она вам нужна. Весь необходимый код приведён на странице с ключами и всей дополнительной информацией.

В конечном итоге у вас должна получится следующая структура формы:

<script src='https://www.google.com/recaptcha/api.js'></script> <!--Скрипт располагать в блоке head--> <form action="/form.php" method="post">  <input type="text" name="login">  <input type="password" name="password">  <div class="g-recaptcha" data-sitekey="Тут указываете ваш первый ключ"></div>  <!--блок кнопки reCapcha-->  <button>Отправить</button> </form>

Форма готова. Осталось только вставить свой ключ в атрибут data-sitekey и капча заработает!

Проверка reCapcha на сервере

Следующим этапом будет написание проверки результата отправки формы на сервере.

Первым делом необходимо проверить были ли вообще переданы в POST массив данные от капчи. Если таких данных не поступало то мы просто пропускаем все проверки и просим пройти валидацию.

<?php if (isset($_POST['g-recaptcha-response'])){  //проверяем дальше }else{  exit('Вы не прошли валидацию reCaptcha'); } ?>

Дальше переходим к основной части проверки. Приведу сразу весь код и поясню что за что отвечает.

<?php if (isset($_POST['g-recaptcha-response'])) {  $url_to_google_api = "https://www.google.com/recaptcha/api/siteverify";  $secret_key = '6LcdBBYUAAAAAJcHFDLRWfLYwBNomKtKGjHu21tg';  $query = $url_to_google_api . '?secret=' . $secret_key . '&response=' . $_POST['g-recaptcha-response'] . '&remoteip=' . $_SERVER['REMOTE_ADDR'];  $data = json_decode(file_get_contents($query));  if ($data->success) {  // Продолжаем работать с данными для авторизации из POST массива  } else {  exit('Извините но похоже вы робот (0_0)/');  } } else {  exit('Вы не прошли валидацию reCaptcha'); } ?>

Этого базового функционала достаточно для полноценной работы с google reCaptcha.

Интеграция с WordPress

В случае с WordPress для этой же задачи прекрасно подойдет плагин — Google Captcha (reCAPTCHA) by BestWebSoft. В него встроен обширный функционал для интеграции капчи на разные разделы WordPress сайта.

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

Google Captcha

Далее можете просто указать в каких местах сайта вы хотите видеть желаемую гуглокапчу.

Это все что я хотел поведать об установке reCaptcha.
В связи с неплохим интересом к данной статье я решил выпустить с скором времени ещё одну статью посвященную уже работе с последней версией гугл капчи. Подписывайтесь на обновления чтобы не пропустить эту статью.
Всего хорошего!

dmkweb.ru Права на контент защищены.

dmkweb.ru

Гугл капча сейчас везде. Плюс ее в том что она заменяет CSRF-токен.

Регистрируем свой домен по ссылке https://www.google.com/recaptcha/admin#list . Получаем ключи. Гугл предоставляет свое мини-апи для запросов на проверку.   Скачать его можно тут https://github.com/vaajnur/recaptcha2

Кстати, если не любите ооп и композер, в конце статьи есть способ проверки капчи всего лишь 3мя строчками кода.

Размещаем на страничке HTML-код капчи с секретным ключом.

Подключаем javascript

 <script src='https://www.google.com/recaptcha/api.js'></script> 

обработка отправленной капчи

 require_once __DIR__ . '/vendor/autoload.php'; // Register API keys at https://www.google.com/recaptcha/admin $siteKey = '6LdISD0UAAAAAFUfApJZSRqBRuOcfiVdnT31234234'; $secret = '6LdISD0UAAAAAAkYRxJxMYahh70RCVcUn5675675'; // reCAPTCHA supported 40+ languages listed here: https://developers.google.com/recaptcha/docs/language $lang = 'ru'; if (isset($_POST['g-recaptcha-response'])){  $recaptcha = new ReCaptchaReCaptcha($secret);  $resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);  if ($resp->isSuccess()):  ?>  <h2>Success!</h2>  <p>That's it. Everything is working. Go integrate this into your real project.</p>  <p><a href="/">Try again</a></p>  <?php  else:  ?>  <h2>Something went wrong</h2>  <?php  endif; }

Сама форма

  <form action="" method="post">  <div class="g-recaptcha" data-sitekey="<?php echo $siteKey; ?>"></div>  <input type="submit" value="submit" />  </form>  
 

Полный код здесь https://github.com/vaajnur/recaptcha2/blob/master/index.php

И пример http://recaptcha.dev10.ru/

Invisible recaptcha

Для этой капчи тоже нужны бэкенд обработчики. Проверка проходит по переменной g-recaptcha-response, которая попадает в post массив , или тот же token в параметрах колбека.

Регаем невидимую капчу по новой. Класс и атрибуты переносим на кнопку сабмита и навешиваем элементарный обработчик на эту кнопку. Форме присваиваем id. Внизу справа должно появиться мод. окно капчи. Обязательно ресет капчи!

 <form action="" method="post" id="id_of_form">   <button  class="g-recaptcha"  data-sitekey="<?php echo $siteKey;?>"  data-callback="onSubmit">  Submit </button>    var onSubmit = function(token) {  grecaptcha.reset()  document.getElementById("id_of_form").submit();   } </form>

Для ajax капчи добавляем

 grecaptcha.render(el, {sitekey: $(el).data('sitekey')}); 

Ajax + invisible

Добавляем аттрибуты к кнопке сабмита, обязательно колбек. И в самом колбеке делаем аякс запрос. Ресет обязателен!

<button class="g-recaptcha"  data-sitekey="6LcNqJIUA222AAIrX1xNU__j3Bk3fdgdfg9kcn34tGuU_"  data-callback="onSubmit" >Отправить заявку</button>    function onSubmit(token){  // токен нафиг он нужен, все равно приходит в g-recaptcha-response  // никаких e.preventDefault();  $.ajax({  type: "POST",  url: "/ajax-handler.php",  data: $("#form1").serialize(),  dataType: "json",  success: function(result) {  // ресет капчи  grecaptcha.reset()  

Несколько рекаптч на 1 стр.

Подключаем бибил-ку с параметрами

 //www.google.com/recaptcha/api.js?onload=onloadRecaptchaCallback&render=explicit 

и далее сам колбек. Селектор должен отличаться от привычного g-recaptcha

  var send_form = function(){}   function onloadRecaptchaCallback(){  $('.g-recaptcha123').each(function(ind, el){  grecaptcha.render(el, {  'sitekey' : jQuery(el).attr('data-sitekey'),  'callback' : send_form  })  })  } 

где el это DOM element а не jquery object.
Плюс данного вызова в том что можно выбрать любой селектор, например при открытии модалки аяксом

 grecaptcha.render($('.mainform .g-recaptcha123').get(0), { siteKey: $('.g-recaptcha123').data('sitekey') }); 

навесим обработчик конкретной форме mainform, иначе выдаст ошибку
reCAPTCHA has already been rendered in this element

Ошибки при работе с капчей.

Uncaught Error: reCAPTCHA placeholder element must be empty

Тег капчи не должен содержать вложенных тегов.

ReCAPTCHA couldn’t find user-provided function:

Бывает, что колбек существует, но не биндиться. Решение простое — вынести колбек за $(function), или прочие функции. Колбек должен быть виден напрямую.

recaptcha__ru.js:255 Uncaught (in promise) null 

Здесь ошибка колбека. Попробуйте вызвать grecaptcha.reset() в колбеке.

Uncaught Error: No reCAPTCHA clients exist.

Указанный выше способ — перегенерите капчу. grecaptcha.reset()

render Missing required parameters: sitekey

скорее всего у вас 1-й параметр ф-ии render(el, {}) не dom элемент.

Error: reCAPTCHA has already been rendered in this element
возникает с динамическим контентом. Вешаем колбек правильно, а также ставим таймаут

  $(document).on('click', "input[type='submit']", function(){  setTimeout(function(){  grecaptcha.render($('#form-container .g-recaptcha123').get(0), {  sitekey: $('#form-container .g-recaptcha123').eq(0).data('sitekey')  })  }, 1000)  })  

Uncaught (in promise) null

в моем случае в колбеке был preventDefault() к-й излишен

А также возможны ошибки бэка

OPENSSL file_get_contents(): Failed to enable crypto

file_get_contents() returns “failed to open stream:

что означает надо включить директиву пхп

allow_url_fopen

Есть и более простая форма проверки recaptcha.
$recaptcha_secret = '6Leao28UAAAfgfgfMR-6OKq9HBRgfsdkyIBdfXnFA7'; $response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$recaptcha_secret."&response=".$_POST['g-recaptcha-response']);  $result = json_decode($response, true);  

phpjs.ru

  • 30 нояб -0001
  • Автор:
  • Опубликовано в: Статьи
  • Сообщение: Оставить комментарий

Как обновить recaptcha v2 на новую recaptcha v3

 

Каждый владелец веб-ресурса сталкивается с такой проблемой как спам и бороться с этим можно с помощью CAPTCHA, который используется для того, чтобы отличить машину от человека методом определения цифр на картинке, отдельных фрагментов на изображении и другое. С это задачей легкостью справится даже ребенок, она достаточно сложная для машины. В сегодняшней статье мы рассмотрим, как установить и настроить ReCaptcha v2.0, более новую и улучшенную версию, с усовершенствованным дизайном и интерфейсом. После обновления программы, значительно упростился процесс серверной проверки.

 

Для начала необходимо получить ключи от Google, получить его можно перейдя по ссылке. Обязательным условием для поучения ключа является наличие учетной записи в Google. После перехода по ссылке необходимо добавить ваш сайт либо несколько сайтов в предложенную форму.

 

Google recaptcha 2 data-src=/images/BLOG-STATY/kak-ustanovit-recaptcha-v2-0-ot-google-2.jpg class=aligncenter alt=»Как установить ReCaptcha v2.0″ width=1170 height=520 />

 

В предложенную форму вводим наименование сайта, владельца (почтовый ящик) и домен. Без использования «http://» и «www» и нажимаем кнопку «Регистрация», после чего получаем 2 ключа, один из них секретный, далее приступаем к установке CAPTCHA на сайте.

Google recaptcha 2 data-src=/images/BLOG-STATY/kak-ustanovit-recaptcha-v2-0-ot-google-3.jpg class=aligncenter alt=»Как установить ReCaptcha v2.0″ width=1170 height=520 />

 

Для того чтобы установить CAPTCHA необходимо ввести CAPTCHA в предложенную форму следуя достаточно понятной инструкции Google. В коде HTML необходимо использовать первый ключ, API можете подключить в любом месте, можно сразу после формы, не обязательно должно быть в HEAD

 

<form method="post">   <input type="text" name="email">   <input type="text" name="url">     <div class="g-recaptcha" data-sitekey="ВАШ_КЛЮЧ"></div>     <input type="submint" name="sub_but">  </form>    <script src='https://www.google.com/recaptcha/api.js'></script>

 

Для интегрирования с сервером необходимо добавить код проверки ReCaptcha. Код на php прописываем, там, где будет проходить проверка данных у сайта.

 

//Получаем пост от recaptcha  $recaptcha = $_POST['g-recaptcha-response'];    //Сразу проверяем, что он не пустой  if(!empty($recaptcha)) {   //Получаем HTTP от recaptcha   $recaptcha = $_REQUEST['g-recaptcha-response'];   //Сюда пишем СЕКРЕТНЫЙ КЛЮЧ, который нам присвоил гугл   $secret = 'ВАШ_СЕКРЕТНЫЙ_КЛЮЧ';   //Формируем utl адрес для запроса на сервер гугла   $url = "https://www.google.com/recaptcha/api/siteverify?secret=".$secret ."&response=".$recaptcha."&remoteip=".$_SERVER['REMOTE_ADDR'];     //Инициализация и настройка запроса   $curl = curl_init();   curl_setopt($curl, CURLOPT_URL, $url);   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);   curl_setopt($curl, CURLOPT_TIMEOUT, 10);   curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16");   //Выполняем запрос и получается ответ от сервера гугл   $curlData = curl_exec($curl);     curl_close($curl);    //Ответ приходит в виде json строки, декодируем ее   $curlData = json_decode($curlData, true);     //Смотрим на результат    if($curlData['success']) {   //Сюда попадем если капча пройдена, дальше выполняем обычные    //действия(добавляем коммент или отправляем письмо) с формой       } else {   //Капча не пройдена, сообщаем пользователю, все закрываем стираем и так далее   }  }  else {   //Капча не введена, сообщаем пользователю, все закрываем стираем и так далее  }

 

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

bitoo.ru

HTML

<form class="form" action="javascript:void(0)" novalidate>   <!-- all the inputs... -->     <!-- captcha -->   <div class="input-group">   <div class="g-recaptcha" data-sitekey="6LdOPgYTAAAAAE3ltWQGar80KUavaR-JblgPZjDI"></div>   </div>     <div class="errors" id="errors" style="display: none"></div>     <div class="input-group">   <input type="button" value="Send" class="btn-default right" id="submit">   <div class="clear"></div>   </div>  </form>

JS

$('#submit').click(function(e) {   console.log('clicked submit'); // --> works     var $errors = $('#errors'),   $status = $('#status'),     name = $('#name').val().replace(/<|>/g, ""), // prevent xss   email = $('#email').val().replace(/<|>/g, ""),   msg = $('#message').val().replace(/<|>/g, "");  		var g_captcha_response = $("#g-recaptcha-response").val();     if (name == '' || email == '' || msg == '') {   valid = false;   errors = "All fields are required.";   }     // pretty sure the problem is here   console.log('captcha response: ' + g_captcha_response); // --> captcha response:      if (!errors) {   // hide the errors   $errors.slideUp();   // ajax to the php file to send the mail   $.ajax({   type: "POST",   url: "http://site.com/assets/sendmail.php",   data: "email=" + email + "&name=" + name + "&msg=" + msg + "&g-recaptcha-response=" + g_captcha_response   }).done(function(status) {   if (status == "ok") {   // slide down the "ok" message to the user   $status.text('Thanks! Your message has been sent, and I will contact you soon.');   $status.slideDown();   // clear the form fields   $('#name').val('');   $('#email').val('');   $('#message').val('');   }   });   } else {   $errors.text(errors);   $errors.slideDown();   }  });

PHP

<?php   // assemble the message from the POST fields     // getting the captcha   $captcha = "";   if (isset($_POST["g-recaptcha-response"]))   $captcha = $_POST["g-recaptcha-response"];     if (!$captcha)   echo "not ok";   // handling the captcha and checking if it's ok   $secret = "MY_SECRET";   $response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$captcha."&remoteip=".$_SERVER["REMOTE_ADDR"]), true);     // if the captcha is cleared with google, send the mail and echo ok.   if ($response["success"] != false) {   // send the actual mail   @mail($email_to, $subject, $finalMsg);     // the echo goes back to the ajax, so the user can know if everything is ok   echo "ok";   } else {   echo "not ok";   }  ?>

coding.dp.ua

Новый интерфейс reCaptcha 2

Одним из существенных изменений, на который мы наталкиваемся практически сразу при ознакомлении с reCaptcha2 является новый интерфейс оформления защитного изображения.
Интерфейс был существенно переработан — теперь он отображается в виде небольшого виджета с импровизируемым чекбоксом «я не робот», при клике на котором пользователю предлагается разгадать изображение.

При успешном разгадывании изображения капча примет следующий вид:

В случае неудачного разгадывания изображения капча уведомит об этом, что является существенным улучшением — пользователю не нужно будет перезагружать страницу несколько раз. Капча так же уведомит о неудаче в случае истекания время сессии.
Посмотреть reCaptcha2 можно в живую на демо-страничке от гугла.

Новый API

Вместе с новым интерфейсом reCaptcha2 для взаимодействия используется и новый алгоритм внедрения и взаимодействия с удаленным API.
Ключи для использования reCaptcha2 на ваших сайтах можно получить в новом интерфейсе (требуется авторизация google):

Все так же используется алгоритм приватного и публичного ключа, которые в данной версии названы как «секретный ключ» и «ключ» соответственно. Существенным изменением является то, что ключ в reCaptcha2 не может быть глобальным — теперь каждый домен, на котором планируется использовать reCaptcha2 должен быть указан в настройках. Для localhost и 127.0.0.1 капча будет работать без указания домена.
С новым api внедрить капчу в тело страницы — дело 2х строк кода(*пример простого внедрения):

<script src="https://www.google.com/recaptcha/api.js" async defer></script> <div class="g-recaptcha" data-sitekey="your_site_key"></div> 

Несмотря на это, api обладает достаточно большим набором функций для различных вариаций выгрузки reCaptcha2 и настройки ее визуализации(отображение по callback’у, стилизация и другие).
Изменился и API для валидации взаимодействия пользователя с капчей. Сразу хочу отметить, что ранее используемый стандартный post field — recaptcha_response_field теперь именуется как g-recaptcha-response. Сам API теперь возвращает результат проверки в формате JSON, что собственно не может не радовать. Запрос на валидацию при submit`e формы с капчей должен выглядеть следующим образом:
www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string&remoteip=user_ip_address

где соответственно secret — приватный ключ (секретный ключ), response — результат ответа пользователя (post.g-recaptcha-response), remoteip — ип-адрес пользователя (не обязателен). Результат обработки на данном URL будет возвращен в JSON формате:

{  "success": true|false,  "error-codes": [...] } 

в результате чего, валидация капчи будет выполнена в 1 строку (json_decode; object->success).
Документация: смотреть на google

habr.com


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector