다트 공시, 깃허브 액션으로 실시간 자동 알림 받기 (텔레그램 봇 설정 및 연동 편) - EP02
깃허브의 사용 목적은 24시간 가동하려는 용도로 다트와 텔레그램의 중간 역할을 하는 것이다. 지난 에피소드 01의 글에서는 원하는 종목의 다트 공시를 깃허브 내에서 수신이 가능한지 테스트를 하는 과정으로 글을 마쳤다.
이번 글은 '다트 공시, 깃허브 액션으로 내 휴대폰 텔레그램으로 실시간 자동 알림 받기 - EP01'의 연장선으로 다트의 공시를 깃허브를 거쳐 텔레그램으로 수신받을 수 있게 자동화시켜 놓는 과정을 담았다.
원활한 자동화 구축을 위해 EP01의 기초 설정을 먼저 완료해야 한다.
GitHub Actions EP01 먼저 보기 →1. 준비사항
이번 과정에서는 텔레그램 봇 토큰과 Chat ID가 필요하다. 텔레그램 관련 준비사항은 다트 공시나 야후 파이낸스 지표 수치, 한경 리포트의 정보를 나의 휴대폰으로 수신하려면 필요하니 만들어야 한다.
이전 글에 텔레그램에서 봇 토큰과 Chat ID를 발급받는 과정을 남겨놓았으므로 해당 글을 참고해 만들면 된다.
📲 아직 텔레그램 봇 토큰과 Chat ID가 없다면 선행글에서 먼저 준비하면 된다.
텔레그램 봇 토큰 · Chat ID 준비하기 →2. 깃허브 시크릿에 텔레그램 봇 토큰과 Chat ID 등록하기
지난 글 '다트 공시, 깃허브 액션으로 내 휴대폰 텔레그램으로 실시간 자동 알림 받기 - EP01'에서도 보안을 위해 다트 API 인증키를 보관해 코드에 직접적인 인증키가 들어가지 않게 하는 과정을 거쳤다. 이번에도 텔레그램 봇 토큰과 Chat ID를 보안을 위해 저장한다.
* 번거롭지만 텔레그램 봇 토큰과 Chat ID를 하나씩 따로 등록해놓아야 한다. 두 번의 등록 과정을 거친다.
(1) 상단의 에피소드 01에서 만든 저장소 이름을 클릭한다.
(2) 상단 우측 'Settings' 메뉴를 클릭한다.
(3) 왼쪽 메뉴에서 'Secrets and variables' ➡ 'Actions'을 클릭한다.
(4) 오른쪽에 있는 초록색 'New repository secret' 버튼을 클릭한다.
(5) 'Name *' ➡ TELEGRAM_BOT_TOKEN 이라고 입력한다.
(6) 'Secret *'이라고 이름 지어진 칸에 봇 토큰을 붙여넣기 한다.
(7) 아래 초록색 'Add secret' 버튼을 클릭한다.
Repository secrets라고 이름 지어진 아래 칸에 보면 2개의 이름이 확인된다.
🔒 DART_API_KEY 🔒 TELEGRAM_BOT_TOKEN
(8) 'Repository secrets' 옆에 초록색 'New repository secret' 버튼을 클릭한다.
(9) 'Name *' ➡ TELEGRAM_CHAT_ID라고 입력한다.
(10) 'Secret *'이라고 이름 지어진 칸에 텔레그램 Chat ID 숫자들을 붙여넣기 한다.
(11) 아래 초록색 'Add secret' 버튼을 클릭한다.
Repository secrets라고 이름 지어진 아래 칸에 보면 총 3개의 이름이 확인된다.
🔒 DART_API_KEY 🔒 TELEGRAM_BOT_TOKEN 🔒 TELEGRAM_CHAT_ID
3. 텔레그램 수신 코드 넣기
깃허브 내에서 수신이 잘 되는지 확인했으니 이제 텔레그램으로 다트 공시 정보가 잘 수신되도록 코드를 변경해 업로드해야 하는 과정이 남았다.
** 텔레그램에 봇 토큰과 Chat ID로 아무 말이라도 남겨놓은 상태의 열어놓은 채팅방이 있어야 한다.
(12) 좌측 최상단 만들어둔 '저장소 이름'을 클릭해 해당 저장소로 이동한다.
(13) 목록 중 'main.py' 파일 이름을 클릭한다.
(14) 우측 상단 연필 모양의 아이콘을 클릭한다.
(15) 기존 코드를 모두 삭제한다.
(16) 삭제한 바로 그 공간에 아래 코드를 복사해 붙여넣기 한다.
import requests
import os
# 깃허브 Secrets에서 정보 가져오기
MY_DART_KEY = os.environ.get('DART_API_KEY')
TELEGRAM_TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN')
TELEGRAM_ID = os.environ.get('TELEGRAM_CHAT_ID')
# 정찰 대상 설정 (예: 삼성전자)
STOCK_CODE = "005930"
STOCK_NAME = "삼성전자"
def send_telegram_message(message):
"""텔레그램으로 메시지 발송"""
url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
payload = {
'chat_id': TELEGRAM_ID,
'text': message,
'parse_mode': 'HTML'
}
try:
requests.post(url, data=payload)
print("📢 [전송 완료] 텔레그램으로 보고를 마쳤습니다.")
except Exception as e:
print(f"🚨 [전송 실패] 텔레그램 발송 오류: {e}")
def check_disclosure():
print(f"📡 [시스템 가동] {STOCK_NAME} 실시간 공시 정찰 시작.")
url = f"https://opendart.fss.or.kr/api/list.json?crtfc_key={MY_DART_KEY}&corp_code={STOCK_CODE}&bgn_de=20240101&page_count=5"
try:
response = requests.get(url)
data = response.json()
if data['status'] == '000':
report_list = data['list']
latest = report_list[0]
report_msg = (
f"<b>[실시간 공시 보고]</b>\n\n"
f"🏢 종목: {STOCK_NAME}\n"
f"📄 공시명: {latest['report_nm']}\n"
f"📅 접수일: {latest['rcept_dt']}\n"
f"🔗 <a href='https://dart.fss.or.kr/dsaf001/main.do?rcpNo={latest['rcept_no']}'>공시 상세보기</a>"
)
send_telegram_message(report_msg)
else:
print(f"❌ 데이터 수신 실패: {data['message']}")
except Exception as e:
print(f"🚨 시스템 오류: {e}")
if __name__ == "__main__":
check_disclosure()
(17) 상단 우측의 초록색 'Commit changes...' 버튼을 클릭한다.
(18) 팝업창이 뜨면 하단 'Commit changes' 버튼을 클릭한다.
여기서 실제로 한 번 막혔다.
이 다음에는 텔레그램으로 다트 공시 내용이 수신되어야 하는데 실패해서 헤맸었다. 깃허브 시크릿에 저장해둔 텔레그램 봇 토큰과 Chat ID를 GitHub Actions에 연결해주는 작업을 추가로 거쳐야 했다. 이 글은 내가 직접 해보면서 헤맨 과정을 기록하는 글이라 조금 미흡하긴 하다.
(19) 상단 메뉴 중 '< > Code' 메뉴를 클릭한다.
(20) .github/workflows 폴더 클릭 ➡ 'main.yml' 파일을 클릭한다.
(21) 우측 상단 연필 모양의 아이콘을 클릭한다. 수정하려는 것이다.
(22) 기존 코드를 삭제하고 아래 코드를 복사해 붙여넣기해서 교체한다. 설명이 어려워서 그냥 통째로 넣게 했다.
** 여기서 주의할 점이 있는데 들여쓰기를 잘 해야 한다. 잘못되었다면 빨간 밑줄이 생길 것이다. 빨간 밑줄이 생기지 않아야 한다.
name: DART Disclosure Radar
on:
schedule:
- cron: '0 0-9 * * 1-5'
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: |
pip install -r requirements.txt
- name: Run script
env:
DART_API_KEY: ${{ secrets.DART_API_KEY }}
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
run: |
python main.py
※ 2026년 10월 현재
위 코드는 이 글을 작성할 당시 내가 실제로 사용했던 GitHub Actions 설정이라 그대로 남겨두었다.
GitHub Actions에서 사용하는 Action의 버전은 시간이 지나면서 바뀔 수 있다. 지금 새로 자동화 환경을 만든다면 최신 GitHub Actions 공식 문서를 확인해 현재 버전에 맞춰 작성하는 것이 좋겠다.
(23) 우측 상단의 초록색 'Commit Changes' 버튼을 클릭한다.
(24) 팝업창이 뜨면 하단 'Commit changes' 버튼을 클릭한다.
(25) 상단 메뉴 중 'Actions'을 클릭한다.
(26) 왼쪽 메뉴 중 'DART Disclosure Radar'를 클릭한다.
(27) 우측 버튼 'Run workflow'를 클릭 ➡ 아래 초록색 'Run workflow' 버튼을 클릭한다.
(28) 텔레그램 대화창을 확인한다.
필자의 텔레그램 대화창에 아래와 같은 정보가 수신되었다.
[실시간 공시 보고]
🏢 종목: 삼성전자
📄 공시명: 임원ㆍ주요주주특정증권등소유상황보고서
📅 접수일: 20260513
🔗 공시 상세보기
이렇게 텔레그램으로 다트 공시 정보의 내용이 도착한다면 성공이다.
※ 2026년 10월 현재, ChatGPT와 다시 작업한다면
이 글을 작성할 당시에는 main.py를 수정한 뒤 텔레그램으로 공시가 바로 들어올 거라고 생각했는데 실제로는 수신되지 않았다. 그 뒤 다시 원인을 찾아보면서 GitHub Secrets에 저장한 텔레그램 봇 토큰과 Chat ID를 workflow에도 연결해야 한다는 것을 알게 됐다.
지금 다시 작업한다면 현재 저장소의 main.py와 main.yml 코드, 발생한 오류 내용을 ChatGPT에게 보여주고 어느 부분이 연결되지 않았는지 함께 확인하는 방식으로 진행할 수 있을 것 같다. 특히 YAML처럼 들여쓰기 때문에 오류가 날 수 있는 파일은 전체 코드를 만들어달라고 한 뒤 통째로 교체하는 방식이 나에게는 더 편할 것 같다.
다만 이 자동화 환경을 현재의 ChatGPT와 처음부터 다시 구축해본 것은 아니다. 이 글의 코드는 당시 실제로 작업했던 기록으로 남겨두고, 지금 새로 만든다면 현재 환경과 버전을 다시 확인하면서 진행하는 것이 좋겠다.
댓글
댓글 쓰기