본문 바로가기
Python

암호화폐 등락률 정보를 디스코드로 전달받기 (feat. Crypto Bubbles)

by Playdev 2024. 6. 2.
728x90

 

우연히 재미난 사이트를 알게 되었다.

https://cryptobubbles.net/ 라는 곳인데 암호화폐의 등락률을 버블 형태로 표현해주는 곳이다.

Crypto Bubbles

 

위 정보를 주기적으로 스냅샷을 떠서 확인할 수 있다면, 각 코인별 흐름을 참고할 수 있을 것 같았다.

생각했던 flow 는 대략 아래와 같다.

 

- python selenium 으로 특정 영역에 접근

- 특정 영역을 스냅샷 이미지로 저장

- 디스코드로 스냅샷 이미지 전달

 

Chat GPT 에게 질문을 통해 핵심 로직을 전달받았고, 약간의 수정을 통해 기능을 구현할 수 있었다.

디스코드로 전달받은 자동화 메시지

 

사용중인 코드 전체로 의존성은 아래와 같다.

pip install selenium webdriver-manager discord-webhook
import time

from discord_webhook import DiscordWebhook, DiscordEmbed
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1920,1080')
options.add_argument('--start-maximized')


def capture_element_screenshot():
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.set_page_load_timeout(30)

    driver.get('https://cryptobubbles.net/')
    driver.implicitly_wait(10)

    el = WebDriverWait(driver, 3).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="app"]/main/div[2]'))
    )

    time.sleep(10.0) # 버블이 자리를 잡을 정도의 시간을 벌어준다.

    screenshot = el.screenshot_as_png
    screenshot_path = 'cryptobubbles_screenshot.png'
    with open(screenshot_path, 'wb') as file:
        file.write(screenshot)

    driver.quit()

    return screenshot_path


def send_message(title, description, image_path):
    webhook = DiscordWebhook(
        '디스코드 웹훅 주소')
    with open(image_path, "rb") as f:
        webhook.add_file(file=f.read(), filename='img.jpg')

    embed = DiscordEmbed(title=title, description=description, color='03b2f8')
    embed.set_image(url='attachment://img.jpg')

    webhook.add_embed(embed)
    response = webhook.execute()

    if response.status_code != 200:
        print("[Discord 발송 실패] :: {}.".format(response))


if __name__ == '__main__':
    screenshot_path = capture_element_screenshot()
    send_message(title="실시간 Crypto Bubbles", description=None, image_path=screenshot_path)

 

 

728x90