file_get_contents возвращает 403 запрещенных
Я пытаюсь сделать сайт взломщика. Я сделал это на своей локальной машине, и там он работает очень хорошо. Когда я выполняю то же самое на моем сервере, это показывает 403 запрещенную ошибку. Я использую PHP Simple HTML DOM Parser. Ошибка, которую я получаю на сервере, такова:
Предупреждение: file_get_contents(http://example.com/viewProperty.html?id=7715888) [function.file-get-contents]: не удалось открыть поток: ошибка HTTP-запроса! HTTP/1.1 403 Запрещено в /home/scraping/simple_html_dom.php в строке 40
Строка кода, вызывающая это:
$url="http://www.example.com/viewProperty.html?id=".$id;
$html=file_get_html($url);
Я проверил php.ini на сервере, и allow_url_fopen включен. Возможное решение может быть с помощью curl, но мне нужно знать, где я иду не так.
14 ответов
Это не проблема с вашим скриптом, а с ресурсом, который вы запрашиваете. Веб-сервер возвращает "запрещенный" код состояния.
Может случиться так, что он блокирует PHP-скрипты, чтобы предотвратить перескакивание, или ваш IP, если вы сделали слишком много запросов.
Возможно, вам следует поговорить с администратором удаленного сервера.
Я знаю, что это довольно старая тема, но думал поделиться некоторыми идеями.
Скорее всего, если вы не получаете какой-либо контент при доступе к веб-странице, вероятно, он не хочет, чтобы вы могли получить контент. Так как же определить, что скрипт пытается получить доступ к веб-странице, а не человек? Как правило, это User-Agent
заголовок в HTTP-запросе, отправляемом на сервер.
Таким образом, чтобы заставить сайт думать, что сценарий доступа к веб-странице также является человеком, вы должны изменить User-Agent
заголовок во время запроса. Большинство веб-серверов, вероятно, разрешат ваш запрос, если вы установите User-Agent
заголовок к значению, которое используется некоторым общим веб-браузером.
Список общих пользовательских агентов, используемых браузерами, перечислены ниже:
Хром:
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
Fire Fox:
'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'
так далее...
$context = stream_context_create(
array(
"http" => array(
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
)
)
);
echo file_get_contents("www.google.com", false, $context);
Этот кусок кода подделывает пользовательский агент и отправляет запрос на https://google.com/.
Рекомендации:
stream_context_create
Ура!
Добавьте это после того, как вы включили simple_html_dom.php
ini_set('user_agent', 'My-Application/2.5');
Кажется, что удаленный сервер имеет некоторый тип блокировки. Это может быть пользовательский агент, в этом случае вы можете попробовать использовать curl для имитации пользовательского агента в веб-браузере следующим образом:
$url="http://www.example.com/viewProperty.html?id=".$id;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$html = curl_exec($ch);
curl_close($ch);
Вы можете изменить это так в классе анализатора со строки 35 и далее.
function curl_get_contents($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
function file_get_html()
{
$dom = new simple_html_dom;
$args = func_get_args();
$dom->load(call_user_func_array('curl_get_contents', $args), true);
return $dom;
}
Вы пробовали другой сайт?
Напишите это в simple_html_dom.php, для меня это сработало
function curl_get_contents($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$html = curl_exec($ch);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
{
$dom = new simple_html_dom;
$args = func_get_args();
$dom->load(call_user_func_array('curl_get_contents', $args), true);
return $dom;
//$dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
}
Я понимаю, что это старый вопрос, но...
Просто установил мою локальную песочницу на linux с php7 и наткнулся на это. Используя скрипт запуска терминала, php вызывает php.ini для CLI. Я обнаружил, что опция user_agent была закомментирована. Я раскомментировал его и добавил пользовательский агент Mozilla, теперь он работает.
Вам также может понадобиться некоторая дополнительная информация в конексте, чтобы веб-сайт поверил, что запрос исходит от человека. Что он сделал, так это зашел на сайт из браузера, скопировав любую дополнительную информацию, которая была отправлена в http-запросе.
$context = stream_context_create(
array(
"http" => array(
'method'=>"GET",
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/50.0.2661.102 Safari/537.36\r\n" .
"accept: text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n" .
"accept-language: es-ES,es;q=0.9,en;q=0.8,it;q=0.7\r\n" .
"accept-encoding: gzip, deflate, br\r\n"
)
)
);
Вы проверили свои разрешения в файле? Я настроил 777 для своего файла (в localhost, очевидно) и исправил проблему.
Проверьте свою конечную точку API с помощью Postman. Он предоставит более подробную информацию об ошибке. В моем случае он сказал, что реферер пуст. Вы можете добавить реферер в заголовок.
пример завитка
curl_setopt(
$handle,
CURLOPT_HTTPHEADER,
[
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string),
'Referer: https://test.com'
]
);
пример file_get_content
$header = array(
"Content-Type: application/x-www-form-urlencoded",
"Referer: https://test.com",
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => implode("\r\n", $header),
'content' => $postdata
)
);
Это произошло в Google API с режимом ограничения. Поэтому другое решение — снятие ограничений.
При работе с серверными вызовами это в основном вызов скрипта PHP. Из-за этого многие удаленные серверы блокируют вызовы с помощью php-скриптов, чтобы избежать копирования сайтов. Этого можно легко преодолеть, заставив ваш скрипт выглядеть так, как будто он из основного. Вы можете использовать следующий код.
$context = stream_context_create(
array(
"http" => array(
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
)
)
);
echo file_get_contents("https://www.google.co.in", false, $context);
В моем случае сервер отклонял протокол HTTP 1.0 через его конфигурацию.htaccess. Похоже на то file_get_contents
использует версию HTTP 1.0.
Я получил бы тот же пб. Я только что активировал API YouTube от разработчиков консоли Google... и это сработало (больше не запрещено:-)
Я не знаю, обесценился ли предмет, я думал просто поделиться идеей С наилучшими пожеланиями
Используйте код ниже: если вы используете -> file_get_contents
$context = stream_context_create(
array(
"http" => array(
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
)
));
========= если вы используете curl,
curl_setopt($curl, CURLOPT_USERAGENT,'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36');