phpでcoingeckoのコイン価格を表示

最近はご依頼作業の中で、暗号通貨に関するものもあり、知識不足からいろいろと勉強しておりますが、専門用語が多く情報が早いのでついていくのが難しいですね。

ただ、作業内容自体はPHPを使ってapiを拾って、表示させて・・といった以前あった天気予報の取得部分を作るような作業なので、ひとまず暗号通貨の専門的な知識はあまり必要ないのかもしれません。

で、本題になりますが、暗号通貨のコインやトークンなどの価格やチャートを提供するサイトに、coingekocoinmarketcapなどがありますが、ここにある膨大な数のコインやトークンの価格のうち、調べたいものだけをapiで取り出し、且つ保有中のコインやトークンの数で掛け合わせて日本円の現在の価格を知る。ためだけのPHPプログラムを考えてみます。

coingeckoのapiを調べる

まず現在価格を調べるapiを直接たたいてみます。
https://api.coingecko.com/api/v3/simple/price?ids=APIid&vs_currencies=jpy
から表示されますが、idsの部分に調べたいコインのIDを入れます。

例えばリップルを調べたい場合は、リップルのページにあるAPIidを確認します(コインやトークンごとに付けられた固有ID)

これを使って、さきほどのidsの部分に差し込みます。
https://api.coingecko.com/api/v3/simple/price?ids=ripple&vs_currencies=jpy

ちなみに、vs_currencies=jpyは、日本円に変換するオプションなので、他の通貨にしたいときはvs_currencies=usdなどのようにできます。今回は日本円なのでそのままにしておきます。
下記のようにリップルの日本円の価格がJSON形式で表示されました。

{"ripple":{"jpy":108.44}}

では、複数のコインの価格を取り出したい時はどうすべきでしょうか。
こちらも簡単ですが、ids=bitcoin,ethereum,rippleのようにカンマ区切りで追加するだけです。
https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum,ripple&vs_currencies=jpy

{"bitcoin":{"jpy":5037394},"ethereum":{"jpy":352127},"ripple":{"jpy":108.63}}

phpでそれぞれの所持数で表示させる

上記までJSON形式で複数の価格を取り出せることが分かったので、あとはPHPでそれぞれの所持数を掛け算させて一覧表示させるだけですが、配列にコイン名と所持数を変更するだけで取得できるようにしておきます。
それぞれ$coins=[]の配列でapiIDと所持数をカンマ区切りで記載していくだけで、複数のコインを一覧表示できますので、適時変更してください。

<?php

//コイン名(apiID)と所持数を配列に格納
//["apiID1","所持数1"],["apiID2","所持数2"],

$coins = [
["bitcoin",0.0001],
["ethereum",0.001],
["tether",10],
["cardano",10],
["binancecoin",0.1],
["game-x-change",100],
["cerealia",1000],
["888-infinity",100000],
["seachain",100000],
["green-energy-coin",10]
];

//コイン名(apiID)をカンマ区切りで$idsに連結
for ($i=0;$i<count($coins);$i++){
$ids .= $coins[$i][0] . ",";
}

//apiコール
$json = file_get_contents("https://api.coingecko.com/api/v3/simple/price?ids=".$ids."&vs_currencies=jpy");

//jsonデコード
$prices = json_decode($json);

print <<<EOF
<!DOCTYPE html>
<html lang="ja">
<head><meta charset=utf-8></head>
<body>

※coingecko掲載のコインの所持数・価格表示のデモ<br>
所持コイン・所持数は表示サンプル用なので適当です<hr>

EOF;


//それぞれの所持数で価格を取得
foreach ($coins as list($coin_name, $coin_value)) {

//単価を取得
$price = $prices->$coin_name->{'jpy'};

//単価×所持数で所持価格を取得(小数点以下四捨五入)
$price = round(sprintf('%F', floatval($price*$coin_value)));

//coingeckohへのリンク作成
$url = "https://www.coingecko.com/en/coins/". $coin_name;

//coingekoへのリンクと所持数・所持価格をHTML表示
print "<a href=" . $url . ">" . $coin_name ."</a> x (" . $coin_value . ")" . "=<b>" . $price . "</b>yen<br>";

}

print <<<EOF
</body></html>
EOF;

?>

サンプル
https://hirae.com/coingecko.php