Github Actions으로 로또 자동 구매하기 (지속적 로또)

·2023년 5월 13일
89
post-thumbnail

TL;DR

인터넷 로또 구매가 가능하더라고요.
매주 토요일 아침 08:55에 로또 1천원 자동 구매를 걸어둡니다.

준비물

구축하기

GitHub Private 저장소 생성

🔒 Private 로 생성해주세요.
예) 저장소 이름 : lotto-action

소스코드 작성

2개의 파일이 필요합니다.
action.yml
buy_lotto.py

.github/workflows/ 하위 경로에 action.yml 있어야만 GitHub Actions 이 동작합니다!

$ root@master:github-action# tree -al -I '.git'
.
├── .github
│   └── workflows
│       └── action.yml
├── README.md
└── buy_lotto.py

action.yml

name: Lotto Buy Bot (로또 구매봇)

#on: [push]
on:
  schedule:
    - cron: '55 23 * * 5' # UST 기준의 크론. UST 23:55 는 KST 08:55

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.7]

    steps:
    - uses: actions/checkout@v2
    - name: Set up python ${{ matrix.python-version }}
      uses: actions/setup-python@v1
      with:
        python-version: ${{ matrix.python-version }}
    
    - name: Install python package
      run: |        
        pip install selenium
        pip install requests        
        pip install twython
        pip install pillow    
        pip install gspread        
        pip install --upgrade google-api-python-client oauth2client
        pip install playwright
        python -m playwright install ${{ matrix.browser-channel }} --with-deps
    
    - name: Install ubuntu package
      run: |        
        sudo apt-get install fonts-unfonts-core
        sudo apt-get install fonts-unfonts-extra
        wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add        
        sudo apt-get install google-chrome-stable    
        wget https://chromedriver.storage.googleapis.com/100.0.4896.20/chromedriver_linux64.zip
        unzip ./chromedriver_linux64.zip           
      
    - name: Run!      
      run: |        
        python ./buy_lotto.py

수정1과 수정2를 본인의 동행복권 아이디와 패스워드로 변경해주세요.

buy_lotto.py

from playwright.sync_api import Playwright, sync_playwright
import time

# 동행복권 아이디와 패스워드를 설정
USER_ID = '<아이디>' # 수정1
USER_PW = '<비밀번호>' #수정2

# 구매 개수를 설정
COUNT = 1

def run(playwright: Playwright) -> None:

    # chrome 브라우저를 실행
    browser = playwright.chromium.launch(headless=True)
    context = browser.new_context()

    # Open new page
    page = context.new_page()

    # Go to https://dhlottery.co.kr/user.do?method=login
    page.goto("https://dhlottery.co.kr/user.do?method=login")

    # Click [placeholder="아이디"]
    page.click("[placeholder=\"아이디\"]")

    # Fill [placeholder="아이디"]
    page.fill("[placeholder=\"아이디\"]", USER_ID)

    # Press Tab
    page.press("[placeholder=\"아이디\"]", "Tab")

    # Fill [placeholder="비밀번호"]
    page.fill("[placeholder=\"비밀번호\"]", USER_PW)

    # Press Tab
    page.press("[placeholder=\"비밀번호\"]", "Tab")

    # Press Enter
    # with page.expect_navigation(url="https://ol.dhlottery.co.kr/olotto/game/game645.do"):
    with page.expect_navigation():
        page.press("form[name=\"jform\"] >> text=로그인", "Enter")
    
    time.sleep(5)
    
    page.goto(url="https://ol.dhlottery.co.kr/olotto/game/game645.do")    
    # "비정상적인 방법으로 접속하였습니다. 정상적인 PC 환경에서 접속하여 주시기 바랍니다." 우회하기
    page.locator("#popupLayerAlert").get_by_role("button", name="확인").click()
    print(page.content())

    # Click text=자동번호발급
    page.click("text=자동번호발급")
    #page.click('#num2 >> text=자동번호발급')

    # 구매할 개수를 선택
    # Select 1
    page.select_option("select", str(COUNT))

    # Click text=확인
    page.click("text=확인")

    # Click input:has-text("구매하기")
    page.click("input:has-text(\"구매하기\")")

    time.sleep(2)
    # Click text=확인 취소 >> input[type="button"]
    page.click("text=확인 취소 >> input[type=\"button\"]")

    # Click input[name="closeLayer"]
    page.click("input[name=\"closeLayer\"]")
    # assert page.url == "https://el.dhlottery.co.kr/game/TotalGame.jsp?LottoId=LO40"

    # ---------------------
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

동작 확인하기

lotto-action 저장소에 위에 작성한 action.ymlbuy_lotto.py 2개의 파일을 업로드 합니다.
토요일 오전 08:55 분에 동작합니다. (약 2분 소요)
Actions 탭에서 실행 결과를, 로또 마이페이지에서 구매 결과를 확인할 수 있습니다.


참고

20개의 댓글

comment-user-thumbnail
2023년 5월 16일

테스트 포함해서 지난주 3장을 샀다. 모두 낙첨ㅠ

답글 달기
comment-user-thumbnail
2023년 5월 16일

재밌는 아이디어네요 ㅎㅎ

1개의 답글
comment-user-thumbnail
2023년 5월 17일

우와 감사합니다 저한테 꼭 필요한 기능인데 따라 만들어야겠네요

1개의 답글
comment-user-thumbnail
2023년 5월 17일

매주 리치리치 입장권구매하는사람입장에서
당첨되었는데 봇으로 구매하셨으니 무효 입니다 라곤 하지 않겠죠??

답글 달기
comment-user-thumbnail
2023년 5월 21일

git hub actions 라는 기능이 있군요! 매크로 사용할 때 스케줄러가 고민이었는데 정보 감사합니다

답글 달기
comment-user-thumbnail
2023년 5월 22일

계정 정보를 암호화하고 public으로 할 수 있는 방법을 찾았어요!

답글 달기
comment-user-thumbnail
2023년 5월 22일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2023년 5월 23일

똑같이 따라해봤는데 timeout 에러가 발생합니다...! ㅜㅜ
혹시 도움주실 수 있나요?

2개의 답글
comment-user-thumbnail
2023년 5월 29일

안녕하세요! 보고 너무 흥미로워서 바로 해봤습니다!

slack hooking이랑 조금 소스 첨가한 뒤에 public repo로 활용하는 형태로 만들어봤습니다!! https://github.com/Nuung/auto-lotto-gitaction

원작자 분이 계시니 public으로 하는게 조심스러워 댓글 남겨요~ 혹시 염려되시는 부분 있으면 바로 초지하겠습니다!

1개의 답글
comment-user-thumbnail
2023년 5월 30일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2023년 6월 28일

py 실행까지는 됐는데 Error: Process completed with exit code 1. 이 출력하고 실패했습니다 ㅠㅠ
뭐가 문제였을까요??
(자답) => 패스워드를 잘못쳤다.
ㅎㅎㅎㅎ 죄송합니다.

시원하게 성공하네요.

답글 달기
comment-user-thumbnail
2023년 7월 26일

저 드디어!!! 당첨 됐네요.
매주 2장씩 구매하고 있습니다.

몇등은 비밀입니다. ^^;;

답글 달기
comment-user-thumbnail
2023년 11월 12일

좋은 정보 감사합니다 ㅎ

답글 달기