タイトル長いですが、やりたかったことなので...
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