Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Почему не качается страница через CURL. Помогите разобраться
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Почему не качается страница через CURL. Помогите разобраться

Страниц (1): [1]
 

1. IOpeH - 28 Октября, 2019 - 15:05:46 - перейти к сообщению
Есть функция (см ниже) через которую качаются страницы с https, но страницы одного противного сайта никак нихотят скачиваться, не могу понять почему. Напишите, плиз, что нужно поправить, чтобы заработало?
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function curl_file_get_contents($url, $referer=''){
  3.     $url = strval($url);
  4.     /* Исправляем URL */
  5.     while(preg_match('/[а-яё]+/i', $url, $arr)){
  6.         $url = str_replace($arr[0], urlencode(iconv('windows-1251', 'utf-8', $arr[0])), $url);
  7.     }
  8.    
  9.     $referer = strval($referer);
  10.    
  11.     $result = '';
  12.    
  13.     $curl = curl_init($url);
  14.    
  15.     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  16.     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  17.    
  18.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  19.     curl_setopt($curl, CURLOPT_HEADER, 0); /* Включать header в вывод */
  20.     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); /* Следовать любому "Location: " header */
  21.     curl_setopt($curl, CURLOPT_TIMEOUT, 20); /* Максимальное время в секундах, для работы CURL-функций */
  22.    
  23.     $str = mt_rand(3, 55).'.'.mt_rand(0, 99);
  24.     curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:'.$str.') Gecko/20100101 Firefox/'.$str);
  25.    
  26.     if(strlen($referer)){
  27.         curl_setopt($curl, CURLOPT_REFERER, $referer);
  28.     }
  29.    
  30.     /*
  31.     curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
  32.     curl_setopt($curl, CURLOPT_PROXY, get_proxy());
  33.     */
  34.    
  35.     $result = @curl_exec($curl);
  36.    
  37.     curl_close($curl);
  38.    
  39.     $result = trim(strval($result));
  40.    
  41.     return $result;
  42. }
  43.  
  44. @$DATA = curl_file_get_contents('https://elfidel.com/');
  45. echo $DATA;
  46.  
2. andrewkard - 28 Октября, 2019 - 17:32:11 - перейти к сообщению

?
3. IOpeH - 28 Октября, 2019 - 17:36:31 - перейти к сообщению
andrewkard file_get_contents не работает с https, поэтому я и начал использовать curl
4. andrewkard - 28 Октября, 2019 - 18:30:18 - перейти к сообщению
IOpeH пишет:
file_get_contents не работает с https

с чего такое утверждение,

проверял, контент какой то есть
5. IOpeH - 28 Октября, 2019 - 21:09:43 - перейти к сообщению
file_get_contents отродясь не качал ничего с https
у меня контента никакого нет, ни через file_get_contents ни через мою функцию, ни на локалке, ни на реальном сайте. И проблема именно в этом сайте, т.к. с других качается нормально.
Но так как через браузер на сайт к ним зайти можно, делаем выводы, что как то всё таки можно страницу скачать. Давайте вернёмся к способу через курл
6. andrewkard - 30 Октября, 2019 - 12:15:31 - перейти к сообщению
IOpeH пишет:
file_get_contents отродясь не качал ничего с https


Цитата:
В файле php.ini вы должны добавить эти строки, если они не существуют:

extension=php_openssl.dll

allow_url_fopen = On


Я же писал что проверил, у меня контент пришел.

По поводу curl, уберите глушилку ошибок @, смотрите что в https://www.php.net/manual/ru/function.curl-error.php, добавьте опцию curl_setopt($curl, CURLOPT_HEADER, true);

дебажте
7. IOpeH - 30 Октября, 2019 - 18:58:58 - перейти к сообщению
andrewkard сама функция curl_file_get_contents ошибок не выдает, даже если глушилки снять. Если включить вывод заголовков CURLOPT_HEADER, то с elfidel.com даже заголовков не приходят.
curl_errno() показывает 35 ошибку
Цитата:
CURLE_SSL_CONNECT_ERROR (35)
A problem occurred somewhere in the SSL/TLS handshake. You really want the error buffer and read the message there as it pinpoints the problem slightly more. Could be certificates (file formats, paths, permissions), passwords, and others.

curl_error() выдаёт такую штуку: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

Попробовал попереключать CURLOPT_SSLVERSION, выдаёт такие результаты
1 -
Цитата:
error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version

2 -
Цитата:
Unknown SSL protocol error in connection to elfidel.com:443

3 -
Цитата:
error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

4, 5 и 6 выдают -
Цитата:
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version


что с этим "добром" делать я без понятия, подскажите, кто знает
8. andrewkard - 01 Ноября, 2019 - 16:54:47 - перейти к сообщению
В файле php.ini вы должны добавить эти строки, если они не существуют:

extension=php_openssl.dll

Проверяли?
(Добавление)
Поиграться с версиями
PHP:
скопировать код в буфер обмена
  1.  
  2.         curl_setopt( $ch, CURLOPT_SSLVERSION, 1 );
  3.         curl_setopt( $ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1' );
  4.  
9. IOpeH - 01 Ноября, 2019 - 16:58:38 - перейти к сообщению
andrewkard а для курла это тоже чтоль надо?
Я пробовал включить этот модуль, но при старте сервера там ошибки вылазят, поэтому я забил на такой способ. Другие то сайты качаются через курл с https протоколом
10. LIME - 02 Ноября, 2019 - 16:27:58 - перейти к сообщению
IOpeH пишет:
а для курла это тоже чтоль надо?
по идее нет
Пыховый курл юзает curllib или она там называется
IOpeH пишет:
Другие то сайты качаются через курл с https протоколом
ну значит ты дурачек?
Вопрос поставлен о курле а оказывается дело не в нем а в контенте скорее всего.
Давай уже мозги включай.
Я не чтобы обидеть а чтобы пнуть побольнее.
(Добавление)
andrewkard неее
Подумай
Это расширение надо для сокетов
Курл свою библу юзает напрямую
(Добавление)
Но это не точно
11. IOpeH - 02 Ноября, 2019 - 22:02:52 - перейти к сообщению
покрутил я ещё с опциями и получается что если выставить CURLOPT_SSLVERSION в 2, и начать менять CURLOPT_SSL_CIPHER_LIST он начинает жаловаться, что не удалось установить список шифров. А если "CURLOPT_SSL_CIPHER_LIST" оставить по умолчанию, то получаем, как уже я выше писал "Unknown SSL protocol error in connection to elfidel.com:443". Мне думается что это верный пусть, вот только как узнать что там за неизвестная ошибка? я без понятия
12. LIME - 03 Ноября, 2019 - 01:28:48 - перейти к сообщению
IOpeH какая-то хрень кривая на их серваке похоже
Попробуй ручками через сокет получить ответ если очень надо.
Но сначала я бы проверил свою курл либу. Попробуй на другой машине, желательно с последней ос и с курлой из оф репа а не руками собранной.
(Добавление)
И еще попробуй первым делом получить курлом из терминала. Как сделать гугли. Инфы масса. Дело несложное. Курл это не пых - это библиотека и ей можно пользоваться из линуксовой консоли. Ну или виндовой если ты ламер))
13. TheCrystalMethod - 08 Апреля, 2024 - 15:31:39 - перейти к сообщению
IOpeH пишет:
andrewkard сама функция curl_file_get_contents ошибок не выдает, даже если глушилки снять. Если включить вывод заголовков CURLOPT_HEADER, то с elfidel.com даже заголовков не приходят.
curl_errno() показывает 35 ошибку
Цитата:
CURLE_SSL_CONNECT_ERROR (35)
A problem occurred somewhere in the SSL/TLS handshake. You really want the error buffer and read the message there as it pinpoints the problem slightly more. Could be certificates (file formats, paths, permissions), passwords, and others.

curl_error() выдаёт такую штуку: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

Попробовал попереключать CURLOPT_SSLVERSION, выдаёт такие результаты
1 -
Цитата:
error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version

2 -
Цитата:
Unknown SSL protocol error in connection to elfidel.com:443

3 -
Цитата:
error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

4, 5 и 6 выдают -
Цитата:
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version


что с этим "добром" делать я без понятия, подскажите, кто знает



Актуальность с ответом автору темы наверное чутка протухла, но может кто так же столкнется с похожей проблемой мой возможно поможет


У меня такая же проблема была при написани небольшого парсера для ведения статистики по неожиданных откатах контента страниц. Перебирал много разных вариантов сочетаний опций ssl для curl на РНР.

Так как простые варианты опций веерсии ssl проверки не давали результат, решил узнать а какую же версию поддерживает сервер моего сайта.

Проверка показала не свежесть продукта
Нажмите для увеличения


В итоге перебора доступных комбинаций для версии ssl нашелся вариант при котором сервер понимал что от него хотят и как общаться:
PHP:
скопировать код в буфер обмена
  1.  
  2. //используется  указание версии + указание максимально доступной для использования при запросе на сервер
  3. curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_0|CURL_SSLVERSION_TLSv1_0);
  4.  

 

Powered by ExBB FM 1.0 RC1