Защита от роботов
Авторами поисковых запросов могут быть не только пользователи, но и роботы. При большом потоке запросов от роботов могут быть превышены ограничения, наложенные на использование Яндекс.XML.
Для предотвращения несанкционированных обращений роботов к поиску используется алгоритм защиты. Если предполагается, что запрос задан роботом, вместо результатов поиска возвращается CAPTCHA (статья в Википедии про CAPTCHA).
Для использования алгоритма защиты от роботов партнер должен передавать сведения об IP-адресе и куке spravka автора запроса. Кука spravka формируется на стороне Яндекс.XML и возвращается при первом обращении пользователя за результатами поиска. В полученном значении партнер должен заменить домен на свой, а затем добавить следующую строку к поисковому ответу:
Set-Cookie: spravka=...
Сведения об IP-адресе и куке spravka передаются в заголовке запроса в формате:
X-Real-Ip: 99.999.999.99
Cookie: spravka=<значение, переданное от Яндекса>
Диаграмма последовательности действий, выполняемых для защиты от роботов, приведена на рисунке ниже.
-
Пользователь отправляет запрос партнеру Яндекс.XML.
-
Поисковый запрос отправляется сервису Яндекс.XML. Запрос должен соответствовать заданному формату.
-
Яндекс.XML инициирует выполнение алгоритмов защиты от роботов. Для проверки используются значения IP-адреса и куки spravka (если ранее выставлена).
Возможные результаты проверки:
-
Предположительно, запрос отправлен не роботом. Выполняется переход к пункту 13.
-
Предположительно, запрос отправлен роботом. Принимается решение об отображении CAPTCHA.
-
-
Яндекс.XML возвращает партнеру XML-файл следующего формата:
<?xml version="1.0" encoding="utf-8"?> <yandexsearch version="1.0"> <response> <error code="100">Robot request</error> </response> <captcha-img-url>http://captcha.image.gif</captcha-img-url> <captcha-key>Идентификационный номер CAPTCHA</captcha-key> <captcha-status>Статус</captcha-status> </yandexsearch>
-
Пользователю возвращается страница, содержащая CAPTCHA.
-
Пользователь отправляет значение CAPTCHA партнеру.
-
Партнер отправляет полученное от пользователя значение CAPTCHA GET-запросом следующего формата:
https://yandex.ru/xcheckcaptcha?key=<идентификационный номер CAPTCHA>&rep=<введеное пользователем значение CAPTCHA>
-
Полученное значение проверяется сервисом Яндекс.XML. Если введено некорректное значение CAPTCHA, выполняется переход к пункту 4. При этом в параметре
captcha-status
передается значение «failed». -
Если введено корректное значение CAPTCHA, Яндекс.XML выставляет пользователю куку spravka и передает ее партнеру в заголовке следующего формата:
HTTP/1.1 200 OK Set-Cookie: spravka=<значение куки`>`
Если запрос, переданный в Яндекс.XML на шаге 1 был успешно сохранен, выполняется переход к шагу 12.
-
Партнер предлагает пользователю ввести запрос.
-
Пользователь отправляет запрос партнеру Яндекс.XML.
-
Поисковый запрос отправляется сервису Яндекс.XML. С запросом передается IP-адрес пользователя и кука spravka.
-
Яндекс.XML обрабатывает поисковый запрос и формирует результаты.
-
XML-файл с результатами поиска возвращается партнеру.
-
Партнер возвращает обработанный ответ пользователю. Если на шаге 9 Яндекс.XML выставил куку spravka, она сохраняется у пользователя.
Совет
Для ознакомления с реализацией приведенной схемы используйте данный скрипт.
Проверка корректного отображения CAPTCHA
Для ознакомления с форматом ответа, возвращаемого Яндекс.XML в случае отображения CAPTCHA, необходимо отправить в качестве запроса (значение параметра query
поискового запроса) следующую строку: «e48a2b93de1740f48f6de0d45dc4192a».
Следующий GET-запрос может быть использован пользователем «xml-search-user» для ознакомления с форматом ответа, возвращаемым в случае отображения CAPTCHA:
wget -q --header="X-Real-Ip: 127.0.0.1" -SO- 'https://yandex.ru/search/xml?user=xml-search-user&key=03.44583456:c876e1b098gh65khg834ggg1jk4ll9j8&query=e48a2b93de1740f48f6de0d45dc4192a&showmecaptcha=yes'