[RESOLU] Conversion Yen > Euro, avec taux de change de l'ECB ou xe.com ?

Avatar du membre
Eléphanteau du PHP | 28 Messages

05 mai 2015, 22:43

Bonsoir,

Je cherche à intégrer sur mon site d'information sur la création de manga amateur: http://ippai.free.fr,
une fonction permettant de multiplier le prix en Yen d'un matériel de Mangaka Japonais, avec le taux de change de l'Euro de la BCE : https://www.ecb.europa.eu/stats/exchang ... py.en.html
Sur cette page pour avoir un taux de change sous un format : JPY 1 = EUR 0.007467 (au 2015/05/05) il faut faire:
Select: JPY vs EUR

Je trouve aussi ce taux approximatif, directement avec xe.com ici : http://www.xe.com/fr/currencyconverter/ ... JPY&To=EUR

Mon problème c'est que je ne comprends pas comment extraire ce taux dans un script php ?
Et faire une multiplication automatique en Euro , avec la valeur en Yen du produit.

L'idée serait d'avoir la conversion en Euro à jour automatiquement, juste en face.
Pour que les utilisateurs puisse connaitre le prix au plus près du matériel en Euro, à titre informatif.

TAB-MATE CONTROLLER (License) 4 378 ¥ (32,69 €)

Image

Soit : 4378x(extraction taux yen vers euros(0.00xxxx))= valeur €

http://www.amazon.co.jp/dp/B00LSCXLQE/

Je précise que je ne veux pas passer par un formulaire ou il faut sélectionner la devise et cliquer pour valider et avoir la réponse.
Car de nombreux service gratuit de ce genre existe déjà sur internet,

Et seul la conversion du Yen vers l'Euro m'intéresse.

Merci de vos lumières, car j'ai l'impression que ça n'est pas des plus simples :?
Modifié en dernier par Virginie le 05 mai 2015, 22:53, modifié 1 fois.

Mammouth du PHP | 688 Messages

05 mai 2015, 22:52

sur le site de la bce, tu as où j'imagine que celle le taux de change varie :
<a href="eurofxref-graph-jpy.en.html" title="Link to">JPY <img src="../shared/img/down.gif" width="9" height="9" alt="down" title="" /> 133.92</a>

tu fais un script qui demande le contenu de la page du site de la bce, extrait le taux et le sauve sur ton site dans une base de donnée ou dans un fichier.
tu lances ce script de manière régulière, soit automatiquement avec un cron ou un pseudo cron; soit tu le lances quand tu y penses.

dans une page de ton site, tu récupères le taux de change dans la base de donnée ou dans le fichier, et tu fais la / ou *.

Avatar du membre
Eléphanteau du PHP | 28 Messages

05 mai 2015, 23:17

Merci de ce début de réponse.

Je pense que récupérer le taux dans un fichier serais moins lourd, car le site est chez free.

Oui le taux varie c'est pour ça qu'il faudrait au plus simple le récupérer à chaque chargement de la page,
pour ne pas risquer une erreur d'horloge.

tof73 : Tu proposes donc plutôt de faire :

1 / ( divisé) par le taux de change du yen x ( multiplié) le prix indicatif du matériel en yen = l'équivalence en euro ?

Mais quel code écrire pour extraire la valeur de ce taux ?

Et quel code dois-je écrire pour faire:

1 / (Taux Yen Extrait/caché) X (Prix Yen Ecrit/Affiché) = (Prix Euro Généré/Affiché) ?

<p>4378 &yen; <?php $variable = 1 / (extraction taux Yen) * 4378; echo $variable; ?><p> ?


Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 mai 2015, 00:28

Bonsoir,

Tu peux utiliser la fonction file_get_contents() pour lire un fichier ou dans ton cas le contenu d'une page distante.
Une fois ce flux récupéré, il te faudra le parser avec une expression régulière afin d'en extraire la partie qui t'intéresse, avec preg_match() par exemple.

Pour le site ECB, tu pourrais essayer de capturer la valeur de la variable rateLatest dans le javascript : preg_match("/rateLatest='(.*)'/", $flux, $match). Cependant te connecter à chaque fois au site pour en extraire la valeur n'est pas très performant. Et si jamais le site change d'url, de nom de variable ou autre, ton script ne fonctionnera plus.
A voir s'il n'est pas plus intéressant d'utiliser le taux moyen indiqué sur leur site (137.62) et de l'actualiser manuellement une fois par mois (ou plus, ou moins...)

Attention également aux conditions d'utilisations du service. Le site XE.com indique explicitement que l'extraction automatique des taux est interdite... Je ne sais pas ce qu'il en est sur ECB, mais il est probable qu'il en soit de même.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Eléphanteau du PHP | 28 Messages

06 mai 2015, 00:53

Merci de l'info pour l'interdiction de l'extraction des taux chez XE.com.
J'imagine que l'extraction automatique leur fait perdre des revenus s'ils font payer 540$/an des modules pour le faire sur des boutiques eBay.

Il faudrait effectivement voir si la BCE l'interdit aussi ?

Je trouve le taux yen vers euro, ici aussi : http://www.boursorama.com/taux-de-chang ... ro-jpy-eur
Modifié en dernier par Virginie le 06 mai 2015, 01:03, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 mai 2015, 00:58

Effectivement, les données de xe.com ne sont pas libres, il faut souscrire à leur API pour avoir le droit de récupérer automatiquement les taux de change.

Yahoo Finance fournit une API en JSON/XML et l'utilisation est gratuite, mais ils bloquent si le nombre de requêtes est trop important c'est à dire + de 2000 appels par heure.

Code : Tout sélectionner

https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22EURJPY%22%2C%20%22JPYEUR%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=
Personnalisable ici.


Celui de la Banque Centrale Européenne (BCE/ECB) est par contre librement réutilisable visiblement sans limitation d'aucune sorte.
Leur site internet donne même explicitement des liens pour télécharger les données XML et même des exemples de code PHP pour extraire automatiquement les taux ;-)

Voici un exemple clé-en-main que je viens de faire pour ton usage :
<?php
$xml = simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
foreach($xml->Cube->Cube->Cube as $currency_rate) {
	if ($currency_rate['currency']=='JPY') $taux_jpy=(float) $currency_rate['rate'];
}


/* Conversion Euro => Yen */
$montant_en_euro = 100;
$montant_converti_en_yen = $montant_en_euro*$taux_jpy;
print $montant_en_euro." EUR => ".$montant_converti_en_yen." JPY <hr />";


/* Conversion Yen => Euro */
$montant_en_yen = 100;
$montant_converti_en_euro = $montant_en_yen/$taux_jpy;
print $montant_en_yen." JPY => ".$montant_converti_en_euro." EUR <hr />";
##edit : Ajout de l'info sur la limite de 2000 appels/heure pour Yahoo
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphanteau du PHP | 28 Messages

06 mai 2015, 01:05

Merci bien, je vais tester ça :) !

<?php 
$xml = simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
foreach($xml->Cube->Cube->Cube as $currency_rate) {
	if ($currency_rate['currency']=='JPY') $taux_jpy=(float) $currency_rate['rate'];
}

/* Conversion Yen => Euro */
$montant_en_yen = 4378;
$montant_converti_en_euro = 1/$taux_jpy*$montant_en_yen;
print $montant_en_yen." JPY => ".$montant_converti_en_euro." EUR <hr />";
?>
ça me renvoie de drôles d'erreurs ?

Code : Tout sélectionner

Warning: simplexml_load_file() [function.simplexml-load-file]: http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml:1: parser error : Document is empty in /mnt/132/sda/2/5/ippai/materiel_packs.php on line 84 Warning: simplexml_load_file() [function.simplexml-load-file]: in /mnt/132/sda/2/5/ippai/materiel_packs.php on line 84 Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /mnt/132/sda/2/5/ippai/materiel_packs.php on line 84 Warning: simplexml_load_file() [function.simplexml-load-file]: http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml:1: parser error : Start tag expected, '<' not found in /mnt/132/sda/2/5/ippai/materiel_packs.php on line 84 Warning: simplexml_load_file() [function.simplexml-load-file]: in /mnt/132/sda/2/5/ippai/materiel_packs.php on line 84 Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /mnt/132/sda/2/5/ippai/materiel_packs.php on line 84 Warning: Invalid argument supplied for foreach() in /mnt/132/sda/2/5/ippai/materiel_packs.php on line 85 Warning: Division by zero in /mnt/132/sda/2/5/ippai/materiel_packs.php on line 91 4378 JPY => EUR
Le simplexml_load_file semble ne pas passer :( ?!

Avatar du membre
Mammouth du PHP | 1609 Messages

06 mai 2015, 15:37

Salut, peut être l'url http://www.ecb.europa.eu/stats/eurofxre ... -daily.xml n'était pas disponible au moment ou tu faisais ton test.
As tu testé de l'ouvrir directement dans ton navigateur ?
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 28 Messages

06 mai 2015, 16:46

Oui, je l'ai tester directement dans le navigateur.
<?xml version="1.0" encoding="UTF-8"?>
-<gesmes:Envelope xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"           xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01">
<gesmes:subject>Reference rates</gesmes:subject>
-<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
-<Cube>
-<Cube time="2015-05-06">
<Cube rate="1.1230" currency="USD"/>
<Cube rate="134.59" currency="JPY"/>
<Cube rate="1.9558" currency="BGN"/>
<Cube rate="27.415" currency="CZK"/>
<Cube rate="7.4648" currency="DKK"/>
<Cube rate="0.73760" currency="GBP"/>
<Cube rate="304.55" currency="HUF"/>
<Cube rate="4.0483" currency="PLN"/>
<Cube rate="4.4432" currency="RON"/>
<Cube rate="9.3066" currency="SEK"/>
<Cube rate="1.0374" currency="CHF"/>
<Cube rate="8.4130" currency="NOK"/>
<Cube rate="7.5810" currency="HRK"/>
<Cube rate="56.0901" currency="RUB"/>
<Cube rate="3.0405" currency="TRY"/>
<Cube rate="1.4030" currency="AUD"/>
<Cube rate="3.4394" currency="BRL"/>
<Cube rate="1.3487" currency="CAD"/>
<Cube rate="6.9630" currency="CNY"/>
<Cube rate="8.7053" currency="HKD"/>
<Cube rate="14662.18" currency="IDR"/>
<Cube rate="4.3465" currency="ILS"/>
<Cube rate="71.3554" currency="INR"/>
<Cube rate="1215.84" currency="KRW"/>
<Cube rate="17.2044" currency="MXN"/>
<Cube rate="4.0089" currency="MYR"/>
<Cube rate="1.4990" currency="NZD"/>
<Cube rate="50.061" currency="PHP"/>
<Cube rate="1.4899" currency="SGD"/>
<Cube rate="37.373" currency="THB"/>
<Cube rate="13.5142" currency="ZAR"/>
</Cube>
</Cube>
</gesmes:Envelope>
L'entête peut elle avoir une influence ?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="content-language" content="fr" />
Modifié en dernier par Virginie le 06 mai 2015, 16:51, modifié 1 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

06 mai 2015, 16:51

L'entête de quoi ? car le xml eurofxref-daily.xml n'a pas une telle entête.
L'entête de ta page quand à elle n'a aucune influence sur le simplexml_load_file.

Tu as toujours la même erreur ? peut être ton serveur n'autorise pas l'ouverture d'une ressource distante ?

Je pense qu'@rthur a du tester son code et qu'il est fonctionnel.

EDIT
Tu peux tester ça et voir si ça te retourne bien le contenu xml :
echo file_get_contents('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 28 Messages

06 mai 2015, 17:02

Je le met où l'echo dans mon code ?

Avatar du membre
Mammouth du PHP | 1609 Messages

06 mai 2015, 17:14

Ton code est fonctionnel chez moi :
4378 JPY => 32.528419644847 EUR <hr />
Il doit y avoir une restriction sur ton serveur.
Le file_get_contents fonctionne-t-il ?

EDIT
Le echo tu le mets n'importe où, c'est pour tester si tu peux récupérer le contenu de la page.
Si ça fonctionne ça va t'afficher le xml.
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1609 Messages

06 mai 2015, 17:29

Je pense que tu dois avoir la directive allow_url_fopen à 0.

Si tu ne peux pas changer la valeur de la directive pour la passer à 1, une façon de contourner le problème serait de passer par la lib cURL, si elle est disponible, pour charger le contenu xml.

Ca donnerait un code dans le style :
$ch = curl_init('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');    
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
$xml = curl_exec($ch);
curl_close($ch);

$xml = simplexml_load_string($xml);
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 28 Messages

06 mai 2015, 18:46

http://openclassrooms.com/forum/sujet/f ... ge-4728440
Bonjour,
J'arrives un peut tard ici, mais oui j'ais bien lu que free avait "coupé" ces fonctions !
Je me demandes alors comment font les sites web de FREE qui utilisent paypal lequel a son code en CURL
CURL ne semble pas être la solution chez free.fr #-o .

Trouvé ça du coups ?

http://votreprojetweb.free.fr/allowUrlFopen.php

Mais c'est aussi interdit :( !

http://openclassrooms.com/forum/sujet/a ... t-contents
Bonjour à tous,

J'ai fait un site pour une asso, hébergé chez Free. En voulant y intégrer des infos météo récupérés sur un site (ftp://tgftp.nws.noaa.gov/data/observati ... s/NTAA.TXT) je suis tombé sur un os: la fonction file_get_contents() est désactivée chez Free, ainsi que fsockopen(), curl(), readfile(), file() et allow_url_open(). Est-ce possible de la remplacer en JS et comment ? J'ai essayé XMLHttpRequest mais en vain.

Si quelqu'un peut m'aider, merci d'avance.
Il va donc falloir que je mettre le taux dans un include génréral mais comment écrire ça proprement ?
<?php
$montant_en_yen = 4378;
$montant_converti_en_euro = $montant_en_yen*0.007430;
print $montant_en_yen." &yen; (".$montant_converti_en_euro." &euro;)";
?>
Et comment arrondir au second chiffre après la virgule, la somme final avec round (".$montant_converti_en_euro , 2) ?
http://twig.sensiolabs.org/doc/filters/round.html
Modifié en dernier par Virginie le 06 mai 2015, 19:35, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 mai 2015, 19:33

Free ne permet pas d'accéder à des fichiers externes en PHP donc je pense que tout ce que tu essayeras en PHP va échouer sauf à changer d'hébergeur :-/

Une solution serait de faire cela en full javascript avec l'API de Yahoo, voici ce que ça donnerai :
<div>Prix : <span class="prix_yen">478</span> JPY <span class="prix_converti_euro"></span></div>

<script>
function phpfrance_callback(data) {
    var taux_jpy=data.query.results.rate[0].Rate;

    var prix_yen = document.getElementsByClassName("prix_yen");
    var prix_converti_euro = document.getElementsByClassName("prix_converti_euro");
    
	for(var i = 0; i < prix_yen.length; i++) {
	    var montant_en_yen=parseFloat(prix_yen.item(i).innerHTML);
	    var montant_converti_en_euro = 1/taux_jpy*montant_en_yen;
	    prix_converti_euro.item(i).innerHTML = " soit "+montant_converti_en_euro.toFixed(2)+" EUR";
	}

};
</script>
<script src="https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22EURJPY%22%2C%20%22JPYEUR%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=phpfrance_callback"></script>
Quand tout le reste a échoué, lisez le mode d'emploi...