Защита от роботов

Авторами поисковых запросов могут быть не только пользователи, но и роботы. При большом потоке запросов от роботов могут быть превышены ограничения, наложенные на использование Яндекс.XML.

Для предотвращения несанкционированных обращений роботов к поиску используется алгоритм защиты. Если предполагается, что запрос задан роботом, вместо результатов поиска возвращается CAPTCHA (статья в Википедии про CAPTCHA).

Для использования алгоритма защиты от роботов партнер должен передавать сведения об IP-адресе и куке spravka автора запроса. Кука spravka формируется на стороне Яндекс.XML и возвращается при первом обращении пользователя за результатами поиска. В полученном значении партнер должен заменить домен на свой, а затем добавить следующую строку к поисковому ответу:

Set-Cookie: spravka=...

Сведения об IP-адресе и куке spravka передаются в заголовке запроса в формате:

X-Real-Ip: 99.999.999.99
Cookie: spravka=<значение, переданное от Яндекса>

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

  1. Пользователь отправляет запрос партнеру Яндекс.XML.

  2. Поисковый запрос отправляется сервису Яндекс.XML. Запрос должен соответствовать заданному формату.

  3. Яндекс.XML инициирует выполнение алгоритмов защиты от роботов. Для проверки используются значения IP-адреса и куки spravka (если ранее выставлена).

    Возможные результаты проверки:

    • Предположительно, запрос отправлен не роботом. Выполняется переход к пункту 13.

    • Предположительно, запрос отправлен роботом. Принимается решение об отображении CAPTCHA.

  4. Яндекс.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>
    
  5. Пользователю возвращается страница, содержащая CAPTCHA.

  6. Пользователь отправляет значение CAPTCHA партнеру.

  7. Партнер отправляет полученное от пользователя значение CAPTCHA GET-запросом следующего формата:

    https://yandex.ru/xcheckcaptcha?key=<идентификационный номер CAPTCHA>&rep=<введеное пользователем значение CAPTCHA>
    
  8. Полученное значение проверяется сервисом Яндекс.XML. Если введено некорректное значение CAPTCHA, выполняется переход к пункту 4. При этом в параметре captcha-status передается значение «failed».

  9. Если введено корректное значение CAPTCHA, Яндекс.XML выставляет пользователю куку spravka и передает ее партнеру в заголовке следующего формата:

    HTTP/1.1 200 OK
    Set-Cookie: spravka=<значение куки`>`
    

    Если запрос, переданный в Яндекс.XML на шаге 1 был успешно сохранен, выполняется переход к шагу 12.

  10. Партнер предлагает пользователю ввести запрос.

  11. Пользователь отправляет запрос партнеру Яндекс.XML.

  12. Поисковый запрос отправляется сервису Яндекс.XML. С запросом передается IP-адрес пользователя и кука spravka.

  13. Яндекс.XML обрабатывает поисковый запрос и формирует результаты.

  14. XML-файл с результатами поиска возвращается партнеру.

  15. Партнер возвращает обработанный ответ пользователю. Если на шаге 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'