Je construis une plate-forme d'actions personnelle (non distribuée). Un composant que j'aimerais avoir est le graphe EPS sur cette page:
Comme vous pouvez le constater, la page est https
, donc après plusieurs jours d'efforts, j'ai activé openssl
et maintenant, cela semble fonctionner pour toutes les pages https
telles que les pages d'accueil. de Facebook et Twitter, cependant, il ne fonctionne toujours pas pour celui dont j'ai besoin.
file_get_contents('https://facebook.com'); /* works */
file_get_contents('https://twittercom'); /* works */
file_get_contents('https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes');
Je reçois l'avertissement:
Warning: file_get_contents(): SSL: crypto enabling timeout in C:\xampp\htdocs\index.php on line 3
Warning: file_get_contents(): Failed to enable crypto in C:\xampp\htdocs\index.php on line 3
Warning: file_get_contents(https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes): failed to open stream: operation failed in C:\xampp\htdocs\index.php on line 3
Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\index.php on line 3
La seule différence que je peux voir est que la page de fidélité a un triangle près de l'étiquette https.
Ok j'ai trouvé une solution. Le problème est que le site utilise SSLv3. Et je sais qu’il ya des problèmes dans le module openssl. Il y a quelque temps, j'ai eu le même problème avec les versions SSL.
<?php
function getSSLPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSLVERSION,3);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
var_dump(getSSLPage("https://eresearch.fidelity.com/eresearch/evaluate/analystsOpinionsReport.jhtml?symbols=api"));
?>
Lorsque vous définissez la version SSL avec curl sur v3, cela fonctionne.
Modifier:
Un autre problème sous Windows est que vous n’avez pas accès aux certificats. Mettez donc les certificats racine directement en boucle.
http://curl.haxx.se/docs/caextract.html
ici, vous pouvez télécharger les certificats racine.
curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . "/certs/cacert.pem");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
Ensuite, vous pouvez utiliser le CURLOPT_SSL_VERIFYPEER
option avec true
sinon vous obtenez une erreur.
Il y avait le même problème - c'était quelque part dans le certificat de l'autorité de certification, alors j'ai utilisé le paquetage utilisé pour la boucle, et cela a fonctionné. Vous pouvez télécharger le package curl ca ici: https://curl.haxx.se/docs/caextract.html
Pour les problèmes de cryptage et de sécurité, consultez cet article utile:
https://www.venditan.com/labs/2014/06/26/ssl-and-php-streams-part-1-you-are-doing-it-wrongtm/432
Voici l'exemple:
$url = 'https://www.example.com/api/list';
$cn_match = 'www.example.com';
$data = array (
'apikey' => '[example api key here]',
'limit' => intval($limit),
'offset' => intval($offset)
);
// use key 'http' even if you send the request to https://...
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
, 'ssl' => array(
'verify_peer' => true,
'cafile' => [path to file] . "cacert.pem",
'ciphers' => 'HIGH:TLSv1.2:TLSv1.1:TLSv1.0:!SSLv3:!SSLv2',
'CN_match' => $cn_match,
'disable_compression' => true,
)
);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
J'espère que ça t'as aidé