【PHP】Google Financeを使って最新の株価を取得する　※2018年8月5日現在、利用不可

# 追記
**Google FinanceのAPIの仕様変更により、2018年8月5日現在利用出来ません。**
**初学者の私にとって勉強になったコードなので、一応残したいのですが、削除した方が良ければコメント下さい。削除致します。**

---

この記事では、タイトルにもあるようにGoogle Financeを利用して最新の株価を取得出来るTIPSを記します。
まだ手探りで学び始めたばかりなので、用語の使い方の間違い等ありましたら、ご指摘お願いします。
**※この記事で出てくるKDDIの株価は、2018年7月27日現在のものです**

# コードのみ知りたい方
```php
$code = 得たい株価の企業の証券コード
$url = "https://www.google.com/finance/getprices?&x=TYO&i=300&p=1d&f=c&q=$code";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);

$stockPrice = explode("\n", $html);
$stockPrice = current(array_slice($stockPrice, -2, 1, true));
echo $stockPrice;
//株価の出力
```
以下、解説していきます。

# Google FinanceのAPIの利用法
まず、前提として株に関する知識はあるものとして話を進めて行きます。
（もし、ご存知ない方は[こちらのサイト](https://minkabu.jp/beginner/lesson/index.html)を見てみるか、ご自身でお調べください）
今回の肝となる最新株価をどこから取ってくるかと言うと、Google FinanceのAPIを利用します。
こちらは非公式のAPIです。なので、公式ドキュメントがありません。


例えば、KDDIの株価を1日単位で1年分取ってくる場合、以下のようにAPIを叩きます。
https://www.google.com/finance/getprices?p=1Y&i=86400&x=TYO&f=c&q=9433
軽い解説をしますと、
p = データの取得期間・Yは年、dは日単位
i = 取得データの間隔・秒単位で指定
x = 取引所・TYOは東証・地方取引所は恐らく指定不可
f = 取得する系列の指定・d:時間　o:始値　c:終値　l:安値　h:高値　v:出来高・今回は最新の株価を知りたいのでcのみ指定
q = 証券コード
と、なっています。

今回は、短期売買でよく使われる5分単位で取得してみます。[^1]
[^1]: 私は短期売買をしたことがほぼ無いので、5分足はそんなに使わないかもしれませんが、各証券会社が設定しているチャートで最も短い単位なので採用しました。
https://www.google.com/finance/getprices?p=1d&i=300&x=TYO&f=c&q=9433

# cURL関数を使ってデータを取得する
次のステップとして、cURL関数を利用してデータを取得します。
cURL関数に関して、全く知識が無かったので[こちらのqiitaの記事](https://qiita.com/wanwanland/items/a5f9574fadd214d7b5c8)を参考にしました。
(ようするにコピペです。頑張って勉強します。)

```php
$url = "https://www.google.com/finance/getprices?&x=TYO&i=1800&p=2d&f=c&q=9433";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  //オプションとして返り値を文字列にする
$html =  curl_exec($ch);
curl_close($ch);
```
株価が昇順で並べられており、一番最後の数字が最新の株価です。

```php
var_dump($html);
//string(467) "EXCHANGE%3DTYO MARKET_OPEN_MINUTE=540 MARKET_CLOSE_MINUTE=900 INTERVAL=300 COLUMNS=CLOSE DATA_SESSIONS=[MORNING,540,690],[AFTERNOON,750,900] DATA= TIMEZONE_OFFSET=540 3108 3123 3120 3120 3117 3118 3117 3117 3113 3114 3115 3117 3115 3118 3117 3118 3123 3125 3125 3123 3122 3123 3125 3119 3113 3113 3114 3113 3115 3116 3113 3114 3113 3115 3116 3116 3115 3115 3114 3113 3115 3113 3113 3115 3115 3115 3114 3119 3119 3118 3119 3121 3121 3121 3122 3120 3121 3121 3121 3128 "
```
ただ、これだけではまともなデータとして扱えず、整形する必要があります。

# データを整形する
まず、改行毎に分割するためにexplode関数を使います。
出力結果は配列となります。

```php
$stockPrice = explode("\n", $html);
var_dump($stockPrice);
//array(69) { [0]=> string(14) "EXCHANGE%3DTYO" [1]=> string(22) "MARKET_OPEN_MINUTE=540" [2]=> string(23) "MARKET_CLOSE_MINUTE=900"...
//~中略~
//...[64]=> string(4) "3121" [65]=> string(4) "3121" [66]=> string(4) "3121" [67]=> string(4) "3128" [68]=> string(0) "" }
```
次に新しい株価を取得したいので、配列の一部を展開するarray_slice関数を使います。

```php
$stockPrice = array_slice($stockPrice, -2, 1, true);
var_dump($stockPrice);
//array(1) { [67]=> string(4) "3128" }
```
これは引数が多く、ぱっと見で分からないかもしれませんので、軽く解説します。
array_slice関数は、以下のように引数を設定します。
`array_slice(対象の配列, 取得する値の開始位置, 取得数, true)`
先ほどのexplode関数で`$html`を配列化したので、こちらを第一引数にします。
次に`var_dump($stockPrice);`の出力結果を見ていただければ分かると思いますが、最新株価は最後から2番目に位置しています。なので、ここでは`-2`とします。
そして取得数は一つで良いので第三引数を`1`にして、最後に`true`を設定します。
この`true`は何かと言うと、[PHP manual](http://php.net/manual/ja/function.array-slice.php)によれば
>array_slice() はデフォルトで配列の数値キーを並べなおし、 リセットすることに注意してください。 preserve_keys*1 を TRUE にする事でこの動作を変更することができます。
*1　筆者注:第四引数のこと

ということらしいです。必ず設定しましょう。

最後に、current関数を使います。
今のままだと、添字を付けなければ`echo`で出力できません。
添字の数字が分からないと、株価を取得出来ないという事です。
したがって、配列内の現在の要素を取得するcurrent関数を利用します。

```php
$stockPrice = current(array_slice($stockPrice, -2, 1, true));
echo $stockPrice;
//3128
```
# まとめ
APIの「q = 証券コード」の部分に変数を入れる事も出来ます。

```php
$code = 得たい株価の企業の証券コード
https://www.google.com/finance/getprices?&x=TYO&i=300&p=1d&f=c&q=$code
```
したがって、こんな感じで関数を作ることが可能です。

```php
function getStockPrice($code){
      $url = "https://www.google.com/finance/getprices?&x=TYO&i=1800&p=2d&f=c&q=$code";
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      $html =  curl_exec($ch);
      curl_close($ch);

      $stockPrice = explode("\n", $html);
      return current(array_slice($stockPrice, -2, 1, true));
    }
echo getStockPrice(9433);  //KDDIの証券コード
//3128
```