infostabil > edb.internet.* > edb.internet.webdesign.serverside.php

Kim Ludvigsen (13.09.2018, 16:13)
Jeg plejer at trække en kurs fra den thailandske nationalbank med
file_get_contents, men nu kræver de, at man er registreret, og de viser
et eksempel med curl - jeg kan bare ikke få det til at virke.

De viser nedenstående som eksempel på en kode:

curl --request GET \
--url
'https://apigw1.bot.or.th/bot/public/Stat-ExchangeRate/DAILY_AVG_EXG_RATE_V1/?start_period=20180913&end_period=20180913&currenc y=DKK
\
--header 'accept: application/json' \
--header 'x-ibm-client-id: REPLACE_THIS_KEY'

REPLACE_THIS_KEY skal selvfølgelig udskiftes med et ID, som jeg har
fået, men som jeg jo af gode grunde ikke kan skrive her.

Hvordan i alverden bruger jeg deres kode i et PHP-script? Jeg har
selvfølgelig prøvet at tjekke PHP-manualen med curl, men det er desværre
sort snak for mig.
Jan Hansen (13.09.2018, 18:43)
Skal det absolut være fra nationalbanken?
Det her giver nok samme resultat,

<?php
$v=file_get_contents('https://www.valutakurser.dk/forex/details.aspx?id=492430');
$p=strpos($v,"\n",strpos($v,'stockPriceUCLastPrice '));
echo "Kursen er ".trim(substr($v,$p,strpos($v,"<",$p)-$p));
?>
Kim Ludvigsen (13.09.2018, 20:25)
Den 13-09-2018 kl. 18:43 skrev Jan Hansen:
> Skal det absolut være fra nationalbanken?
> Det her giver nok samme resultat,
> <?php
> $v=file_get_contents('https://www.valutakurser.dk/forex/details.aspx?id=492430');
> $p=strpos($v,"\n",strpos($v,'stockPriceUCLastPrice '));
> echo "Kursen er ".trim(substr($v,$p,strpos($v,"<",$p)-$p));
> ?>


Tak, men det er desværre ikke kun THB/DKK, jeg skal bruge.

På min danske hjemmeside, henter jeg den kurs fra den danske
nationalbank. På min engelske udgave af hjemmesiden skal jeg bruge
kurser for 13 forskellige valutaer - og det skal helst ikke være den
aktuelle kurs, men den officielle middelkurs for dagen. Jeg skal også
gerne kunne trække datoen ud.

Kan valutakurser.dk leve op til det? I så fald, hvordan fandt du den
pågældende URL?
Bertel Lund Hansen (13.09.2018, 21:03)
Jan Hansen skrev:

> Skal det absolut være fra nationalbanken?
> Det her giver nok samme resultat,


> <?php
> $v=file_get_contents('https://www.valutakurser.dk/forex/details.aspx?id=492430');
> $p=strpos($v,"\n",strpos($v,'stockPriceUCLastPrice '));
> echo "Kursen er ".trim(substr($v,$p,strpos($v,"<",$p)-$p));
> ?>


Nogle PHP-opsætninger tillader ikke den adgang. CURL er den sikre
måde at gøre det på.
Kim Ludvigsen (13.09.2018, 22:20)
Den 13-09-2018 kl. 21:03 skrev Bertel Lund Hansen:
> Jan Hansen skrev:
> Nogle PHP-opsætninger tillader ikke den adgang. CURL er den sikre
> måde at gøre det på.


Jeg har lige testet, og det virker på mit webhotel, men det er jo ingen
garanti for, at det også vil virke i morgen. Jeg vil helt klart
foretrække at få det til at virke med den thailandske nationalbank, men
jeg vil være tilfreds, hvis bare jeg kan få det til at virke.

Det er drønirriterende, at de forhindrer, at jeg henter via
file_get_contents - jeg var ellers så flink kun at hente én gang i
døgnet i stedet for ved hvert besøg.
Kim Ludvigsen (13.09.2018, 22:38)
Den 13-09-2018 kl. 16:13 skrev Kim Ludvigsen:

Hvor flovt. Jeg havde ikke set, at de havde en menu, hvor man kunne
finde eksempler til forskellige script-sprog. De havde også et eksempel
til PHP.

> De viser nedenstående som eksempel på en kode:
> curl --request GET \
>   --url
> 'https://apigw1.bot.or.th/bot/public/Stat-ExchangeRate/DAILY_AVG_EXG_RATE_V1/?start_period=20180913&end_period=20180913&currenc y=DKK
> \
>   --header 'accept: application/json' \
>   --header 'x-ibm-client-id: REPLACE_THIS_KEY'


PHP-udgaven, hvis andre skulle have brug for opskriften curl => php:

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL =>
"https://apigw1.bot.or.th/bot/public/Stat-ExchangeRate/DAILY_AVG_EXG_RATE_V1/?start_period=2018-09-13&end_period=2018-09-13&currency=DKK",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"accept: application/json",
"x-ibm-client-id: REPLACE_THIS_KEY"
),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
Kim Ludvigsen (13.09.2018, 22:43)
Den 13-09-2018 kl. 22:38 skrev Kim Ludvigsen:
> Den 13-09-2018 kl. 16:13 skrev Kim Ludvigsen:
> Hvor flovt. Jeg havde ikke set, at de havde en menu, hvor man kunne
> finde eksempler til forskellige script-sprog. De havde også et eksempel
> til PHP.


Og nu kommer næste problem så, hvordan udtrækker jeg værdien for
"mid_rate" (den sidste værdi i svaret, som ses nedenfor).

{"result":{"success":"true","api":"Daily Weighted-average Interbank
Exchange Rate - THB / USD","timestamp":"2018-09-14
03:36:22","data":{"data_header":{"report_name_eng" :"Rates of Exchange of
Commercial Banks in Bangkok Metropolis
(2002-present)","report_name_th":"?????????????????????? ??????????????????????????????
(2545-????????)","report_uoq_name_eng":"(Unit : Baht / 1 Unit of Foreign
Currency)","report_uoq_name_th":"(????? : ??? ??? 1
??????????????????????)","report_source_of_data":[{"source_of_data_eng":"Bank
of
Thailand","source_of_data_th":"??????????????????? "}],"report_remark":[{"report_remark_eng":"Since
Nov 16, 2015 the data regarding Buying Transfer Rate of PKR has been
changed to Buying Rate using Foreign Exchange Rates (THOMSON REUTERS)
with Bangkok Market Crossing.","report_remark_th":"????????????? 16 ?.?.
2558 ??????????????????????????????? PKR
?????????????????????????????????????????????????? (??????????????)
???????????????????????????????? ???.
??????????????"}],"last_updated":"2018-09-13"},"data_detail":[{"period":"2018-09-13","currency_id":"DKK","currency_name_th":"?????? ??
: ???? (DKK)","currency_name_eng":"DENMARK : KRONE (DKK)
","buying_sight":"5.0225000","buying_transfer":"5. 0394000","selling":"5.1374000","mid_rate":"5.08840 00"}]}}}
Jan Hansen (13.09.2018, 22:56)
Den Thu, 13 Sep 2018 22:20:39 +0200 skrev Kim Ludvigsen <kim>:

> Jeg har lige testet, og det virker på mit webhotel, men det er jo ingen
> garanti for, at det også vil virke i morgen.


Det virker åbenbart ganske stabilt, jeg fandt et link til svenske kroner i en logfil fra december 2016, det er stadig samme url.
Det med dagens middelkurs er det nok lidt værre med, er det den, der står ude i højre side under "Kurshistorik"?
Jeg fandt siden ved at gå ind på valutakurser.dk og så klikke på "Thailandsk baht" et stykke nede af forsiden.
Jan Hansen (13.09.2018, 23:22)
Den Thu, 13 Sep 2018 22:43:44 +0200 skrev Kim Ludvigsen <kim>:

> > echo $response;


> Og nu kommer næste problem så, hvordan udtrækker jeg værdien for
> "mid_rate" (den sidste værdi i svaret, som ses nedenfor).


Der står jo kun "mid_rate" et sted, så det er bare at tage tallet 11
tegn længere fremme:

<?php
$response='bla bla bla "5.0394000","selling":"5.1374000","mid_rate":"5.08 84000"}]}}}';
$kurs=floatval(substr($response,strpos($response,' mid_rate')+11));
echo $kurs;
?>
Kim Ludvigsen (13.09.2018, 23:30)
Den 13-09-2018 kl. 23:22 skrev Jan Hansen:
> Den Thu, 13 Sep 2018 22:43:44 +0200 skrev Kim Ludvigsen <kim>:
> Der står jo kun "mid_rate" et sted, så det er bare at tage tallet 11
> tegn længere fremme:
> <?php
> $response='bla bla bla "5.0394000","selling":"5.1374000","mid_rate":"5.08 84000"}]}}}';
> $kurs=floatval(substr($response,strpos($response,' mid_rate')+11));
> echo $kurs;
> ?>


Smukt, det virker helt fint! Jeg havde ingen ide om, hvordan jeg trak
det ud. Hidtil har jeg kun prøvet at trække værdier ud af feeds - og det
kun ved at kopiere kode fra andre steder.

Mange tak for hjælpen!
Martin Larsen (14.09.2018, 13:54)
Den 13-09-2018 kl. 23:22 skrev Jan Hansen:

> Der står jo kun "mid_rate" et sted, så det er bare at tage tallet 11
> tegn længere fremme:


Det virker, men det er ikke en robust måde at gøre det på.

Strengen er json-data, så den rigtige løsning er at bruge json_decode:

$json = '{"result":{"success":"true","api":"Daily Weighted-average
Interbank Exchange Rate - THB / USD","timestamp":"2018-09-14
03:36:22","data":{"data_header":{"report_name_eng" :"Rates of Exchange of
Commercial Banks in Bangkok Metropolis
(2002-present)","report_name_th":"?????????????????????? ??????????????????????????????
(2545-????????)","report_uoq_name_eng":"(Unit : Baht / 1 Unit of Foreign
Currency)","report_uoq_name_th":"(????? : ??? ??? 1
??????????????????????)","report_source_of_data":[{"source_of_data_eng":"Bank
of
Thailand","source_of_data_th":"??????????????????? "}],"report_remark":[{"report_remark_eng":"Since
Nov 16, 2015 the data regarding Buying Transfer Rate of PKR has been
changed to Buying Rate using Foreign Exchange Rates (THOMSON REUTERS)
with Bangkok Market Crossing.","report_remark_th":"????????????? 16 ?.?.
2558 ??????????????????????????????? PKR
?????????????????????????????????????????????????? (??????????????)
???????????????????????????????? ???.
??????????????"}],"last_updated":"2018-09-13"},"data_detail":[{"period":"2018-09-13","currency_id":"DKK","currency_name_th":"?????? ??
: ???? (DKK)","currency_name_eng":"DENMARK : KRONE (DKK)
","buying_sight":"5.0225000","buying_transfer":"5. 0394000","selling":"5.1374000","mid_rate":"5.08840 00"}]}}}
';

$obj = json_decode($json);
$midrate = $obj->result->data->data_detail[0]->mid_rate;
echo $midrate;
Martin Larsen (14.09.2018, 13:55)
Den 14-09-2018 kl. 13:54 skrev Martin Larsen:

> Strengen er json-data, så den rigtige løsning er at bruge json_decode:


Tip:

Smid json-data ind fx her [..] og klik på Format.
Bertel Lund Hansen (14.09.2018, 14:40)
Martin Larsen skrev:

> Tip:
> Smid json-data ind fx her [..] og klik på Format.


Smart. Bagefter kan man klikke på "Viewer". Så bliver det mere
overskueligt.
Jan Hansen (14.09.2018, 16:19)
Den Fri, 14 Sep 2018 13:55:44 +0200 skrev Martin Larsen <martin+spamfree+larsen>:

> Tip:
> Smid json-data ind fx her [..] og klik på Format.


Ja, den side gør det selvfølgelig noget nemmere, ellers kan man vist nemt
bruge timer på at gennemskue det array i arrays array i 5 lag. Når "mid_rate"
ikke forekommer et varierende antal gange i $response, er det meget nemmere
bare at klippe det ud som tekst. Men ok,

<?php
$a=json_decode($response, true);
echo 'Kursen er: '.$a["result"]["data"]["data_detail"][0]["mid_rate"];
?>
Kim Ludvigsen (14.09.2018, 18:33)
Den 14-09-2018 kl. 16:19 skrev Jan Hansen:
> Den Fri, 14 Sep 2018 13:55:44 +0200 skrev Martin Larsen <martin+spamfree+larsen>:
>> Tip:
>> Smid json-data ind fx her [..] og klik på Format.

> <?php
> $a=json_decode($response, true);
> echo 'Kursen er: '.$a["result"]["data"]["data_detail"][0]["mid_rate"];
> ?>


Jeg havde lige nået at få lavet det med substr - jeg prøver at bruge
json-decode i stedet.

Tak til jer alle!

Lignende emner