Sunabar API 실험장(GMO 청공 인터넷 뱅킹)에서 해봤어요.

개요


업무 관계로 인해 저는 은행 API에 참여할 기회가 많았습니다. API를 이용해서 저에게 편리한 서비스를 제공할 수 있을까 고민하다가 최근 GMO 청공 인터넷 뱅킹에서 선나 바 API 실험장을 공개했습니다.
집에서 나올 수 없어서 이 API 실험을 이용해 간단한 프로그램을 만들어 놀았다.

카탈로그

  • 제작하고 싶은 이미지
  • 준비
  • 실현 방법에 대한 조사
  • 인코딩 및 실행
  • 종료
  • 하고 싶은 인상.


    하고 싶은 거.


    최근 LINE에서 알림을 받은 사람이 이메일 알림보다 눈치채고 읽습니다.
    입금과 결제, 그리고 지금 잔액을 라인에 알리는 서비스를 만들어 보세요.
    [수금/지불] →(통지 취득 → 잔액 취득 → 라인 통지) → [수금/지불 결과 및 현재 잔액의 라인 통지]

    실현 방법


    다음은 만들고 싶은 이미지, 설치 부분과 기술적 요소를 정리했다.
    #
    설치 섹션
    어떻게 설치합니까?
    1
    수금 통지를 얻다
    웹훅이나 메일로 받을 수 있습니까?
    2
    잔액의 취득
    은행 API에서 가져오기
    3
    LINE에서 알림
    LINE Notify 사용

    차리다


    계좌를 개설하다


    선바버는 GMO 청공 인터넷 뱅킹의 은행 계좌가 필요하다.
    계좌를 개설하세요.

    액세스 토큰 가져오기


    sunabar 포털에 로그인
    계정 개설 후 즉시 sunabar API 실험에서 사용할 수 있다.
    '고객 정보(신청·설정)'&'개발자 대상'탭에서 포털 사이트의 ID·비밀번호를 얻습니다.

    "sunabar API 실험 포털"링크에서 포털로 이동하여 로그인합니다.
    액세스 토큰 가져오기
    은행 API를 사용하는 액세스 토큰을 받습니다.
    로그인 후 메뉴에서 "확인, 추가, 영패 업데이트"단추를 누르십시오.

    이번에 개인 계좌의 방문 지폐를 얻었다.
    복사 가능한 아이콘을 누르면 방문 영패가 클립보드에 복사되며, 수첩에 붙이면 영패를 얻을 수 있습니다.

    기타 준비

  • 포털 사이트에서 "sunabar 첫 번째 마법사"를 읽습니다.
  • 사용자는 Open API 개발자 포털에 등록합니다.( https://api.gmo-aozora.com/ganb/developer/api-docs/#/STOP0101 )
  • 실시 방법의 조사


    수금 통지를 얻다
    선바버의 매뉴얼과 동작을 확인한 결과, 입금 처리 후 알림을 받는 기능이 아직 실현되지 않았기 때문에 이번에는 몇 초 간격으로'입금 내역 조회 API'를 실행해 입금 내역의 최근 거래를 취득하고 검사한다.
    #GMO Aozora Tranasactions Get
    def transactionsGet(headers):
        conn = http.client.HTTPSConnection('api.sunabar.gmo-aozora.com')
        conn.request('GET', '/personal/v1/accounts/transactions?accountId=[accountId]', headers=headers)
        resp = conn.getresponse()
        return resp.read().decode("utf-8")
    
    당일 내역만 원하다 보니 오픈 API 개발자 포털의 내용을 확인했고, 조회 매개 변수에는 필수 항목의 계정 ID(accountId)만 설정됐다.
    잔액의 취득
    잔액의 취득은'잔액 조회 API'를 활용한다.
    #GMO Aozora Balances Get
    def balancesGet(headers):
        conn = http.client.HTTPSConnection('api.sunabar.gmo-aozora.com')
        conn.request('GET', '/personal/v1/accounts/balances', headers=headers)
        resp = conn.getresponse()
        return resp.read().decode("utf-8")
    
    LINE에서 알림
    이번에는 일방적으로 LINE에게 알리기 때문에 LINE Notify를 사용합니다.
    자신의 라인 계정에 친구 로그인과 토큰 발행을 진행했다.
    준비는 여기까지.실제로 해봤어요.

    인코딩 및 실행


    부호화


    소스 코드는 Python을 사용하여 API 개발자 포털에 기재된 내용에 따라 쓰려고 합니다.
    notify.py
    import http.client
    import urllib.parse
    import json
    import time
    
    LINE_ACCESS_TOKEN = '[LINE Notifyのトークン]'
    GMO_AOZORA_ACCESS_TOKEN = '[GMOあおぞらネット銀行のトークン'
    
    #LINE Notify LINEに通知
    def lineNotify(message):
        conn = http.client.HTTPSConnection('notify-api.line.me')
        headers = {
        'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
        'Content-Type': 'application/x-www-form-urlencoded'
        }
        payload = urllib.parse.urlencode({ "message"  : message} )
        conn.request('POST', '/api/notify', body=payload, headers=headers)
        resp = conn.getresponse()
        print(resp.read())
        return resp 
    
    #GMO Aozora Tranasactions Get 入出金明細の取得
    def transactionsGet(headers):
        conn = http.client.HTTPSConnection('api.sunabar.gmo-aozora.com')
        conn.request('GET', '/personal/v1/accounts/transactions?accountId=[accountId]', headers=headers)
        resp = conn.getresponse()
        return resp.read().decode("utf-8")
    
    #GMO Aozora Balances Get 残高の取得
    def balancesGet(headers):
        conn = http.client.HTTPSConnection('api.sunabar.gmo-aozora.com')
        conn.request('GET', '/personal/v1/accounts/balances', headers=headers)
        resp = conn.getresponse()
        return resp.read().decode("utf-8")
    
    #main
    def main(itemKey):
        gmo_headers = {
            'x-access-token': GMO_AOZORA_ACCESS_TOKEN,
            'accept': 'application/json;charset=UTF-8'
            }
    
        #入出金明細取得 
        tran_data = json.loads(transactionsGet(gmo_headers))
    
        #明細数を取得:当日取引なしの場合は0、取引ありの場合は明細数を取得
        count = int(tran_data['count'])
    
        #当日取引ありの場合のみ処理
        if count > 0:
            #当日取引の最終レコードを取得(取引日の昇順となるため、最終レコードが直近となる)
            current_tran = tran_data['transactions'][count - 1]
    
            #当日取引の明細キーを取得(判定に利用)
            current_itemKey = int(current_tran['itemKey'])
    
            #当日取引の明細キーが記録している明細キーよりも大きい(新しい入出金が発生した場合)
            if itemKey < current_itemKey:
    
                #入金か出金かを判定
                #入出金明細のtransactionTypeが1の場合、入金、2の場合、出金
                tran_str = ''
                if current_tran['transactionType'] == '1':
                    tran_str = "入金あったよー"
                elif current_tran['transactionType'] == '2':
                    tran_str = "出金したよー"
                else
                    tran_str = "謎の取引"
    
                #残高の取得
                bal_data = json.loads(balancesGet(gmo_headers))
    
                #LINE Notifyに通知
                line_message = tran_str + "残高は" + "{:,}".format(int(bal_data['balances'][0]['balance'])) + "円"
                lineNotify(line_message)
                return current_itemKey
    
        return itemKey
    
    #10秒事に取得(サーバ負荷は気になりますが・・・)
    if __name__ == '__main__':
        #再起動の考慮はせずとりあえず比較用の明細キーは0で初期化
        itemKey = 0
        while 1:
            itemKey = main(itemKey)
            time.sleep(10)
    
    

    실험 준비

  • 파이톤 실행 환경: RaspberryPi3#파이톤 3.53으로 실행됩니다.
  • sunabar포털: 아래의'출금 시뮬레이터'는 입금에 사용
  • 실행

  • ATM 입금
  • 수금 계좌를 선택하여 수금 금액을 입력한 후 확인 버튼을 누르세요.

    수금 확인 후 집행 버튼을 누르세요.

    입금이 완료되다.

    잠시 후 라인이 입금 통지를 받았습니다.
  • ATM 결제
  • 이어 지출도 입금 절차와 마찬가지로 20000엔을 냈다.여기 라인도 결제 안내 받았어요.
  • 다른 은행 입금
  • 다른 은행 입금도 마찬가지입니다.스나바타로가 당신에게 20000엔을 송금했습니다.

    예상대로 굴러가다.또한 실행 중지(Ctrl+C)도 잊지 마십시오.

    끝맺다


    GMO 청공의 인터넷 뱅킹 계좌가 있다면 개인도 은행 API의 샌드박스 환경을 무료로 활용해 프로그램을 만들고 포털 사이트와 조합해 놀 수 있어 사치스러운 환경이다.
    API도 많이 공개됐는데 같이 놀고 싶어요.

    좋은 웹페이지 즐겨찾기