Sunabar API 실험장(GMO 청공 인터넷 뱅킹)에서 해봤어요.
개요
업무 관계로 인해 저는 은행 API에 참여할 기회가 많았습니다. API를 이용해서 저에게 편리한 서비스를 제공할 수 있을까 고민하다가 최근 GMO 청공 인터넷 뱅킹에서 선나 바 API 실험장을 공개했습니다.
집에서 나올 수 없어서 이 API 실험을 이용해 간단한 프로그램을 만들어 놀았다.
카탈로그
하고 싶은 인상.
하고 싶은 거.
최근 LINE에서 알림을 받은 사람이 이메일 알림보다 눈치채고 읽습니다.
입금과 결제, 그리고 지금 잔액을 라인에 알리는 서비스를 만들어 보세요.
[수금/지불] →(통지 취득 → 잔액 취득 → 라인 통지) → [수금/지불 결과 및 현재 잔액의 라인 통지]
실현 방법
다음은 만들고 싶은 이미지, 설치 부분과 기술적 요소를 정리했다.
#
설치 섹션
어떻게 설치합니까?
1
수금 통지를 얻다
웹훅이나 메일로 받을 수 있습니까?
2
잔액의 취득
은행 API에서 가져오기
3
LINE에서 알림
LINE Notify 사용
차리다
계좌를 개설하다
선바버는 GMO 청공 인터넷 뱅킹의 은행 계좌가 필요하다.
계좌를 개설하세요.
액세스 토큰 가져오기
sunabar 포털에 로그인
계정 개설 후 즉시 sunabar API 실험에서 사용할 수 있다.
'고객 정보(신청·설정)'&'개발자 대상'탭에서 포털 사이트의 ID·비밀번호를 얻습니다.
"sunabar API 실험 포털"링크에서 포털로 이동하여 로그인합니다.
액세스 토큰 가져오기
은행 API를 사용하는 액세스 토큰을 받습니다.
로그인 후 메뉴에서 "확인, 추가, 영패 업데이트"단추를 누르십시오.
이번에 개인 계좌의 방문 지폐를 얻었다.
복사 가능한 아이콘을 누르면 방문 영패가 클립보드에 복사되며, 수첩에 붙이면 영패를 얻을 수 있습니다.
기타 준비
계좌를 개설하다
선바버는 GMO 청공 인터넷 뱅킹의 은행 계좌가 필요하다.
계좌를 개설하세요.
액세스 토큰 가져오기
sunabar 포털에 로그인
계정 개설 후 즉시 sunabar API 실험에서 사용할 수 있다.
'고객 정보(신청·설정)'&'개발자 대상'탭에서 포털 사이트의 ID·비밀번호를 얻습니다.
"sunabar API 실험 포털"링크에서 포털로 이동하여 로그인합니다.
액세스 토큰 가져오기
은행 API를 사용하는 액세스 토큰을 받습니다.
로그인 후 메뉴에서 "확인, 추가, 영패 업데이트"단추를 누르십시오.
이번에 개인 계좌의 방문 지폐를 얻었다.
복사 가능한 아이콘을 누르면 방문 영패가 클립보드에 복사되며, 수첩에 붙이면 영패를 얻을 수 있습니다.
기타 준비
실시 방법의 조사
수금 통지를 얻다
선바버의 매뉴얼과 동작을 확인한 결과, 입금 처리 후 알림을 받는 기능이 아직 실현되지 않았기 때문에 이번에는 몇 초 간격으로'입금 내역 조회 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.pyimport 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)
실험 준비
#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")
부호화
소스 코드는 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)
실험 준비
실행
수금 확인 후 집행 버튼을 누르세요.
입금이 완료되다.
잠시 후 라인이 입금 통지를 받았습니다.
예상대로 굴러가다.또한 실행 중지(Ctrl+C)도 잊지 마십시오.
끝맺다
GMO 청공의 인터넷 뱅킹 계좌가 있다면 개인도 은행 API의 샌드박스 환경을 무료로 활용해 프로그램을 만들고 포털 사이트와 조합해 놀 수 있어 사치스러운 환경이다.
API도 많이 공개됐는데 같이 놀고 싶어요.
Reference
이 문제에 관하여(Sunabar API 실험장(GMO 청공 인터넷 뱅킹)에서 해봤어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sirolab/items/9613f312833134dad396
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Sunabar API 실험장(GMO 청공 인터넷 뱅킹)에서 해봤어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sirolab/items/9613f312833134dad396텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)