【PHP】PHPをbatのようにローカルスクリプトとして使う(3)~Curl編(Webアクセス、外部API(HTTP)の利用、JSONデータの活用)~

【ツールの概要】
・世の中に数多あるWebのAPI等にHTTPリクエストを投げることが可能です。
・ここではLinuxではよく使う(?)Curlを、Windows環境上のPHPで実行してデータを取得します。
PHPJSON形式のファイルも簡単に扱えるため、APIを利用した自動化も思いのほか簡単にできます。


【例えばこんな無料APIが】
郵便番号検索API - zipcloud
例:http://zipcloud.ibsnet.co.jp/api/search?zipcode=1600022
都道府県API | 駅データ 無料ダウンロード 『駅データ.jp』
例:http://www.ekidata.jp/api/p/13.json
例:http://www.ekidata.jp/api/l/11301.json
(上記では東京「13」で路線一覧を出して、JR東海道本線(東京~熱海)「11301」で路線の駅名一覧を取得できる。)
他にもGoogleの各種サービス、Yahoo、NHK、路線検索、地図、Twitter、、諸々たくさんサービスがあります。
上記二つは登録不要なので今回サンプルに使います。(他は大体APIキーだったりOAuthだったりの認証がある)


【環境(使っている環境)】
Windows 10 Pro (Serverでも動くはず)
PHP 5.6以降

PHPの設定】
php.iniの以下を変更する。
 ・「;extension=php_curl.dll」→「extension=php_curl.dll」 コメントアウトをなくしてCurlを有効にする。
比較的新しめのPHPならWindowsでも大抵これだけで行けると思います。
コマンドプロンプトで「php -v」と打って、エラーが出なければとりあえずOK。バージョン違う系のエラーが出たらそれを修正。

PHP(実行用PHPファイル(APIkicker.php))】

<?php
require_once(dirname(__FILE__).'./Class_common.php');


// 郵便番号1600022の情報を取得するAPIを叩くURL。参考→http://zipcloud.ibsnet.co.jp/doc/api
$URLString = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=1600022";


// クラスインスタンスの作成。コンストラクト時にURLをインスタンスに格納。
$APIInstance = new GetData($URLString);
$APIResult   = $APIInstance->CurlToZipCode();


// ここからAPIで取得したHTTPリクエストの解析をする。
// Class_Commonで連想配列に格納した値の取得。オブジェクトの要素(address2)へのアクセス時の書き方にも注意。
$code     = json_encode($APIResult["code"]); //echoしたいから文字列にしたい →json_encodeで簡単に
$objBody  = json_decode($APIResult["body"]); //JSON文字列をオブジェクトにしたい →json_decodeで簡単に
$address2 = $objBody->results[0]->address2;


// 出力
echo "\r\n";
echo 'レスポンスコードは '.$code."\r\n";
echo 'address2のなかみは '.$address2."\r\n"."\r\n";
echo "=======var_dump======"."\r\n";
var_dump($objBody);
echo "=======var_dump======"."\r\n";

PHPcurlを実行しAPIからデータを取得するクラスを記載したPHP(Class_common.php))】

<?php
class GetData
{
    // インスタンス変数(url)
    private $url;

    public function __construct($str) {

        // インスタンス化時にインスタンス変数に文字列(URL)を格納。
        $this->url = $str;
    }

    public function CurlToZipCode(){

        // php_curlを利用 参考→https://www.php.net/manual/ja/book.curl.php
        // ここも。https://qiita.com/re-24/items/bfdd533e5dacecd21a7a
        $ch = curl_init();
        // オプション追加の中でAPIのURLを設定。ここでは単純に設定。配列でも可能。→setopt_array
        curl_setopt($ch, CURLOPT_URL, $this->url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true);
        $response    = curl_exec($ch);
        // レスポンスのなかでレスポンスコードと、ヘッダの範囲を調べることによりbodyを得る。
        $code        = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $body        = substr($response, $header_size);
        curl_close($ch);
        // 返り値は連想配列一つにして戻す。
        $return_arr = array('code' => $code);
        $return_arr = array_merge($return_arr, array('body' => $body));
        return $return_arr;
    } 
}


【使用方法】
・それぞれソースをコピペして拡張子を「.php」にして、一緒に「D:\phptest\」とかに保存します。
phpコマンドプロンプトで実行します。 →例:「php D:\phptest\APIKicker.php

【説明】
APIKicker.phpを実行するとClass_common.phpのクラスGetDataのインスタンスを作成し、
CurlToZipCodeメソッドでcurlを実行します。
後は大体コード中のコメントのとおりです。

 <実行イメージ>
 f:id:hagure_m:20190416135400p:plain

【総評】
クラスの簡単な利用もしてみました。
記述量が少ないとあまりうまみもないですが、慣れるためにはいいのかも?
APIも登録必要とかもありますが、非常に有用なものもあり、プログラミングの楽しさが広がること間違いなしです。
自分は楽しいかって・・・いわれると・・・

【参考サイト】
php configuration error – Call to undefined function curl_init() | Expert BOX
https://www.php.net/manual/ja/book.curl.php
【PHP】クラスの基本 | インスタンス | プロパティとメソッド | オブジェクト指向 - Qiita
PHPの「クラス」と「インスタンス」――「オブジェクト指向」の基礎中の基礎 (1/3):Web業界で働くためのPHP入門(13) - @IT
https://www.php.net/manual/ja/ref.json.php