Могут ли серверы блокировать запросы на скручивание?

Я работаю над ZOHO API и пытаюсь обновить запись с помощью cURL. Я пробовал разные варианты cURL, но он всегда возвращает «false». Но когда я вызываю тот же URL-адрес с помощью браузера, он работает.

Есть ли способ заблокировать запросы cURL? Есть ли другой способ вызвать этот URL-адрес с помощью запроса POST или, возможно, GET?

Код cURL, который я пробовал, выглядит следующим образом:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);

person www.amitpatil.me    schedule 22.02.2012    source источник


Ответы (4)


Серверы не могут блокировать запросы cURL как таковые, но они могут блокировать любой запрос, который им не нравится. Если сервер проверяет некоторые параметры, которые не удовлетворяют ваш запрос cURL, он может решить ответить по-другому.

В подавляющем большинстве случаев эта разница в поведении вызвана наличием (или отсутствием) и значениями заголовков HTTP-запроса. Например, сервер может проверить, что заголовок User-Agent присутствует и имеет допустимое значение (он также может проверить множество других вещей).

Чтобы узнать, как выглядит HTTP-запрос, поступающий от браузера, используйте прокси-сервер отладки HTTP, например Fiddler, или прокси-сервер вашего браузера. инструменты разработчика.

Чтобы добавить собственные заголовки в запрос cURL, используйте

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue'));
person Jon    schedule 22.02.2012
comment
Согласитесь с вашими параметрами утверждения, что ваш запрос на завивание не удовлетворяет, но в официальной документации они ничего подобного не упоминали. Еще одна вещь, API должен вызываться через HTTPS .... CURL управляет внутренне, или мне нужно добавить что-то еще для работы с HTTPS? - person www.amitpatil.me; 22.02.2012
comment
@AmitPatil: Да, curl использует HTTPS. Ничего не могу сказать о ZOHO API, я даже не смотрел на него. - person Jon; 22.02.2012
comment
В подавляющем большинстве случаев эта разница в поведении вызвана наличием (или отсутствием) и значениями заголовков HTTP-запроса Современные блокировщики подделок запросов намного умнее, чем сейчас, имхо. - person Tom Desp; 22.02.2012
comment
@TomDesp: я бы очень хотел прочитать об этом больше подробностей, особенно учитывая, что мы говорим об API (это означает, что нельзя ожидать, что законные запросы будут выглядеть человеческими по каким-либо критериям) . - person Jon; 22.02.2012
comment
@Jon: я полностью согласен с тем, что вы рассматриваете точку зрения API. Я просто говорю, что заголовков не всегда достаточно. Например, мне уже приходилось включать банки cookie для включения перенаправлений с временными токенами, отправленными сервером, сохраненными в файлах cookie и переданными в перенаправленное местоположение (CURLOPT_COOKIEJAR и CURLOPT_AUTOREFERER). Во всяком случае, это решение, которое я нашел для проблем с заголовками, с которыми я столкнулся. Могут быть более простые решения. - person Tom Desp; 22.02.2012
comment
@TomDesp: файлы cookie также передаются как заголовки HTTP. ;-) - person Jon; 22.02.2012
comment
Ребята, TomDesp & Jon: я нашел решение... добавил CURLOPT_SSL_VERIFYPEER, и это сработало... ошибка неверных данных с сервера zoho.... но, по крайней мере, мой запрос был услышан сервером... большое спасибо за внимание к этому - person www.amitpatil.me; 22.02.2012
comment
@Jon: точно передается на сервер через заголовки. Но, по крайней мере, вы должны указать cUrl сохранять их при перенаправлении, верно? - person Tom Desp; 22.02.2012
comment
Cna вы приводите пример массива ('Headername: HeaderValue')? что должно идти внутри массива - person Joon. P; 30.03.2016
comment
Соглашаться. В основном это user-agent. - person Dharmendra Yadav; 22.04.2019

Многие веб-серверы хотят блокировать HTTP-запросы, подделанные чем-то другим, кроме браузера, чтобы предотвратить злоупотребления ботами. Если вы хотите имитировать/притворяться, что ваш запрос из браузера, вам как минимум необходимо:

  1. Передайте те же заголовки, что и ваши браузеры (используйте, например, Firebug, чтобы получить их)

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
  2. Изменить пользовательский агент (имя браузера)

    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    
  3. Включить файлы cookie (например, для перенаправления и обработки сеанса)

    curl_setopt ($ch, CURLOPT_COOKIEJAR, $file);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    
  4. Добавить рефералов

    curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    

И молитесь, чтобы вы ничего не пропустили!

person Tom Desp    schedule 22.02.2012

Чтобы ответить на ваш вопрос "Могут ли они каким-либо образом заблокировать CURL-запросы?": Да, на самом деле запрос cURL можно обнаружить, прочитав заголовок User-Agent.

Вы можете изменить пользовательский агент, вызвав curl_setopt($ch, CURLOPT_USERAGENT, 'My user agent string!');.

person Vitamin    schedule 22.02.2012

Просто чтобы уточнить это, вы можете использовать curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); или что-то в этом роде, чтобы подделать пользовательский агент. В этом случае сервер будет думать, что запрос делает браузер Firefox.

person ashton gleason    schedule 14.09.2018
comment
Добро пожаловать в Stack Overflow! Обратите внимание, что вы отвечаете на очень старый и уже отвеченный вопрос. Вот руководство по Как ответить. - person help-info.de; 14.09.2018