не удалось открыть поток: истекло время соединения при получении контента с другого сайта - PullRequest
2 голосов
/ 25 апреля 2019

Более 2 лет я подписывал соглашение с другим веб-сайтом, чтобы иметь возможность получать их содержимое через мой скрипт с помощью Simple_html_DOM.Теперь внезапно без каких-либо предупреждений и все еще по контракту с ними я получаю failed to open stream: Connection timed out независимо от того, что я использую - simple_html_DOM, cURL, file_get_content.Я даже пытался использовать библиотеку snoopy для имитации веб-браузера, но время ожидания подключения все равно истекло.Они как-то блокируют соединения.Это не блокировка IP, как я пытался с нескольких разных серверов с одинаковыми результатами.Их веб-сайт нормально загружается в моем веб-браузере, поэтому никаких проблем нет.Есть ли другой способ получить контент с этого сайта?Когда я заплатил за это деньги, и они нагло игнорировали меня после того, как забрали мои деньги.

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Сервер, вероятно, блокирует запросы на основе (отсутствие действительного) заголовка пользовательского агента (User-Agent:).По сути, этот заголовок сам идентифицирует на сервере, что это такое: браузер, бот, паук, приложение и т. Д.

Вы можете попробовать использовать cURL для отправки тех же типов заголовков, которые сервер ожидает от типичного браузера., используя curl_setopt и опцию CURLOPT_USERAGENT ( документы здесь).

$url = "https://example.com";
// we're going to impersonate Chrome 74 on MacOS in this example.
$user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"; 
$ch = curl_init();
// this is where we set the option to send the user agent header
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
$result=curl_exec($ch);

Если это по-прежнему не работает, убедитесь, что вам не нужны файлы cookie или учетные данные для входа.

1 голос
/ 22 мая 2019

Если вы хотите использовать file_get_content() вместо curl. Вы можете сделать это:

$options  = array('http' => array('user_agent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'));
$context  = stream_context_create($options);
$response = file_get_contents('http://domain/path/to/uri', false, $context);
...