「IIJmioクーポンスイッチAPI 」というものが公開された。
AndroidアプリからこのAPIを使う、というのが想定されている使われ方だと思うんですが、違う使い方をしてみた。
というのは、「データ利用量照会」という機能を見つけ、これを利用すれば1年分のデータ使用量グラフが作れる、と思ったからです。
幸い、常時起動のサーバがあるので、そいつに仕込めばいいか、と、やってみました。
まずは、完成品をご覧ください。
現在SIMを4枚もっているので、こんなグラフになっています。
メインで使ってるのがSIM2、SIM4はSMS対応のものでテストに使用。
SIM3はうちの奥さんに渡しているもの、SIM1は実家においてあるルータ、という感じです。
さて、このグラフ作るまでに行ったことですが、まず最初はアクセストークン取得です。
いろいろ悩んだんですが、適当な手法をとっています。
まず、redirect_uriとして適当なCGIを作りました。
2
print "Content-Type: text/plain; charset=UTF-8\n\n";
えぇ、適当過ぎますね。
そして、普通のHTMLを作ります。
redirect_uriには、先ほど作成した適当なCGIのアドレスを記載します。
ブラウザで作成したhtmlにアクセスし、IIJmioの認証を行い、正常に通ると、redirect_uriに指定したURLに対して、戻ってきます。
ブラウザのURL欄に表示された文字列から「access_token=~」という記述を見つけ、アクセストークンを取得します。
ちなみに、このアクセストークン、7776000秒有効です。つまり90日間です。
IIJmio側に30日分のデータが保管されているので120日以内に1回手動で更新すればいいか、と考え、テキトーな実装になっています。
次に、利用量取得のperlスクリプト作成。
9
my $lwpua = LWP::UserAgent->new;
13
my $developerid="<DeveloperID>";
14
my $usertoken ="<アクセストークン>";
16
my $lwpreq = HTTP::Request->new(GET => "$url");
17
$lwpreq->header("X-IIJmio-Developer" => "$developerid");
18
$lwpreq->header("X-IIJmio-Authorization" => "$usertoken");
19
my $lwpres= $lwpua->request($lwpreq);
20
my $data = decode_json($lwpres->content);
22
for(my $i=0;$i<@{$data->{packetLogInfo}};$i++){
23
#print $i . ":" . $data->{packetLogInfo}->[$i]->{hddServiceCode} ."\n";
24
my $hddServiceCode=$data->{packetLogInfo}->[$i]->{hddServiceCode};
26
for(my $j=0;$j<@{$data->{packetLogInfo}->[$i]->{hdoInfo}};$j++){
27
#print $i . "-" . $j . ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{hdoServiceCode} . "\n";
28
my $hdoServiceCode=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{hdoServiceCode};
29
if(! -f "$hdoServiceCode.rrd"){
30
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";
31
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");
35
for(my $k=0;$k<@{$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}};$k++){
36
#print " " . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{date} ;
37
#print ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withCoupon} ;
38
#print ":" . $data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withoutCoupon} ;
40
my $d=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{date};
41
my $year = substr($d,0,4);
42
my $mon = substr($d,4,2) - 1;
43
my $mday = substr($d,6,2);
44
my $unixtime = timelocal(0,59,23,$mday,$mon,$year);
45
my $withCoupon=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withCoupon};
46
my $withoutCoupon=$data->{packetLogInfo}->[$i]->{hdoInfo}->[$j]->{packetLog}->[$k]->{withoutCoupon};
47
print "rrdtool update $hdoServiceCode.rrd $unixtime:$withCoupon:$withoutCoupon \n";
48
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枚分を集計しています。
クーポン使用の有無は区別せず合算としています。
4
rrdtool graph iijmio-use.png --imgformat=PNG --end now --start end-1months \
7
DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \
8
DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \
9
DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \
10
DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \
11
DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \
12
DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \
13
DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \
14
DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \
15
CDEF:SIM1=SIM1C,SIM1N,+ \
16
CDEF:SIM2=SIM2C,SIM2N,+ \
17
CDEF:SIM3=SIM3C,SIM3N,+ \
18
CDEF:SIM4=SIM4C,SIM4N,+ \
19
LINE1:SIM1#0000FF:"SIM1" \
20
LINE2:SIM2#00FFFF:"SIM2" \
21
LINE3:SIM3#00FF00:"SIM3" \
22
LINE4:SIM4#F00F00:"SIM4"
で、これをサーバのcrontabに突っ込んで、23:58に実行する設定しました。
さて、これでちゃんと更新し続けてくれるといいのですが・・・
APIが公開されて速攻作成&記事公開したところ、IIJmioの人に発見された模様。
2013/12/24追記
しばらく運用してみた結果、見にくかったので、グラフ作成については、以下の様に変更した。
1
rrdtool graph iijmio-use.png --imgformat=PNG \
4
--end now --start end-1months \
7
DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \
8
DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \
9
DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \
10
DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \
11
DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \
12
DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \
13
DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \
14
DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \
15
CDEF:SIM1=SIM1C,SIM1N,+ \
16
CDEF:SIM2=SIM2C,SIM2N,+ \
17
CDEF:SIM3=SIM3C,SIM3N,+ \
18
CDEF:SIM4=SIM4C,SIM4N,+ \
19
LINE2:SIM1#0000FF:"SIM1" \
20
LINE2:SIM2#00FFFF:"SIM2" \
21
LINE2:SIM3#00FF00:"SIM3" \
22
LINE2:SIM4#F00F00:"SIM4"
「LINE数字:~」の数字部分の意味を取り違えていたという・・・太さの意味だったか・・・
2014/12/19追記
作ってから約1年が経過しました。
最近はこんなグラフにしています。(横軸のめもりを日付にした)
1
rrdtool graph iijmio-use.png --imgformat=PNG \
4
--end now --start end-2months \
6
--x-grid DAY:1:WEEK:1:WEEK:1:0:%m/%d \
8
DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \
9
DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \
10
DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \
11
DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \
12
DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \
13
DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \
14
DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \
15
DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \
16
CDEF:SIM1=SIM1C,SIM1N,+ \
17
CDEF:SIM2=SIM2C,SIM2N,+ \
18
CDEF:SIM3=SIM3C,SIM3N,+ \
19
CDEF:SIM4=SIM4C,SIM4N,+ \
20
LINE2:SIM1#0000FF:"SIM1" \
21
LINE2:SIM2#00FFFF:"SIM2" \
22
LINE2:SIM3#00FF00:"SIM3" \
23
LINE2:SIM4#F00F00:"SIM4"
そして、1年分
1
rrdtool graph iijmio-use-year.png --imgformat=PNG \
5
--end now --start end-14months \
7
--x-grid WEEK:1:MONTH:1:MONTH:1:0:%m/%d \
8
--title="IIJmioの1年分使用量" \
9
DEF:SIM1C=hdo8038xxxx.rrd:withCoupon:LAST \
10
DEF:SIM1N=hdo8038xxxx.rrd:withoutCoupon:LAST \
11
DEF:SIM2C=hdo8100xxxx.rrd:withCoupon:LAST \
12
DEF:SIM2N=hdo8100xxxx.rrd:withoutCoupon:LAST \
13
DEF:SIM3C=hdo8100xxxx.rrd:withCoupon:LAST \
14
DEF:SIM3N=hdo8100xxxx.rrd:withoutCoupon:LAST \
15
DEF:SIM4C=hdo8371xxxx.rrd:withCoupon:LAST \
16
DEF:SIM4N=hdo8371xxxx.rrd:withoutCoupon:LAST \
17
CDEF:SIM1=SIM1C,SIM1N,+ \
18
CDEF:SIM2=SIM2C,SIM2N,+ \
19
CDEF:SIM3=SIM3C,SIM3N,+ \
20
CDEF:SIM4=SIM4C,SIM4N,+ \
21
LINE2:SIM1#0000FF:"SIM1" \
22
LINE2:SIM2#00FFFF:"SIM2" \
23
LINE2:SIM3#00FF00:"SIM3" \
24
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で見ればよかったのか。
参考になります。