【PHP】じぶんコインAPI入門編②

じぶんコインAPI入門編②

じぶんコインAPI入門編①ではコインの枚数取得まで実践しましたので、残りのAPIもサクッとテストしていきたいと思います。今回は文字列の取得もあるのでチェックを少し工夫する必要があるかなぁとは予測してます。

テスト環境

テスト環境は前回と同じですね。念の為、記載しておきます。使い方のおさらいをしながらテストしていきましょう。

■現在のテスト環境
MANP 5.2
WordPress 4.9.8
PHP 7.2.10
MySQL

■テストソース配置場所
/Applications/MANP/htdocs/phptest
■用意したテストソース
index.html
coinMax.php : コインの総発行枚数
coinPer.php : コインのパーセンテージ
coinValue.php : コインの価値
bending.php : 自販機一覧
coinInfo.php : コインの基本情報

テストリンクの用意

まずは、index.htmlに今回作成するリンクを追加しておきます。

<html>
    <head>
        <title>PHP Test</title>
    </head>
    <body>
        <a href="./helloworld.php">Hello World</a><br>
        <a href="./coinCount.php">coinCount</a><br>
        <!--以下が今回追加したテストリンク-->
        <a href="./coinMax.php">coinMax</a><br>
        <a href="./coinPer.php">coinPer</a><br>
        <a href="./coinValue.php">coinValue</a><br>
        <a href="./bending.php">bending</a><br>
        <a href="./coinInfo.php">coinInfo</a><br>
    </body>
</html>

「コインの総発行枚数」の取得


がんばる(coinID:ganbarumasu0525)が発行したがんばるコイン(userID:ganbarumasu0525)の総発行枚数を取得してみましょう。これは枚数を取得したときとほぼ同じものが使いまわせそうですね。

coinMax.php

<html>
    <head>
        <title>coinMax</title>
    </head>
    <body>
        <?php 
            //今回からIDとか変数に変えておきましょう。次回くらいからフォーム間のデータ受け渡しに挑戦してみたいと思います。
            $coinID = "ganbarumasu0525";
            $url = "https://crypto-app.tokyo/qCoin/api/api.php?type=coinMax&coinID=".$coinID;
            
            //cURLのセッション初期化
            $ch = curl_init();

            // オプションを設定(コメントはPHPのリファレンスから引用)
            // 取得する URL 。curl_init() でセッションを 初期化する際に指定することも可能です。
            curl_setopt($ch, CURLOPT_URL, $url); 
            // TRUE を設定すると、curl_exec() の返り値を 文字列で返します。通常はデータを直接出力します。
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            //FALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

            //値の取得
            $coinMax = curl_exec($ch);
            
            //test用
            //$coinCount = "test";
            //$coinCount = null;
            
            //値のチェック
            if(is_numeric($coinMax)){
                echo "<p>現在がんばるが発行したがんばるコインの総枚数は".$coinMax."枚くらいです!</p>";
            }else{
                echo "<p>なんか値がちゃんと取得できてねぇっす!</p>";
            }
            
            curl_close($conn);
        ?> 
    </body>
</html>

よーしうまくとれてますね。ついでに本当にこの数値が正しいのかも確認。

あってますね〜大丈夫。

「コインのパーセンテージ」の取得


がんばる(coinID:ganbarumasu0525)が保持するがんばるコイン(userID:ganbarumasu0525)が総発行枚数の何パーセントか取得してみましょう。これもほぼ同じものが使いまわせそうですね。ただ、小数点以下も結構取得できるので小数第2以下は四捨五入にでもしておきます。

<html>
    <head>
        <title>coinPer</title>
    </head>
    <body>
        <?php 
            //これも引数を変数に変えておきましょう。
            $userID = "ganbarumasu0525";
            $coinID = "ganbarumasu0525";
            $url = "https://crypto-app.tokyo/qCoin/api/api.php?type=coinPer&userID=".$userID."&coinID=".$coinID;
            
            //cURLのセッション初期化
            $ch = curl_init();

            // オプションを設定(コメントはPHPのリファレンスから引用)
            // 取得する URL 。curl_init() でセッションを 初期化する際に指定することも可能です。
            curl_setopt($ch, CURLOPT_URL, $url); 
            // TRUE を設定すると、curl_exec() の返り値を 文字列で返します。通常はデータを直接出力します。
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            //FALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

            //値の取得
            $coinPer = curl_exec($ch);
            
            //test用
            //$coinCount = "test";
            //$coinCount = null;
            
            //値のチェック
            if(is_numeric($coinPer)){
                echo "<p>現在がんばるが保持するがんばるコインの持ちコイン比率は".round($coinPer, 2)."%です!</p>";
            }else{
                echo "<p>なんか値がちゃんと取得できてねぇっす!</p>";
            }
            
            curl_close($conn);
        ?> 
    </body>
</html>

ちゃんと取得できてます、おっけーですね!計算もしてみましたが正しい数値が返ってきているようです(計算式:現在の保持枚数/総発行枚数*100)

「コインの価値」の取得

ここまで数値の取得ばかりだったのですが次からは文字列の取得になります。ここは慎重に取得しないとダメですね。最低ラインとしてタグのエスケープとかかなぁ。多分、どこでも多用されてそうなので調べてみます。おぉ、神のようなまとめ方をされている人がたくさんいますね。それをパクりつつ。いくつかのパターンで出力を確認してみました。

 <html>
    <head>
        <title>coinValue</title>
    </head>
    <body>
        <?php 
            //これも引数を変数に変えておきましょう。
            $coinID = "ganbarumasu0525";
            $url = "https://crypto-app.tokyo/qCoin/api/api.php?type=coinValue&coinID=".$coinID;
            
            //cURLのセッション初期化
            $ch = curl_init();

            // オプションを設定(コメントはPHPのリファレンスから引用)
            // 取得する URL 。curl_init() でセッションを 初期化する際に指定することも可能です。
            curl_setopt($ch, CURLOPT_URL, $url); 
            // TRUE を設定すると、curl_exec() の返り値を 文字列で返します。通常はデータを直接出力します。
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            //FALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

            //値の取得
            //何も処理しない場合
            $coinValue1 = curl_exec($ch);
            //htmlentities — 適用可能な文字を全て HTML エンティティに変換する
            $coinValue2 = htmlentities(curl_exec($ch));
            //strip_tags — 文字列から HTML および PHP タグを取り除く
            $coinValue3 = strip_tags(curl_exec($ch));
            
            echo "coinValu1<br><p>がんばるが提供する価値<br>".$coinValue1."</p><br>";
            echo "coinValu2<br><p>がんばるが提供する価値<br>".$coinValue2."</p><br>";
            echo "coinValu3<br><p>がんばるが提供する価値<br>".$coinValue3."</p><br>";
            
            curl_close($conn);
        ?> 
    </body>
</html>

まず何もしない場合はふつうにじぶんコインの画面でみるのと同じように表示されました。タグも正常に処理されてる感じですね。

htmlentitiesで処理した場合はタグが文字列として処理されてますね。改行とかもなくなりました。

strip_tagsで処理した場合はタグが除去されて処理されてますね。私が今回求めてた処理はこれかなぁと思ってます。

文字列の処理は他にもたくさんありそうなので状況に応じて処理していけたらいいかなぁと思います。

「自販機一覧」の取得

さて次も新しい処理の方法です!タブ区切りのCSV処理!テキスト処理って頻繁に利用するので是非とも覚えておきたいです。それでは早速。一度改行コードで分割して、さらにタブで分割すると要素ごとに取得できるのかな?なんか無駄なことしてる気もするけど、、、ファイルだったら一行ごとに読み込んでタブで分割するんだけどAPIで一気に取得できてしまうからこういう処理になるのが適当なのかな?、、、、わからん。

<html>
    <head>
        <title>bending</title>
    </head>
    <body>
        <?php 
            //これも引数を変数に変えておきましょう。
            $coinID = "ganbarumasu0525";
            $url = "https://crypto-app.tokyo/qCoin/api/api.php?type=bending&coinID=".$coinID;
            
            //cURLのセッション初期化
            $ch = curl_init();

            // オプションを設定(コメントはPHPのリファレンスから引用)
            // explode — 文字列を文字列により分割する
            curl_setopt($ch, CURLOPT_URL, $url); 
            // TRUE を設定すると、curl_exec() の返り値を 文字列で返します。通常はデータを直接出力します。
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            //FALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

            //値の取得
            //explode — 文字列を文字列により分割する
            //改行区切りで分割
            $bending = explode("\n",curl_exec($ch));

            //test
            //$bending = null;
            
            if(!($bending === null)){
                //配列っぽいのでそれを全出力
                foreach ($bending as &$b) {
                    //さらに行ごとにタブ区切りを分割
                    $o = explode("\t",$b);
                    echo "自販機名:".$o[0].",URL:".$o[1]."<br>";
                }
            }else{
                echo "<p>なんか値がちゃんと取得できてねぇっす!</p>";
            }
            
            curl_close($conn);
        ?> 
    </body>
</html>

正しい値が取得できました。これで要素ごとの加工とかもできそうですね。

「コインの基本情報」の取得

では最後にコインの基本情報を取得しましょう。これも新しい形式での取得ですね。JSON形式は非常に扱いやすいので絶対に覚えておきたいです。

<html>
    <head>
        <title>coinInfo</title>
    </head>
    <body>
        <?php 
            //これも引数を変数に変えておきましょう。
            $coinID = "ganbarumasu0525";
            $url = "https://crypto-app.tokyo/qCoin/api/api.php?type=coinInfo&coinID=".$coinID;
            
            //cURLのセッション初期化
            $ch = curl_init();

            // オプションを設定(コメントはPHPのリファレンスから引用)
            // explode — 文字列を文字列により分割する
            curl_setopt($ch, CURLOPT_URL, $url); 
            // TRUE を設定すると、curl_exec() の返り値を 文字列で返します。通常はデータを直接出力します。
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            //FALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

            //値の取得
            //json_decode — JSON 文字列をデコードする
            //TRUE の場合、返されるオブジェクトは連想配列形式になります。
            $coinInfo = json_decode(curl_exec($ch),true);
            
            echo "coinName:";
            echo $coinInfo["coinName"]."<br>";
            echo "unit:";
            echo $coinInfo["unit"]."<br>";
            echo "totalCount:";
            echo $coinInfo["totalCount"]."<br>";
            echo "userName:";
            echo $coinInfo["userName"]."<br>";  
            
            curl_close($conn);
        ?> 
    </body>
</html>

おぉいい感じに取得できました!正しく値がとれると楽しいですね。

感想

一通りテストしてみて色々できそうだなぁと感じました。この結果を元にブログに値を反映させられたら面白そうですね。実験を繰り返しながらWebの勉強をしていきたいと思います。次回はJavaScriptとかに挑戦してコインIDとか入力できるようにしたいですね。

コメント