Авторами поисковых запросов могут быть не только пользователи, но и роботы. При большом потоке запросов от роботов могут быть превышены ограничения, наложенные на использование Яндекс.XML.
Для предотвращения несанкционированных обращений роботов к поиску используется алгоритм защиты. Если предполагается, что запрос задан роботом, вместо результатов поиска возвращается CAPTCHA (статья в Википедии про CAPTCHA).
Для использования алгоритма защиты от роботов партнер должен передавать сведения об IP-адресе и куке spravka автора запроса. Кука spravka формируется на стороне Яндекс.XML и возвращается при первом обращении пользователя за результатами поиска. В полученном значении партнер должен заменить домен на свой, а затем добавить следующую строку к поисковому ответу:
Сведения об 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-запросом следующего формата:
http://xmlsearch.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- 'http://xmlsearch.yandex.ru/xmlsearch?user=xml-search-user&key=03.44583456:c876e1b098gh65khg834ggg1jk4ll9j8&query=e48a2b93de1740f48f6de0d45dc4192a&showmecaptcha=yes'