管理人Kのひとりごと

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

IIJmioSIMの電話番号毎の直近3日間のクーポンOFF通信量を取得する(python)

タイトル長いですが、やりたかったことなので...
IIJmioクーポンスイッチAPIであれこれやるシリーズ☟

直近3日間のクーポンOFF通信量が366MBを超えると、通信制限がかかるらしいので、それをプッシュ通知させるために作りました。

方針

  • 「クーポン残量照会」(a)、「クーポン残量照会・クーポンのON/OFF状態照会」(b)用のURLを叩いて取得したJSONファイルをインプットにする
  • (b)で、hdoServiceCodeをキーに、電話番号のディクショナリを生成(c)
  • (a)を使って、hdoServiceCode毎の直近3日のクーポンOFF通信量を計算する(d)
  • (c)と(d)を組み合わせて、電話番号ごとの直近3日のクーポンOFF通信量を求める
  • 結果は標準出力に表示する

コード

#!/usr/bin/python
# -*- coding:utf-8 -*-

import sys
import json

RETURN_CODE_VALID = 'OK'

# 引数1:「クーポン残量照会・クーポンのON/OFF状態照会」の結果JSONファイル
# 引数2:クーポン残量照会」の結果JSONファイル
def get_usage(coupon_path, packet_path):
    number_dict = get_number_dict(coupon_path)
    usage_dict = get_3days_usage_dict(packet_path)

    for elem in usage_dict:
      print u'Tel:%s,Usage(MB):%d' % (number_dict[elem],usage_dict[elem])

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

# hdoServiceCodeと直近3日間のクーポンOFF通信量総計のディクショナリを取得する
def get_3days_usage_dict(packet_path):
    KEY_PACKETLOGINFO = 'packetLogInfo'
    KEY_HDOINFO = 'hdoInfo'
    KEY_HDOSERVICECODE = 'hdoServiceCode'
    KEY_PACKETLOG = 'packetLog'
    KEY_WITHOUTCOUPON = 'withoutCoupon'

    usage_dict = {}    

    f = None
    try:
        f = open(packet_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)

        # ディクショナリ化のため、文字列化の後、先頭と末尾の'[]'を削除 
        packetLogInfo_str = json.dumps(json_data[KEY_PACKETLOGINFO])
        sliced_packetLogInfo_str = packetLogInfo_str[1:len(packetLogInfo_str) - 1]
   
        # ディクショナリ化
        packetLogInfo_dict = json.loads(sliced_packetLogInfo_str)
        hdoInfo_dict  = packetLogInfo_dict[KEY_HDOINFO]

        for hdoInfo in hdoInfo_dict:
            hdoServiceCode = hdoInfo[KEY_HDOSERVICECODE]
            packetLog_dict = hdoInfo[KEY_PACKETLOG]
            without_coupon_mbytes = 0
            # 非クーポンパケット通信量を末尾(最新のもの)から3件取得し、足し上げ
            for i in range(-1,-4,-1):
                without_coupon_mbytes += packetLog_dict[i][KEY_WITHOUTCOUPON]

            # hdoServiceCodeをキーに上述の通信量のディクショナリを生成
            usage_dict[hdoServiceCode] = without_coupon_mbytes

        return usage_dict
 
    except IOError:
        print 'ファイルオープンに失敗しました:', packet_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()

# hdoServiceCodeと電話番号のディクショナリを取得する
def get_number_dict(coupon_path):
    KEY_COUPON_INFO = 'couponInfo'
    KEY_HDOINFO = 'hdoInfo'
    KEY_HDOSERVICECODE = 'hdoServiceCode'
    KEY_NUMBER = 'number'

    number_dict = {}    

    f = None
    try:
        f = open(coupon_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)

        # ディクショナリ化のため、文字列化の後、先頭と末尾の'[]'を削除 
        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)
    
        # hdoInfoセクションを取得
        coupon_dict = couponInfo_dict[KEY_HDOINFO]
        
        # hdoServiceCodeをキーに、電話番号のディクショナリを生成
        for hdoinfo_dict in coupon_dict:
            hdoServiceCode = hdoinfo_dict[KEY_HDOSERVICECODE]
            telNumber = hdoinfo_dict[KEY_NUMBER]
            number_dict[hdoServiceCode] = telNumber
    
        return number_dict

    except IOError:
        print 'ファイルオープンに失敗しました:', coupon_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()

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

実行結果

[hoge@fuga]$ ./get_usage.py res_coupon.json res_packet.json
Tel:080XXXXXXXX,Usage(MB):192
Tel:070XXXXXXXX,Usage(MB):2