У меня возникли проблемы с использованием cURL для конкретной страницы.
Работает живой код: http://svgen.com/jupiter.php
Вот мой код:
$url = 'https://uspdigital.usp.br/jupiterweb/autenticar'; $data = array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_COOKIEJAR, "FileHere"); curl_setopt($ch, CURLOPT_COOKIEFILE, "FileHere"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP); curl_exec($ch); curl_close($ch);
Несмотря на то, что я использовал те же URL-адреса и почтовые данные, file_get_contents работал:
$options = array('http' => array('method' => 'POST','content' => http_build_query($data))); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); var_dump($result);
Кто-то может мне помочь? Благодарю.
сделайте свои данные в виде:
$data = array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1'); $postData = ""; foreach( $data as $key => $val ) { $postData .=$key."=".$val."&"; } $postData = rtrim($postData, "&");
и изменение:
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
в
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
Скорее всего, это проблема проверки SSL.
Добавить
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
Также, если вы используете параметр CURLOPT_PROTOCOLS
, это должен быть HTTPS, поскольку вы отправляете на безопасный URL-адрес
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); // you currently have http
$data = array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1');
должно было
$data = http_build_query(array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1'));
Он автоматически url также кодирует вашу строку запроса и безопаснее, чем ручные методы.
Попробуйте эти:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_CAINFO, '/etc/pki/tls/cert.pem'); // path is valid for RHEL/CentOS
Это гарантирует, что ресурс, который вы «скручиваете», имеет действительный сертификат SSL. Не рекомендуется устанавливать для параметра «CURLOPT_SSL_VERIFYPEER» значение false (0).
Вы используете безопасное соединение, почему вы используете:
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
Используйте вместо этого:
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);