管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

IIJmioクーポンスイッチAPIで取得したJSONをパースして加工する(python)

IIJmioクーポンAPIをたたいて取得したJSONをパースして、日毎に利用可能なクーポンMB数を取得してみようと思います。

IIJMioクーポンAPI準備編☟

方針

  • 「クーポン残量照会」用のURLをたたいて取得したJSONファイルをインプットにする
  • クーポンMB数(SIM内クーポンを除く)を足し上げる(1)
  • 翌月に繰り越したいMB数を(1)から除く(2)
  • (2)を実行日を含む月の残り日数で割って、日毎に利用可能なMB数を取得する
  • 結果は標準出力に表示する

ソース

pythonで書きました。

#!/usr/bin/python
# -*- encoding:utf8 -*-

import sys
import json
import datetime
import calendar

def main(json_path):
  RETURN_CODE_VALID = 'OK'
  # 残しておきたいMB数
  REMAIN_MBYTES = 3000

  f = None
  try:
    f = open(json_path,'r')
    json_data = json.load(f)

    return_code = get_return_code(json_data)
    # OK以外が帰ってきたら処理終了
    if RETURN_CODE_VALID != return_code:
      print 'エラー:',return_code
      sys.exit(1)

    coupon_mbytes = get_coupon_mbytes(json_data)
 
    # 利用可能MB数合計から、残すMB数を引いたものを当月利用可能MB数とする 
    available_mbytes = coupon_mbytes - REMAIN_MBYTES
    
    remain_days = get_remain_days()

    # 当月利用可能MB数/当月残り日数で1日あたりの利用MB数を算出
    print '日毎の利用可能MB数:%03.1f' % (available_mbytes / remain_days)
  except IOError:
    print 'ファイルオープンに失敗しました:',json_path
    sys.exit(1)
  except KeyError as e:
    print 'キーがありません:',e.args[0]
    sys.exit(1)
  except:
    print '予期しないエラー:',sys.exc_info()[0]
    sys.exit(1)
  finally:
    if f is not None:
      f.close()

# 今日を含めた当月の残り日数を算出する
def get_remain_days():
  today = datetime.datetime.today()

  # 当月末日 - 当日 + 1で当月の残り日数(当日含む)
  return calendar.monthrange(today.year,today.month)[1] - today.day + 1

# returnCodeセクションを取得する
def get_return_code(json_data):
  KEY_RETURN_CODE = 'returnCode'
  return json_data[KEY_RETURN_CODE]

# couponセクションから利用可能MB数合計を取得する
def get_coupon_mbytes(json_data):
  KEY_COUPON_INFO = 'couponInfo'
  KEY_COUPON = 'coupon'
  KEY_VOLUME = 'volume'

  # ディクショナリ化のため、文字列化の後、先頭と末尾の'[]'を削除 
  couponInfo_str = json.dumps(json_data[KEY_COUPON_INFO])
  sliced_couponInfo_str = couponInfo_str[1:len(couponInfo_str)-1] 

  # ディクショナリ化
  couponInfo_dict = json.loads(sliced_couponInfo_str)
 
  # 残クーポンMB数取得のため、couponセクションを取得
  coupon_dict = couponInfo_dict[KEY_COUPON]

  coupon_mbytes = 0
  for monthly_dict in coupon_dict:
    coupon_mbytes += monthly_dict[KEY_VOLUME]

  return coupon_mbytes

if __name__=='__main__':
  try:
    args = sys.argv
    main(args[1])
  except IndexError:
    print 'JSONファイルを指定してください'
    sys.exit(1)

実行例

[hoge@fuga]$ ./calc_coupon.py ./coupon.json
日毎の利用可能MB数:113.0

次回以降やりたいこと

slackにポストしたいので、slackに投稿する方法を調査する。