개요
Python의 requests
패키지와 IFTTT를 이용하여 간단히 비트코인 가격 알리미 서비스를 만들어 보도록 하겠습니다. 비트코인 가격은 빗썸에서 제공하는 데이터를 사용합니다.
프로젝트 준비
프로젝트에서 사용할 라이브러리를 설치합니다.
$ pip install requests # We only need the requests package
비트코인 가격 조회하기
우선 Python 콘솔에서 빗썸에서 제공하는 API를 이용해 최신 가격을 조회해보겠습니다.
requests
모듈을 import 한 후, 비썸 API의 주소 값이 담긴 bitcoin_api_url
변수를 정의합니다.
다음은 requests.get()
함수를 사용하여 해당 주소로 HTTP GET 요청을 전송한 후, 응답을 저장합니다. API는 JSON 응답을 제공하므로 이것을 .json()
메서드를 호출하여 Python object로 변환합니다.
>>> import requests
>>> bitcoin_api_url = 'https://api.bithumb.com/public/ticker/BTC_KRW'
>>> response = requests.get(bitcoin_api_url)
>>> response_json = response.json()
>>> response_json
{'status': '0000', 'data': {'opening_price': '40713000', 'closing_price': '39129000', 'min_price': '38044000', 'max_price': '41300000', 'units_traded': '6535.13887904', 'acc_trade_value': '258566736293.3808', 'prev_closing_price': '40690000', 'units_traded_24H': '6621.61837961', 'acc_trade_value_24H': '262079238854.1083', 'fluctate_24H': '-1364000', 'fluctate_rate_24H': '-3.37', 'date': '1610894106958'}}
이 예제에서는 빗썸 API의 응답 데이터 (response_json
) 중 최근 24시간 내 마지막 거래금액을 의미하는 closing_price
필드를 사용할 것입니다.
※ 각 필드에 대한 설명은 상세 설명은 빗썸의 API 문서를 참고합니다.
IFTTT 애플릿(Applets) 생성
이제 이렇게 조회한 비트코인 가격을 핸드폰으로 송신하기 위해서 IFTTT 서비스를 사용하도록 하겠습니다.
- IFTTT 서비스의 계정을 생성합니다.
- (핸드폰으로 알림을 받을 것이므로) IFTTT 모바일 앱을 설치합니다.
이제 새 IFTTT 애플릿을 만듭니다.
- “this” 버튼을 클릭합니다.
- “webhooks” 서비스를 찾아 클릭한 후, “Receive a web request” 트리거를 선택합니다.
- 이벤트명을 입력합니다. (저는
bitcoin_price_update
로 하였습니다.) - “Then That” 버튼을 클릭합니다.
- “notifications” 서비스를 찾은 후, “Send a rich notification from the IFTTT app” 선택합니다.
- 적절한 제목을 추가합니다. ( “현재 비트코인 가격”으로 입력하였습니다. )
- 메시지는
비트코인 최신가격 : {{Value1}}
로 설정합니다. - 선택사항으로 메시지를 클릭하면 이동할 링크를 추가할 수도 있습니다.
- 애플릿 설정을 마칩니다.
서비스 연결하기
IFTTT의 설정은 마쳤으므로 Python 코드를 작성해보도록 하겠습니다.
파일명은 bitcoin_notifications.py
로 하였습니다.
import requests
import time
from datetime import datetime
def main():
pass
if __name__ == '__main__':
main()
다음은 앞서 시험해보았던 코드와 ifttt 서비스 요청을 위한 코드를 추가하겠습니다.
BITCOIN_API_URL = 'https://api.bithumb.com/public/ticker/BTC_KRW'
IFTTT_WEBHOOKS_URL = 'https://maker.ifttt.com/trigger/{event}/with/key/{your-IFTTT-key}'
def get_latest_bitcoin_price():
res = requests.get(BITCOIN_API_URL)
res_json = res.json()
return res_json['data']['closing_price']
def post_ifttt_webhook(event, value):
data = {'value1': value}
ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event)
requests.post(ifttt_event_url, json=data)
post_ifttt_webhook
함수는 IFTTT 서비스로 HTTP POST 요청을 전송합니다. 이때 사용하는 주소 값에는 앞서 애플릿을 생성할 때 사용하였던 이벤트명 bitcoin_price_update
이 포함됩니다. 따라서 해당 이벤트명을 인자로 넘겨주었습니다. 또한 3가지의 추가 데이터를 함께 보낼 수 있는데 우리가 메시지 내용으로 작성하였던 {{ value1 }}
이 이에 해당합니다.
이제 먼저 뼈대를 잡아 놓았던 main
함수에서 이들을 호출하겠습니다.
def main():
bitcoin_history = []
while True:
price = get_latest_bitcoin_price()
date = datetime.now()
bitcoin_history.append({'date': date, 'price': price})
# Send a notification
# Once we have 5 items in our bitcoin_history send an update
if len(bitcoin_history) == 5:
post_ifttt_webhook('bitcoin_price_update',
format_bitcoin_history(bitcoin_history))
# Reset the history
bitcoin_history = []
# Sleep for 5 minutes
# (For testing purposes you can set it to a lower number)
time.sleep(5 * 60)
여기서에서는 5분 간격으로 비트코인의 가격을 조회하여 전송하도록 설정 (time.sleep(5 \* 60)
)하였습니다. 빗썸은 현재 1초에 135회까지 API 호출을 허용하고 있습니다. 자신이 원하는 값으로 이 값을 조정합니다. ( 참고 )
이제 format_bitcoin_history
함수를 작성하겠습니다. bitcoin_history
를 인자로 하여 보기 좋게 편집합니다. 아래의 내용을 main
함수 위에 추가합니다.
def format_bitcoin_history(bitcoin_history):
rows = []
for bitcoin_price in bitcoin_history:
# Formats the date into a string: '2021-01-18 15:09'
date = bitcoin_price['date'].strftime('%Y-%m-%d %H:%M')
price = bitcoin_price['price']
# 2021-01-18 15:09: 1234원
row = '{}: {}원'.format(date, price)
rows.append(row)
# Use a \n tag to create a new line
# Join the rows delimited by newline : row1\nrow2\nrow3
return '\n'.join(rows)
가격 알림 앱을 실행하기 위해서 터미널에서 다음 명령을 실행합니다. 잠시 후, 핸드폰으로 알림이 오는 것을 확인할 수 있습니다.
$ python bitcoin_notifications.py
이것으로 간단히 대략 50 줄의 Python 코드로 비트코인 알리미 서비스를 만들었습니다. 만약 잘 동작하지 않는 다면 아래의 전체 코드와 비교하여 오류가 있는 부분을 확인해보시기 바랍니다.
#!/usr/bin/env python3
import requests
import time
from datetime import datetime
BITCOIN_API_URL = 'https://api.bithumb.com/public/ticker/BTC_KRW'
IFTTT_WEBHOOKS_URL = 'https://maker.ifttt.com/trigger/{event}/with/key/{your-IFTTT-key}'
def get_latest_bitcoin_price():
res = requests.get(BITCOIN_API_URL)
res_json = res.json()
return res_json['data']['closing_price']
def post_ifttt_webhook(event, value):
data = {'value1': value}
ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event)
requests.post(ifttt_event_url, json=data)
def format_bitcoin_history(bitcoin_history):
rows = []
for bitcoin_price in bitcoin_history:
date = bitcoin_price['date'].strftime('%Y-%m-%d %H:%M')
price = bitcoin_price['price']
row = '{}: {}원'.format(date, price)
rows.append(row)
return '\n'.join(rows)
def main():
bitcoin_history = []
while True:
price = get_latest_bitcoin_price()
print(price)
date = datetime.now()
bitcoin_history.append({'date': date, 'price': price})
if len(bitcoin_history) == 5:
post_ifttt_webhook('bitcoin_price_update', format_bitcoin_history(bitcoin_history))
bitcoin_history = []
time.sleep(5 * 60)
if __name__ == '__main__':
main()
정리
이번 글에서, 비트코인 가격 알리미 서비스를 만들어 보았습니다. 파이썬의 requests
모듈을 사용하여 HTTP GET 요청과 POST 요청을 전송하는 방법을 학습하였습니다. 또 간단히 IFTTT 서비스를 Python 앱과 연결하여 사용자가 수집된 데이터를 핸드폰에서 확인할 수 있도록 하였습니다.
참고
'프로그래밍 언어 > Python' 카테고리의 다른 글
[Python] PIP 사용법 (0) | 2020.11.22 |
---|---|
문자열 내장함수 (String built in functions) (0) | 2020.05.12 |
문자열 서식 다루기 (0) | 2020.05.11 |
문자열 다루기의 기초 (0) | 2020.05.09 |