본문 바로가기
개발

24시간 돌아가는 코인 시세 알림 봇 만들기 #3

by wafla 2024. 1. 4.

이번에는 저번 글에서 작성한 코드를 24시간 돌릴 수 있는 서버를 만들어 봅시다 !

 

1. 서버 생성

 

Oracle Cloud에서 다음과 같은 서비스를 무료로 이용할 수 있습니다.

 

따라서 따로 컴퓨터를 24시간 켜두지 않아도 코드를 돌릴 수 있습니다.

 

https://www.oracle.com/kr/cloud/free/

 

클라우드 서비스 무료 이용

Oracle Cloud Free Tier는 기업에게 무제한으로 사용할 수 있는 상시 무료 클라우드 서비스를 제공합니다.

www.oracle.com

위의 링크에서 회원가입을 해주시길 바랍니다.

 

로그인이 완료 됐으면 다음과 같이 화면이 나타나는데 인스턴트 컴퓨트를 클릭합니다.

 

인스턴스 생성을 눌러줍니다.

 

이름을 정하고 전용 키를 다운 받습니다.

 

저는 이미 하나를 만들어둬서 새로 만드려니 요금이 뜨네요..

 

2개(100GB)까지는 무료인걸로 알고 있었는데 일단 원래 만들어둔거로 진행하겠습니다.

(찾아보니 저렇게 비용이 떠도 용량이 100GB 이하면 요금이 발생하지 않는다고 하네요)

 

2. 서버 접속

 

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

 

Download PuTTY: latest release (0.80)

This page contains download links for the latest released version of PuTTY. Currently this is 0.80, released on 2023-12-18. When new releases come out, this page will update to contain the latest, so this is a good page to bookmark or link to. Alternativel

www.chiark.greenend.org.uk

위의 사이트에서 putty라는 프로그램을 다운 받고 설치해주세요.

 

방금 전에 다운 받은 전용 키를 한글이 포함되지 않는 경로에 위치 시킵니다.

 

저는 C 드라이브에 폴더를 새로 만들어서 저장했습니다.

 

윈도우에서 puttygen을 검색하고 실행시킵니다.

 

Load 버튼을 누릅니다.

 

확장자명을 All Files로 바꾸고 다운 받은 전용 키를 선택합니다.

 

이후 Save private key를 눌러 ppk 파일을 저장합니다.

 

다음으로 putty 프로그램을 실행시킵니다.

 

Connection - SSH - Auth - Credentials로 이동해서 방금 만든 ppk 파일을 선택합니다.

 

Session으로 이동하고 Host Name에 조금 전에 만든 인스턴스의 공용 IP를 입력합니다.

 

이후에 Saved Sessions 밑에 이름을 적고 저장하면 다음번에 다시 들어갈 때 저장된 값으로 바로 접속이 가능합니다.

 

Open을 눌러 서버에 접속해 봅시다.

 

login as에 opc를 치면 접속이 됩니다.

 

opc가 기본 값인데 다른걸로 바꾸고 싶은 분들은 바꿀 수도 있습니다.

 

3. 서버 설정

이제 서버에 필요한 것들을 설치해야 합니다.

 

저번 글에서 작성한 파이썬 코드를 돌리려면 3.7버전 이상이 필요한데 이 서버에는 3.6 버전이 깔려 있으므로 파이썬도 새로 설치해야 하고 파이썬 모듈들도 새로 설치해야 합니다.

 

가상 환경을 만들고 설치해 봅시다.

 

1. sudo yum update -y 명령어로 우분투 패키지를 업데이트 합니다.

2. sudo yum install -y python3-venv 로 가상 환경 패키지를 설치합니다.

3. python3 -m venv myenv 로 가상 환경을 생성합니다.

4. source myenv/bin/activate 로 가상 환경에 접속합니다.

5. sudo yum update 로 가상 환경을 업데이트합니다.

 

상위 버전 파이썬을 설치합니다.

6. sudo yum install software-properties-common

7. sudo yum install epel-release

8. sudo yum groupinstall "Development Tools"

9. sudo yum install python3.11

 

파이썬 모듈을 설치합니다.

10 /usr/bin/python3.11 -m pip install '모듈명' (pybit, pandas, pandas_ta, numpy, python-telegram-bot)

 

파이썬 3.11은 가상 환경에 설치 됐기 때문에 source myenv/bin/activate 로 가상 환경에 접속해서 코드를 실행시켜야 합니다.

 

이제 미리 작성해둔 코드들을 복붙합시다.

 

 price = str(btc_market['open'][-1]) 이 부분에 warning이 뜨기 때문에 다음과 같이 바꿔줍니다.

price = str(btc_market['open'].iloc[-1])

 

파일 이름은 b.py로 하겠습니다.

 

또 코드가 제대로 돌아가는지 확인하기 위해 09시마다 전송 되는 부분을 없애고 실행시킵니다.

 

vi b.py로 파일을 생성합니다.

 

다음과 같이 화면이 뜨는데 코드를 복사한 뒤 아래 화면에 우클릭을 해줍니다.

 

:wq로 저장하고 빠져나올 수 있습니다.

 

authcreds.json도 같은 방법으로 만들어 줍시다.

 

만약 잘못 생성했다면 rm '파일명'으로 지울 수 있습니다.

 

이제 실행해 봅시다.

 

python3.11 b.py

 

Ctrl+C로 프로그램을 강제 종료할 수 있습니다.

 

실행 결과

 

이제 프로그램을 백그라운드에서 계속 돌아가게 합시다.

nohup python3.11 b.py &

 

ps -ef | grep b.py 로 현재 실행중인 프로그램 중에 b.py를 확인할 수 있습니다.

 

잘 돌아가고 있네요. 프로그램을 종료하고 싶으면 kill PID로 종료할 수 있습니다.

 

저기서 돌아가는 b.py는 312536이라는 번호를 갖고 있네요. 

 

kill 312536으로 종료해 봅시다.

 

참고로 키보드에 위 아래 키로 내가 최근에 작성했던 명령어들을 다시 불러올 수 있습니다.

 

수정된 파이썬 코드입니다.

from pybit.unified_trading import HTTP
import pandas as pd
import pandas_ta as ta
import numpy as np
import datetime as dt
import time 
import json
import pytz
import telegram
import asyncio

with open('authcreds.json') as j:
    creds = json.load(j)

key = creds['KEY_NAME']['key']
secret = creds['KEY_NAME']['secret']
token = creds['KEY_NAME']['token']
  
session = HTTP(api_key=key, api_secret=secret, testnet=False)

def get_market(response):
    data = response.get('list', None)
    if not data:
        return 
    
    data = pd.DataFrame(data,
                        columns =[
                            'timestamp',
                            'open',
                            'high',
                            'low',
                            'close',
                            'volume',
                            'turnover'
                            ],
                        )
    
    f = lambda x: dt.datetime.utcfromtimestamp(int(x)/1000)
    data.index = data.timestamp.apply(f)
    return data[::-1].apply(pd.to_numeric)

def check_coin():
    try:
        response = session.get_kline(category='linear', 
        symbol='BTCUSDT', 
        interval='D').get('result') 
    except: asyncio.run(send('오류 발생'))
    
    btc_market = get_market(response)
    now = dt.datetime.now()
    price = str(btc_market['open'].iloc[-1])
    chat = f'{now.year}년 {now.month}월 {now.day}일 비트코인 시세는 {price}달러입니다'

    asyncio.set_event_loop_policy(asyncio.DefaultEventLoopPolicy())
    asyncio.run(send(chat))

async def send(chat):

    bot = telegram.Bot(token)
    await bot.send_message(chat_id="-1002137634582", text=chat)

while True:
    now = dt.datetime.now()
    if now.hour == 0 and now.minute == 0:
        check_coin()
    time.sleep(60)

 

이로써 24시간 돌아가는 코인 시세 알림 봇을 완성했습니다.

 

코드만 바꾸면 따로 컴퓨터를 켜두지 않아도 원하는 기능을 24시간 동안 실행할 수 있습니다.

 

 

 

목차 - 

 

(0) 개요

https://wafla.tistory.com/4

(1) 바이비트 API를 사용해 코드 짜기

https://wafla.tistory.com/5

(2) 텔레그램 봇 만들기

https://wafla.tistory.com/6

 

 

참고 자료

 

oracle 클라우드 인스턴스 생성 & python 개발 환경 구축 : https://velog.io/@gyounghwan1002/oracle-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1-python-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95