Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

追記

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


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

コードのみ知りたい方

$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の利用法

まず、前提として株に関する知識はあるものとして話を進めて行きます。
(もし、ご存知ない方はこちらのサイトを見てみるか、ご自身でお調べください)
今回の肝となる最新株価をどこから取ってくるかと言うと、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
https://www.google.com/finance/getprices?p=1d&i=300&x=TYO&f=c&q=9433

cURL関数を使ってデータを取得する

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

$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);

株価が昇順で並べられており、一番最後の数字が最新の株価です。

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関数を使います。
出力結果は配列となります。

$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関数を使います。

$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によれば

array_slice() はデフォルトで配列の数値キーを並べなおし、 リセットすることに注意してください。 preserve_keys*1 を TRUE にする事でこの動作を変更することができます。
*1 筆者注:第四引数のこと

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

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

$stockPrice = current(array_slice($stockPrice, -2, 1, true));
echo $stockPrice;
//3128

まとめ

APIの「q = 証券コード」の部分に変数を入れる事も出来ます。

$code = 得たい株価の企業の証券コード
https://www.google.com/finance/getprices?&x=TYO&i=300&p=1d&f=c&q=$code

したがって、こんな感じで関数を作ることが可能です。

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

  1. 私は短期売買をしたことがほぼ無いので、5分足はそんなに使わないかもしれませんが、各証券会社が設定しているチャートで最も短い単位なので採用しました。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away