Tester à chaque fois, c'est évident...
Autre question sur le même sujet :
Connaissez-vous PHP et pouvez-vous m'aider sur un point sur lequel je bute ? (mais peut-être ne sommes-nous plus dans le bon forum)
J'ai une procédure VBA qui, en Excel me rapatrie depuis le site Yahoo Finance, l'historique des cours en bourse des actions de mon portefeuille. Elle fonctionne très bien et la voici pour avoir une idée de son fonctionnement :
Je construis l'URL avec les variables (string) reprenant :
- le code ticker de l'action ;
- la date de début d'historique désiré ;
- la date de fin d'historique désiré.
NB : les dates sont au format TimeStamp UNIX, c'est à dire comptées en secondes à partir du 01.01.1970 à 6h00. Ainsi, le 01.06.2017 est représenté par la chaîne de caractères "1496289600"
Pour info, demander les cours d'Air Liquide du 31.05.2017 au 02.06.2017 générera l'url suivante :
URL = "https://query1.finance.yahoo.com/v7/finance/download/AI.PA?period1=1496203200&period2=1496376000&interval=1d&events=history&crumb=LFC/Nu7io28"
La réponse me parvient sous forme d'un fichier CSV que je traite sans souci :
Date,Open,High,Low,Close,Adj Close,Volume
2017-05-31,109.300003,109.400002,108.300003,108.500000,108.500000,1151102
2017-06-01,108.750000,109.949997,108.699997,109.849998,109.849998,700956
2017-06-02,110.550003,111.449997,110.199997,111.099998,111.099998,719329
1 2 3 4 5 6 7 8 9 10
| (Je limite le code à ce qui est important)
[...]
Dim WHR As New WinHttpRequest
URL = "https://query1.finance.yahoo.com/v7/finance/download/" & TickerAction & "?period1=" & strDateDeb & "&period2=" & strDateFin & "&interval=1d&events=history&crumb=LFC/Nu7io28"
WHR.Open "POST", URL, False
WHR.Send
Reponse = WHR.responseText
[...] |
On voit que j'ai utilisé la méthode "POST" après avoir testé sans succès la méthode "GET".
Pour info, quand on entre l'URL directement dans la barre d'adresse du navigateur, on obtient bien le fichier csv en téléchargement.
J'essaie maintenant de transposer la gestion de mon portefeuille sur mon site Internet et je programme donc en PHP.
L'idée est évidemment de refaire la même chose en utilisant la bibliothèque CURL.
Je construits l'URL de la même façon (il n'y a pas d'erreur, c'est vérifié) et je lance la requête avec la méthode "GET" puis la méthode "POST" (à la lecture du code, vous comprendrez que nous sommes dans une classe qui fonctionne parfaitement par ailleurs ; à la base, elle n'est pas de moi, mais je l'ai modifiée).
Dans les deux cas, je n'ai pas le résultat escompté.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
protected function curlRequest($url,$methode='POST')
{
$response = [];
$userAgent = @($this->config['userAgent'] ?: $_SERVER["HTTP_USER_AGENT"] ?: null);
//curl request
$ch = curl_init($url);
if ($methode=='POST') {curl_setopt($ch, CURLOPT_POST, true);}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
$response['result'] = curl_exec($ch);
$response['status'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$response['error'] = curl_error($ch);
$response['errno'] = curl_errno($ch);
curl_close($ch);
$this->response = $response;
} |
Retour avec "GET" : j'ai un fichier du type json :
{ "finance": { "error": { "code": "Unauthorized", "description": "Invalid cookie" } } }
Retour avec "POST" : une page Internet Yahoo qui s'excuse pour l'erreur et explique tout mettre en œuvre pour la corriger.
J'en déduis un problème de paramétrage dans curl_setopt, mais lequel ? car je répète que ce code fonctionne parfaitement pour d'autres interrogations sur le même site...
Partager