「IIJmioクーポンスイッチAPI」というものが公開された。
AndroidアプリからこのAPIを使う、というのが想定されている使われ方だと思うんですが、違う使い方をしてみた。
というのは、「データ利用量照会」という機能を見つけ、これを利用すれば1年分のデータ使用量グラフが作れる、と思ったからです。
幸い、常時起動のサーバがあるので、そいつに仕込めばいいか、と、やってみました。
現在SIMを4枚もっているので、こんなグラフになっています。
メインで使ってるのがSIM2、SIM4はSMS対応のものでテストに使用。
SIM3はうちの奥さんに渡しているもの、SIM1は実家においてあるルータ、という感じです。
さて、このグラフ作るまでに行ったことですが、まず最初はアクセストークン取得です。
いろいろ悩んだんですが、適当な手法をとっています。
まず、redirect_uriとして適当なCGIを作りました。
#!/usr/bin/perl print "Content-Type: text/plain; charset=UTF-8\n\n"; print "test\n";
えぇ、適当過ぎますね。
そして、普通のHTMLを作ります。
<html> <head> <title>iijmio</title> </head> <body> <a href="https://api.iijmio.jp/mobile/d/v1/authorization/?response_type=token&client_id=<DeveloperID>&state=test&redirect_uri=http%3A%2F%2F~.osakana.net%2Ftest.cgi">go to IIJMIO</a> </body> </html>
redirect_uriには、先ほど作成した適当なCGIのアドレスを記載します。
ブラウザで作成したhtmlにアクセスし、IIJmioの認証を行い、正常に通ると、redirect_uriに指定したURLに対して、戻ってきます。
ブラウザのURL欄に表示された文字列から「access_token=~」という記述を見つけ、アクセストークンを取得します。
ちなみに、このアクセストークン、7776000秒有効です。つまり90日間です。
IIJmio側に30日分のデータが保管されているので120日以内に1回手動で更新すればいいか、と考え、テキトーな実装になっています。
次に、利用量取得のperlスクリプト作成。
#!/usr/bin/perl use strict; use warnings; use LWP; use URI::Escape; use JSON; use Time::Local; my $lwpua = LWP::UserAgent->new; my $url="https://api.iijmio.jp/mobile/d/v1/log/packet/"; my $developerid="<DeveloperID>"; my $usertoken ="<アクセストークン>"; my $lwpreq = HTTP::Request->new(GET => "$url"); $lwpreq->header("X-IIJmio-Developer" => "$developerid"); $lwpreq->header("X-IIJmio-Authorization" => "$usertoken"); my $lwpres= $lwpua->request($lwpreq); my $data = decode_json($lwpres->content); for(my $i=0;$i<@{$data->{packetLogInfo}};$i++){ #print $i . ":" . $data->{packetLogInfo}->[$i]->{hddServiceCode} ."\n"; my $hddServiceCode=$data->{packetLogInfo}->[$i]->{hddServiceCode}; for(my $j=0;$j<@{$data->{packetLogInfo}->[$i]->{hdoInfo}};$j++){ #print $i . "-" . $j . ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{hdoServiceCode} . "\n"; my $hdoServiceCode=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{hdoServiceCode}; if(! -f "$hdoServiceCode.rrd"){ print "rrdtool create $hdoServiceCode.rrd --start 1384786740 --step 86400 DS:withCoupon:GAUGE:86400:0:U DS:withoutCoupon:GAUGE:86400:0:U RRA:LAST:0.5:1:100000 \n"; system("rrdtool create $hdoServiceCode.rrd --start 1384786740 --step 86400 DS:withCoupon:GAUGE:86400:0:U DS:withoutCoupon:GAUGE:86400:0:U RRA:LAST:0.5:1:100000"); } for(my $k=0;$k<@{$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}};$k++){ #print " " . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{date} ; #print ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withCoupon} ; #print ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withoutCoupon} ; #print "\n"; my $d=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{date}; my $year = substr($d,0,4); my $mon = substr($d,4,2) - 1; my $mday = substr($d,6,2); my $unixtime = timelocal(0,59,23,$mday,$mon,$year); my $withCoupon=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withCoupon}; my $withoutCoupon=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withoutCoupon}; print "rrdtool update $hdoServiceCode.rrd $unixtime:$withCoupon:$withoutCoupon \n"; system("rrdtool update $hdoServiceCode.rrd $unixtime:$withCoupon:$withoutCoupon"); } } }
これを「get.pl」というファイル名で保存します。
実行すると、「hdo810xxxxx.rrd」というような感じのファイルがSIMカード分作成されます。
なお、手抜きをしているので、2回目以降は、同じ値を入力しようとし、「ERROR: hdo8371xxxx.rrd: illegal attempt to update using time 1387378740 when last update time is 1387378740 (minimum one second step)」みたいなエラーがでてしまいますが、仕様です。
また、rrdtoolは一度登録した情報の更新ができない構造をしているので、日付が変わる直前に実行することを推奨します。
で・・・グラフ作成は以下の様な感じで、情報取得と連続で行わせています。
現在SIMが4枚あるので、4枚分を集計しています。
クーポン使用の有無は区別せず合算としています。
#!/bin/bash cd /home/~/mio ./get.pl rrdtool graph iijmio-use.png --imgformat=PNG --end now --start end-1months \ --vertical-label "MB" \ --title="IIJmioの使用量" \ DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \ DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \ DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \ DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \ DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \ DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \ DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \ DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \ CDEF:SIM1=SIM1C,SIM1N,+ \ CDEF:SIM2=SIM2C,SIM2N,+ \ CDEF:SIM3=SIM3C,SIM3N,+ \ CDEF:SIM4=SIM4C,SIM4N,+ \ LINE1:SIM1#0000FF:"SIM1" \ LINE2:SIM2#00FFFF:"SIM2" \ LINE3:SIM3#00FF00:"SIM3" \ LINE4:SIM4#F00F00:"SIM4"
で、これをサーバのcrontabに突っ込んで、23:58に実行する設定しました。
さて、これでちゃんと更新し続けてくれるといいのですが・・・
APIが公開されて速攻作成&記事公開したところ、IIJmioの人に発見された模様。
みおぽんAPIを使って日次の利用のグラフを作成しているブログ記事のご紹介です。第一号なので特別にご紹介します。IIJmioクーポンスイッチAPIを使って使用量グラフ作成 http://t.co/Qry5exnNcH @osakanataroさんから
— IIJmio (@iijmio) 2013年12月18日
2013/12/24追記
しばらく運用してみた結果、見にくかったので、グラフ作成については、以下の様に変更した。
rrdtool graph iijmio-use.png --imgformat=PNG \ --height=300 \ --lower-limit=0 \ --end now --start end-1months \ --vertical-label "MB" \ --title="IIJmioの使用量" \ DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \ DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \ DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \ DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \ DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \ DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \ DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \ DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \ CDEF:SIM1=SIM1C,SIM1N,+ \ CDEF:SIM2=SIM2C,SIM2N,+ \ CDEF:SIM3=SIM3C,SIM3N,+ \ CDEF:SIM4=SIM4C,SIM4N,+ \ LINE2:SIM1#0000FF:"SIM1" \ LINE2:SIM2#00FFFF:"SIM2" \ LINE2:SIM3#00FF00:"SIM3" \ LINE2:SIM4#F00F00:"SIM4"
「LINE数字:~」の数字部分の意味を取り違えていたという・・・太さの意味だったか・・・
2014/12/19追記
作ってから約1年が経過しました。
最近はこんなグラフにしています。(横軸のめもりを日付にした)
rrdtool graph iijmio-use.png --imgformat=PNG \ --height=300 \ --lower-limit=0 \ --end now --start end-2months \ --vertical-label "MB" \ --x-grid DAY:1:WEEK:1:WEEK:1:0:%m/%d \ --title="IIJmioの使用量" \ DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \ DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \ DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \ DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \ DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \ DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \ DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \ DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \ CDEF:SIM1=SIM1C,SIM1N,+ \ CDEF:SIM2=SIM2C,SIM2N,+ \ CDEF:SIM3=SIM3C,SIM3N,+ \ CDEF:SIM4=SIM4C,SIM4N,+ \ LINE2:SIM1#0000FF:"SIM1" \ LINE2:SIM2#00FFFF:"SIM2" \ LINE2:SIM3#00FF00:"SIM3" \ LINE2:SIM4#F00F00:"SIM4"
そして、1年分
rrdtool graph iijmio-use-year.png --imgformat=PNG \ --height=300 \ --width=600 \ --lower-limit=0 \ --end now --start end-14months \ --vertical-label "MB" \ --x-grid WEEK:1:MONTH:1:MONTH:1:0:%m/%d \ --title="IIJmioの1年分使用量" \ DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \ DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \ DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \ DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \ DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \ DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \ DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \ DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \ CDEF:SIM1=SIM1C,SIM1N,+ \ CDEF:SIM2=SIM2C,SIM2N,+ \ CDEF:SIM3=SIM3C,SIM3N,+ \ CDEF:SIM4=SIM4C,SIM4N,+ \ LINE2:SIM1#0000FF:"SIM1" \ LINE2:SIM2#00FFFF:"SIM2" \ LINE2:SIM3#00FF00:"SIM3" \ LINE2:SIM4#F00F00:"SIM4"
おまけ:上記のグラフの利用率変動の解説。
SIM1はミニマムスタートプラン、SIM2/3/4はファミリーシェアプランで、SIM3はmicroSIM、SIM4はnanoSIM/SMS付。
・2013/12頃
メイン機CP-D02:SIM2
偽iPhone5s(Thunderbird i5s):SIM4
奥さんのP-01D:SIM3
奥さん実家の緊急用ルータ:SIM1
・2014/01頃
ほとんど使用されていないSIM1の容量がもったいないので入れ替え
メイン機CP-D02:SIM2→SIM1
奥さん実家の緊急用ルータ:SIM1→SIM2
偽iPhone5s(Thunderbird i5s):SIM4
奥さんのP-01D:SIM3
・2014/02頃の変更点
Thunderbid i5sの液晶を割ったので余ったSMS付SIM4をメイン機へ
メイン機CP-D02:SIM1→SIM4
奥さん実家の緊急用ルータ:SIM2
奥さんのP-01D:SIM3
・2014/03頃の変更点
Covia CP-F03aが来たのでがんばって使用開始。
それに伴い余剰になったCovia CP-D02を奥さんのに充当
メイン機CP-F03a:SIM4 & SIM1
奥さん実家の緊急用ルータ:SIM2
奥さんのCP-D02:SIM3
・2014/06頃の変更点
JIAYU F1購入。使い勝手が良かったので、メイン機に変更。
メイン機JIAYU F1:SIM4
予備機CP-F03a:SIM1
奥さん実家の緊急用ルータ:SIM2
奥さんのCP-D02:SIM3
・2014/11頃の変更点
GMOBBのWiMAXを使い始めたのでメイン機SIM4の使用量低下
・2014/12頃の変更点
自宅のフレッツが微妙に不安定なことが多いので、奥さんCP-D02のWiFiをオフにしてみた。
利用させていただいています。
ところで、API取得の値(JSONの値)は143MB/dayの日があるのですが、グラフにすると98MB/day
になっています。そちらではどうでしょうか?
該当rrdtool update行
rrdtool update hdonnnnnnnnn.rrd 1398005940:143:0
ちわっす。
うちも、iijmio使い始めたのですが、トークン取得用のリダイレクト先として、
https://gist.github.com/konishika/135e009a1bbc0b34496077bb459d69bc
こんなhtmlを指定すると、ブラウザのURL欄を見なくていいので、少し楽になります。
あー、なるほど。
JavaScriptで見ればよかったのか。
参考になります。