Главная > Технический изврат > Снова Grandstream и валюты

Снова Grandstream и валюты

В один прекрасный день я снова не обнаружил курсы валют на экране своего телефона. Оказалось, что Yahoo навсегда закрыл свое валютное API, и надо было искать замену.

Покопавшись в интернете, я выбрал сервис Alpha Vantage. Они предоставляют в реальном времени различную финансовую информацию, причем бесплатно. Нужно только получить API ключ.

Данные отдаются в формате JSON в нормальном человеко-читаемом виде. Естественно, пришлось переделать скрипт для доступа к данным.

<?php

$apikey = 'YOUR_KEY';
$url = "https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&apikey=${apikey}&";
$proxy_addr = 'addr:port';
$proxy_user = 'user:password';
$round = 2;


$pairs = array();

$params = preg_split('/&/', $_SERVER['QUERY_STRING']);

foreach ($params as $param) {
   $matches = array();
   if (preg_match('/^s=(\w+)(\w{3})=/', $param, $matches)) {
      $pairs[] = 'from_currency=' . $matches[1] . '&to_currency=' . $matches[2];
   }
}

$cm = curl_multi_init();
$cmh = array();

foreach ($pairs as $pair) {
   $h = curl_setup($url . $pair);
   curl_multi_add_handle($cm, $h);
   $cmh[] = $h;
}

$running = false;
do {
   curl_multi_exec($cm, $running);
   curl_multi_select($cm);
} while ($running);

foreach($cmh as $h) {
   $content = curl_multi_getcontent($h);
   $parsed = json_decode($content, true);
   if (!$parsed) continue;

   $name = $parsed['Realtime Currency Exchange Rate']['1. From_Currency Code'] . $parsed['Realtime Currency Exchange Rate']['3. To_Currency Code'];
   $rate = $parsed['Realtime Currency Exchange Rate']['5. Exchange Rate'];
   if ($round) {
      $rate = round((float)$rate, $round);
   }
   echo "${rate},\"${name}=X\"\n";
   
   curl_multi_remove_handle($cm, $h);
}

curl_multi_close($cm);

// ===

function curl_setup($url)
{
   global $proxy_addr, $proxy_user;
   $h = curl_init($url);
   curl_setopt($h, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($h, CURLOPT_HEADER, false);
   curl_setopt($h, CURLOPT_TIMEOUT, 10);
   if ($proxy_addr) curl_setopt($h, CURLOPT_PROXY, $proxy_addr);
   if ($proxy_user) curl_setopt($h, CURLOPT_USERPWD, $proxy_user);
   return $h;
}
?>
  1. Пока что нет комментариев.

*