다트 공시, 깃허브 액션으로 내 휴대폰 텔레그램으로 실시간 자동 알림 받기 - EP01
나의 컴퓨터를 계속 켜둘 수 없어 무료인 구글 코랩을 이용하려 했지만 코랩 또한 일정 시간이 지나면 작동을 멈추기 때문에 다른 방법이 더 필요했다. 그래서 역시 무료인 '깃허브 액션'을 사용해보려 한다.
총 2개의 글로 나눠서 작성할 예정이다. 그 중 1편은 깃허브에 관한 글이다. 1편이 너무 길어서 2편을 따로 만들건데, 이 부분은 텔레그램 설정과 테스트에 관한 내용이다. 이번 1편의 준비는 다트 API 인증키가 필요하다. 이 시리즈는 다트에서 원하는 종목의 공시를 내 휴대폰의 텔레그램으로 수신되는 과정이기 때문이다.
1. 준비 (다트 API 인증키 + 명령어 코드 파일 2개)
(1) 다트 API 인증키 필요
아래 2개의 파일은 메모장을 이용해 txt 파일을 만들어야 한다.
(2) main.py (명령서) 만들기
- 아래 코드를 드래그해서 메모장에 붙여넣기 한다.
- 메모장 저장 : 파일형식을 '모든 파일'로 한다. 파일이름을 'main.py'라고 저장한다.
이렇게 하면 첫 번째 파일이 만들어진다. 주의할 점은 확장자로 .txt를 붙이지 않는다. 정확한 파일명은 main.py 이다.
import requests
import os
MY_DART_KEY = os.environ.get('DART_API_KEY')
# 정찰 대상: 삼성전자 (종목코드: 005930)
STOCK_CODE = "005930"
STOCK_NAME = "삼성전자"
def check_disclosure():
print(f"📡 [시스템 가동] {STOCK_NAME} 실시간 공시 정찰을 시작합니다.")
# DART 서버에 연결하는 주소 설정
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':
print(f"✅ {STOCK_NAME} 공시 목록을 성공적으로 가져왔습니다.")
for item in data['list']:
print(f"- [{item['report_nm']}] (접수일: {item['rcept_dt']})")
else:
print(f"❌ 연결 실패: {data['message']} (인증키를 확인하세요)")
except Exception as e:
print(f"🚨 시스템 오류 발생: {e}")
if __name__ == "__main__":
check_disclosure()
(3) requirements.txt 만들기
- 아래 코드를 드래그해서 메모장에 붙여넣기 한다.
- 메모장 저장 : 파일형식을 '모든 파일'로 한다. 파일 이름은 requirements.txt 로 저장한다.
** 실수로 requests.txt로 저장된 파일을 올렸더니 에러가 떴다. 꼭 'requirements.txt' 파일 저장을 해 업로드해야 한다.
requests
이렇게 다트 API 인증키와 2개의 코드를 만들어 준비하면 된다.
2. 깃허브에 코드 올리기
(1) 아래 버튼으로 깃허브 공식 사이트로 이동해 가입한다.
저장소를 만들자
(2) 왼쪽 상단의 초록색의 'Create repository' 버튼을 클릭한다. 클릭하면 'Create a new repository' 라는 제목의 페이지가 나타난다.
(처음 가입 후 시작이 아니라면 왼쪽 'new' 초록색 버튼을 클릭하면 된다.)
(3) 'Repository name' (저장소 이름 입력) 을 만들어 입력한다.
(4) 'Description'(설명) 칸은 공란으로 두었다.
(5) 'Choose visibility'(표시여부)는 'Private' (비공개) 선택 : 코드 내부에 다트 API 인증키가 노출될 수 있어 비공개를 선택했다.
('Public' (공개 설정이다.)
(6) Add a README file (README 파일을 추가하세요.) ➡ '끄다'라고 되어 있는걸 클릭해서 활성화시킨다. (on)
(7) Add .gitignore (.gitignore 파일을 추가하세요) ➡ NO.gitignore (.gitignore 파일이 없습니다.)
(8) Add license (라이선스 추가) ➡ NO.license (라이선스 없음)
(9) 하단 초록색 'Create repository' (저장소 생성) 버튼을 클릭한다.
보안을 위해 깃허브 시크릿에 다트 API 인증키 등록 하기
위에 보면 코드에 다트 인증키를 삽입하고 깃허브에 비공개로 해도 되지만 보안을 위해 다트 API를 시크릿으로 저장하고, 코드에 직접적인 다트 API는 사용하지 않기 위해 아래 과정을 이행하는 것이다.
(10) 상단 오른쪽 'Settings' 메뉴를 클릭한다.
위에서 만든 저장소에 있는 상태여야 한다. 만든 저장소마다 토큰이나 아이디를 저장할 수 있다. 통합적으로 보관하는 개념이 아니라 프로젝트마다 보관하는 개념이다. 그러니까 프로젝트의 의도가 다르다면 각 보관하는 토큰이나 아이디도 달라지겠다.
(11) 왼쪽 메뉴의 'Secrets and variables' ➡ 'Actions'을 찾아 클릭한다.
(12) 초록색 'New repository secret' 버튼을 클릭한다.
(13) Name : DART_API_KEY (반드시 대문자로 입력)
(14) Secret : 본인의 다트 인증키를 복사해서 붙여넣고 아래 초록색 'Add secret' 버튼을 클릭한다.
Repository secrets 부분을 보면 자물쇠 아이콘이 있고, DART_API_KEY라는 이름이 확인된다. 이렇게 하면 나의 다트 API 인증키가 보안을 위해 잘 저장이 된 것이다.
파일 업로드와 설정
(15) 다시 만든 저장소로 돌아온다. (만들어 놓은 저장소 이름을 클릭하면 된다.) ➡ 초록색 '< > code' 버튼 왼쪽에 있는 '+' 버튼을 클릭한다.
(16) 두 개의 하위 목록이 나타나는데 'Upload files'(파일 업로드)를 클릭한다.
(17) 앞서 만들어둔 두 개의 코드 파일 main.py와 requirements.txt 파일을 'Drag files here to add them to your repository' 부분에 드래그해 놓는다.
(18) 바로 아래 업로드된 파일 이름들이 나타난다. (영문으로 업로드 되게 하자.)
* 주의 : 업로드 하는 모든 파일은 영문으로 업로드 하자!
(19) 아래 초록 버튼 'Commit changes' (변경사항을 커밋합니다) 버튼을 클릭한다.
* 파일을 추가해야 할 경우라면?
: 상단 초록 '< >code' 왼쪽 옆 '+' 버튼을 클릭해 파일을 업로드 하면 된다.
* 파일을 삭제해야 할 경우라면?
: 해당 파일 이름을 클릭한다. 우측 상단의 점3개 버튼을 클릭한다. 하위 메뉴 맨 아래 '파일을 삭제합니다.' 를 클릭 한다. 그리고 초록 버튼 '변경 사항을 커밋합니다.' 를 클릭해야 한다.
(20) 상단 메뉴 중 'Actions'(행위) 을 클릭한다.
(21) 클릭할 수 있는 버튼들이 많이 보이는데 상단의 한 문장을 클릭하면 된다. 'Skip this and set up a workflow yourself'(이 단계를 건너뛰고 직접 워크플로를 설정하세요)를 클릭한다.
(22) 왼쪽 '1 Enter file contents here' 부분에 아래 코드를 복사해 그대로 붙여넣기 한다.
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 }}
run: python main.py
(23) 우측 상단 초록색 'Commit changes...' (변경 사항을 저장) 버튼을 클릭한다.
(24) 창이 뜨면 아래 초록색 'Commit changes (변경 사항을 커밋합니다)' 버튼을 클릭한다.
(25) 두 개의 파일을 올렸는데 'main.yml' 하나만 보이니 조금 당황했다. 상단에 내가 만든 '저장소 이름'을 클릭하면 올린 두개의 main.yml , requirements.txt 파일이 확인된다. (README.md 까지 하면 총 3개의 파일이다.)
** 만약 빨간색 X가 떠 있다면, 해당 항목을 클릭해 들어가서 'build' -> 'Run script'를 확인하면 어디가 고장 났는지 영어로 알려준다. (대부분 파일 이름 오타 문제다.)
깃허브 내에서 작동이 잘 되는지 확인
이제 내가 올린 코드가 작동을 잘 하는지 확인해보자. 이건 깃허브안에서 코드가 작동이 잘 되는지 확인해보는 것이다. 나의 핸드폰 텔레그램으로 잘 전송이 되는지는 2편에서 텔레그램에 대한 설정을 해야 한다.
(26) 상단 메뉴 중 'Action' (행위)를 클릭한다.
(27) Ⓥ DART Disclosure Radar 라고 보이면 성공한 것이다. 이 문장을 클릭하자.
(28) Ⓥ build를 클릭한다.
(29) 'ⓋRun script' 를 클릭한다.
필자의 경우 아래와 같은 공시 제목이 나타났다.
📡 [시스템 가동] 삼성전자 실시간 공시 정찰을 시작합니다.
✅ 삼성전자 공시 목록을 성공적으로 가져왔습니다.
- [최대주주등소유주식변동신고서] (접수일: 20260508)
- [임원ㆍ주요주주특정증권등소유상황보고서] (접수일: 20260508)
- [주식등의대량보유상황보고서(일반)] (접수일: 20260504)
- [특수관계인에대한출자] (접수일: 20260430)
여기까지 헤매면서 성공했지만 아직 텔레그램으로 수신을 받는 것을 설정 후 테스트 해봐야 한다. 이건 다음 글에 남길 예정이다.
주식 자동화 시스템의 첫 걸음
단순 수집을 넘어 API 연결과 토큰 발행을 통한
원하는 종목의 실시간 이슈 확인 및 저장 시스템을 같이 만들어 보아요!
#깃허브액션사용법 #GitHubActions파이썬 #주식자동화시스템 #DART공시추적 #파이썬스케줄러 #서버없는자동화 #main.yml설정 #파이썬requirements #무료서버구축 #공시알림봇 #보안강화 #깃허브시크릿 #API키관리 #환경변수설정 #포트폴리오기록 #주식자동화 #다트(DART) #깃허브액션 #텔레그램알림 #파이썬 #자동공시정찰
댓글
댓글 쓰기