roeniss / dhlottery-api Goto Github PK
View Code? Open in Web Editor NEW비공식 동행복권 API
License: Apache License 2.0
비공식 동행복권 API
License: Apache License 2.0
https://pypi.org/project/dhapi/
not showing on there
아 이게... 생각과 달리 몇몇 의존성이 잘 반영이 안된 것 같다.
완전 클린한 환경 (vm) 에서 설치해보고 누락된거 추가해야겠다. (ex. requests)
#12 의 선행작업
[Lotto645 Buy Request]
Game A: []
Game B: []
Game C: []
Game D: []
Game E: []
❓ 위와 같이 구매하시겠습니까? [Y/n] yes
✅ --quiet 플래그가 주어져 자동으로 구매를 진행합니다.
2023-06-25 08:14:33 [error ] 🚨 에러가 발생했습니다: 구매에 실패했습니다: 비정상적인 방법으로 접속하였습니다. 정상적인 PC 환경에서 접속하여 주시기 바랍니다.
🚨 에러가 발생했습니다: 구매에 실패했습니다: 비정상적인 방법으로 접속하였습니다. 정상적인 PC 환경에서 접속하여 주시기 바랍니다.
이러한 메시지가 나오면서 안됩니다 ㅠㅠ 맥이나 우분투 둘다 시도했는데 동일합니다. 1.4.0버전이고 1.3.5 버전에서도 유사한 에러가 나옵니다. 저번주까지는 되었는데 이번주에는 갑자기 안되네요 ㅠㅠ 어떻게 해결하면 될까요?
출력이 위험한 경우를 고려하여, 이 부분을 개발하기로 함
자동화를 하고 싶은데 문제는 비밀번호를 입력하는 부분이 있어서 자동화가 어려울듯해서 비밀번호를 넣어주는 부분을 파라매터로 수정가능하실까요?
또한 잔액이 확인 가능하면 일정수준 이하의 잔액이 남았을때 알려줄수 있을듯해서
남은 잔액 정보가 있다면 출력이 가능하실까요?
readme.md
에는 사용자 계정 정보 입력 관련하여 다음과 같이 기재되어 있습니다.~/.dhapi/credentials
파일에 username, password를 입력하면 자동으로 로그인합니다.
profile을 여러개 설정할 수 있습니다.
Note
TOML 문법을 사용합니다. 따라서 value 값은 쌍따옴표를 사용해야 합니다.
DHAPI_USERNAME=asdf
DHAPI_PASSWORD=****
mkdir -p ~/.dhapi
cd ~/.dhapi
echo "[default]" > credentials
echo username = "$DHAPI_USERNAME" >> credentials # username
echo password = "$DHAPI_PASSWORD" >> credentials # password (미리 복잡한 난수로 변경하시길 권장합니다)
DHAPI_USERNAME=\"asdf\"
DHAPI_PASSWORD=\"****\"
mkdir -p ~/.dhapi
cd ~/.dhapi
echo "[default]" > credentials
echo username = "$DHAPI_USERNAME" >> credentials # username
echo password = "$DHAPI_PASSWORD" >> credentials # password (미리 복잡한 난수로 변경하시길 권장합니다)
위와 같이 \를 명시해줌으로써 쌍따옴표가 static하게 입력됨을 알려주면 좋을 듯 합니다.
credentials 파일에는 쌍따옴표 없이 들어오므로, arg_parser.py
에서 이를 toml의 value값으로 인식되게끔 코드를 개선할 수 있습니다.
not documented yet!
안녕하세요
좋은 소스코드 볼수 있어서 정말 좋습니다
최근 동행 로또 로그인 부분이 스크립트로 변경이 된 듯합니다
정상적인 로그인이 되지 않는 듯 하여 ISSUE 남겨 봅니다
감사합니다
로그가 들쑥날쑥하다. 레벨도, 포맷팅도, 정보량도..
통일할 필요가 있어 보임.
있으면 귀여울 것 같음
dhapi buy_lotto645 -q # 프로필 파일을 이용해 계정 정보 입력 & 자동모드로 5장 구매
dhapi --help 쪽에 써둔것과 동일한 문구로 변경할 것. -q
는 자동모드를 의미하는게 아니라 자동모드
를 확인 프롬프트 없이 구매하는 것을 말한다.
이쁘게 설명하기가 어려운 부분이다..
I suggest to add crontab -e example code
on README.md
.
crontab -e
0 0,6-23 * * * PATH=$PATH:/opt/homebrew/bin && dhapi buy_lotto645 -q
html 이 바뀐 것으로 추정됨.
아래 내용이 ./docs/CONTRIBUTING.md
에 들어있는게 좋겠다.
$ PYTHONPATH=./src/ python3 src/dhapi/main.py buy_lotto645 -u $USER_ID -q
make lintfmt
을 한 번 실행할 것안녕하세요.
덕분에 커맨드 한 줄로 편하게 구입이 가능해서 좋네요. 기여 감사합니다.
그런데 대부분 고정인 파라미터들은 default값으로 넣는건 어떨까요?
대다수 사용자가 로또 구입이 목표일테니 현재 기준으로만 default를 설정해도 될 것 같아서요.
다만 어떤걸 사고 있는지 인지가 힘들 수 있으니 password 받기 전에 현재 구입하는 복권 타입들을 출력해줘도 좋고요.
그럼 아래처럼 id, 개수만으로 실행할 수 있을 것 같습니다.
dhapi -U $YOUR_ID -C 5
의견이니 참고만 해주세요. 다시 한번 감사합니다!
혹시 -u 옵션에서 passwd 묻지 않고 옵션으로 받을 수 있는 기능이 있나요?
없으면 구현하실 예정이 있으신가요?
어딜 어떻게 추가할 지 전략적으로 판단해야 함
pyenv 등을 사용해서 3.8 버전으로 실행
Traceback (most recent call last):
File "/opt/homebrew/bin/dhapi", line 8, in <module>
sys.exit(main())
^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/dhapi/main.py", line 5, in main
entrypoint()
File "/opt/homebrew/lib/python3.11/site-packages/dhapi/router/router.py", line 7, in entrypoint
arg_parser = ArgParser()
^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/dhapi/router/arg_parser.py", line 25, in __init__
installed_version, _ = get_versions()
^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/dhapi/router/version_checker.py", line 20, in get_versions
dist = JohnnyDist(PACKAGE_NAME)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/johnnydep/lib.py", line 81, in __init__
self.import_names, self.metadata = _get_info(
^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/cachetools/__init__.py", line 702, in wrapper
v = func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/johnnydep/lib.py", line 477, in _get_info
data = pipper.get(
^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/cachetools/__init__.py", line 737, in wrapper
v = func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/johnnydep/pipper.py", line 236, in get
target, _headers = _download_dist(url, scratch_file, index_url, extra_index_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/johnnydep/pipper.py", line 105, in _download_dist
target, _headers = urlretrieve(url, scratch_file, auth=auth)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/johnnydep/compat.py", line 38, in urlretrieve
res = opener.open(url, data=data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.4/Frameworks/Python.framework/Versions/3.11/lib/python3.11/urllib/request.py", line 503, in open
req = Request(fullurl, data)
^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.4/Frameworks/Python.framework/Versions/3.11/lib/python3.11/urllib/request.py", line 322, in __init__
self.full_url = url
^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.4/Frameworks/Python.framework/Versions/3.11/lib/python3.11/urllib/request.py", line 348, in full_url
self._parse()
File "/opt/homebrew/Cellar/[email protected]/3.11.4/Frameworks/Python.framework/Versions/3.11/lib/python3.11/urllib/request.py", line 377, in _parse
raise ValueError("unknown url type: %r" % self.full_url)
ValueError: unknown url type: 'dhapi-2.0.0-py3-none-any.whl.metadata'
reference : https://github.com/techinpark/lottery-bot/tree/main/.github/workflows
개인적으로, 저는 "최소한의 손맛"을 느끼기 위해, 매주 수동으로 스크립트를 실행해 구매하는 편에 만족하고 있습니다.
그러나 어떤 분은 위 레퍼런스처럼, 자동구매하는 Github Actions 를 하나 추가하는 쪽을 선호하실 것 같습니다.
만약 그런 분이 계시다면 주저없이 기여해주세요! 필요하시다면 서포트하겠습니다.
현재 버전에서 수동구매 가능한가요?
dhapi show-balance
명령어로 예치금을 조회하면 다음과 같이 오류가 발생합니다.
tomli.TOMLDecodeError: Invalid value (at line 2, column 12)
trace 로그를 보면 구매불가능금액을 처리하던 중 오류가 발생한 것 같습니다.
Traceback (most recent call last): File "/Users/name/WorkSpace/PythonProjects/lottery/.venv/lib/python3.12/site-packages/dhapi/port/lottery_client.py", line 186, in show_balance 구매불가능금액 = self._parse_digit(elem.select("td.ta_right")[6].contents[0]) # (예약구매금액 + 출금신청중금액)
버전은 4.0.2 버전을 사용했습니다.
좋은 기능 만들어주셔서 매주 잘 사용하고 있습니다.
감사합니다.
제공할지 안할지 부터 판단해야 함
https://news.hada.io/comment?id=15761 에서 파생된 이슈
구매 결과 끝에 3 붙어서 나옵니다
실제 구매 번호
A 자동 24 26 29 36 37 45
B 자동 1 5 17 21 39 45
C 자동 5 18 32 40 42 43
D 자동 12 14 28 33 39 45
E 자동 1 7 20 40 41 42
cli 결과
Numbers:
A|24|26|29|36|37|453
B|01|05|17|21|39|453
C|05|18|32|40|42|433
D|12|14|28|33|39|453
E|01|07|20|40|41|423
최신버전을 1.3.1 로 인식한다. 뭔가 잘못되었다.
M2 맥에서 실행 시 아래와 같이 나옵니다
~/work ❯ dhapi -u ## -p ## -C lotto645 -t buy -c 5 -m auto
Password:
usage: dhapi [-h] -U USERNAME -P -K {lotto645} -T {buy} -C COUNT -M {auto}
dhapi: error: argument -C/--count: invalid int value: 'lotto645'
이젠 비밀번호 치는것도 귀찮다. 그렇다고 bash history 에 남기긴 싫어서...
~/.dhapiconfig
정도면 될 듯
https://github.com/techinpark/lottery-bot/blob/main/win720.py
이 api를 이용한 자동화 repo를 먼저 알게 되어 win720 구현 후 PR 했는데요, 만약 여기에 PR할 생각있으신분은 참고하시라고 이슈에 남깁니다..
저는 제가 쓸거라 무조건 5장을 구매하도록 했기때문에, 이 API에서는 옵션으로 장 수를 선택하는 작업이 필요합니다
적당히 raise XXXError("asdasd") 로 에러 처리 하고 있었는데, 이 메시지("asdasd")만 잘 나오게 글로벌 인터셉트 붙이고 싶음. (not whole stacktrace)
사실 모든 버전에서 테스트해보지 않음.
https://news.hada.io/comment?id=15761 에서 제보되었기 때문에 구체적으로 검사하기로 함
setup.py을 잘못 작성했나보다. 디펜던시 없다는 오류를 만남.
현재는 수동으로 의존성 (bs4 등)을 다 깔아주어야 하는 상황임
현재는 아래와 같은 에러가 발생합니다.
Traceback (most recent call last):
File "/opt/homebrew/bin/dhapi", line 8, in <module>
sys.exit(main())
File "/opt/homebrew/lib/python3.9/site-packages/dhapi/main.py", line 5, in main
entrypoint()
File "/opt/homebrew/lib/python3.9/site-packages/dhapi/router/router.py", line 9, in entrypoint
ctrl = Lotto645Controller(arg_parser.get_user_id(), arg_parser.get_user_pw())
File "/opt/homebrew/lib/python3.9/site-packages/dhapi/purchase/lotto645_controller.py", line 7, in __init__
self.client = LotteryClient()
File "/opt/homebrew/lib/python3.9/site-packages/dhapi/client/lottery_client.py", line 34, in __init__
self._set_default_session()
File "/opt/homebrew/lib/python3.9/site-packages/dhapi/client/lottery_client.py", line 46, in _set_default_session
raise KeyError("JSESSIONID cookie is not set in response")
KeyError: 'JSESSIONID cookie is not set in response'
에러 코드를 정의해서 출력하면 좋을 것 같습니다.
점검 중 여부 확인은 점검 중에 동행복권 사이트에 접속을 시도하면,
307 Temporary Redirect 상태 코드를 반환하며,
https://dhlottery.co.kr/index_check.html
로 redirect 되고있는 behavior를 활용하면 될 것 같습니다.
I suggest to use multiple account. (like aws credentials.)
# cat ~/.dhapi/credentials
[default]
id = asdf
pw = 1234
[sg]
id = qwer
pw = 5678
...
dhapi buy_lotto645 -q # default
dhapi buy_lotto645 -q --profile sg # sg
I will make pr. thx
별로 의미가 없어보임.
quite 라는 표현은 "always say yes" 를 담기에 적절치 못한 단어라고 생각함.
1장 구매 시 다음과 같은 에러가 발생합니다.
$ dhapi buy_lotto645 -g
Traceback (most recent call last):
File "/Users/hapi/.pyenv/versions/3.8.18/bin/dhapi", line 8, in <module>
sys.exit(main())
File "/Users/hapi/.pyenv/versions/3.8.18/lib/python3.8/site-packages/dhapi/main.py", line 5, in main
entrypoint()
File "/Users/hapi/.pyenv/versions/3.8.18/lib/python3.8/site-packages/dhapi/router/router.py", line 7, in entrypoint
arg_parser = ArgParser()
File "/Users/hapi/.pyenv/versions/3.8.18/lib/python3.8/site-packages/dhapi/router/arg_parser.py", line 84, in __init__
credentials = config_util.get(group="dhapi", context="credentials", profile=self._args.profile[0])
File "/Users/hapi/.pyenv/versions/3.8.18/lib/python3.8/site-packages/seunggabi_core_python/util/config_util.py", line 36, in get
return config._sections[profile]
KeyError: 'default'
🌍WARN The running flyctl agent (v0.0.492) is older than the current flyctl (v0.0.503).
flyctl 쪽에선 구버전 cli 를 쓰면 위와 같이 업데이트 하라고 권유한다. 이러한 기능을 추가해보자.
신 버전이 있습니다. `pip install dhapi --upgrade` 로 최신버전을 받아보세요.
+) 혹은 나아가 Y 를 누르면 업데이트가 되도록?
parser.add_argument("-v", "--version", action="version", version="%(prog)s " + installed_version)
이 라인을 주석치지 않으면 로컬에서 run 해볼 수 없는 상황이다.
바로 윗줄인 installed_version, _ = get_versions()
에서 정상적으로 값이 안넘어오는 것 같다.
현재는 배포할 때마다 두 군데를 수정하고 있다.
Fail to purchase (reason: 현재 시간은 판매시간이 아닙니다.)
https://github.com/roeniss/dhlottery-api/blob/main/docs/CONTRIBUTING.md#배포
배포할 때마다, setup.py 와 arg_parser.py 의 버전 정보를 수동으로 갱신해주고 있습니다.
이걸 한 곳으로 통일할 방법이 필요함
from #6
또한 잔액이 확인 가능하면 일정수준 이하의 잔액이 남았을때 알려줄수 있을듯해서
남은 잔액 정보가 있다면 출력이 가능하실까요?
커스텀 로거가 제대로 설정이 안된 것 같다.
https://stackoverflow.com/a/7621965/8556340 의 조언을 따르는게 나을 것 같다.
현재 상태:
.venv ❯❯❯ PYTHONPATH=./src/ python3 src/dhapi/main.py buy_lotto645 -q
[Lotto645 Buy Request]
Game A: ['x', 'x', 'x', 'x', 'x', 'x']
Game B: ['x', 'x', 'x', 'x', 'x', 'x']
Game C: ['x', 'x', 'x', 'x', 'x', 'x']
Game D: ['x', 'x', 'x', 'x', 'x', 'x']
Game E: ['x', 'x', 'x', 'x', 'x', 'x']
----------------------
❓ 위와 같이 구매하시겠습니까? [Y/n] yes
✅ --quiet 플래그가 주어져 자동으로 구매를 진행합니다.
2023-05-07 15:37:25 [error ] 🚨 에러가 발생했습니다: 구매에 실패했습니다: 현재 시간은 판매시간이 아닙니다.
🚨 에러가 발생했습니다: 구매에 실패했습니다: 현재 시간은 판매시간이 아닙니다.
make lintfmt
를 돌려줄 github action 이 필요하다
현재 사용자는 dhapi에 다음과 같이 사용자 정보를 입력합니다:
DHAPI_USERNAME=qwer
DHAPI_PASSWORD=5678
cd ~/.dhapi
echo "" >> credentials
echo "[qwer]" >> credentials
echo username = $DHAPI_USERNAME >> credentials
echo password = $DHAPI_PASSWORD >> credentials
이 방법은 일반 사용자에게 어려울 수 있고, 새로운 사용자에게 README.md 파일을 읽어야 한다는 불편함이 있습니다.
따라서, 아래와 같은 기능 추가를 제안합니다.
제안 1:
>>> dhapi buy_lotto645
계정 정보가 존재하지 않습니다. 계정 정보를 입력해주세요.
Username:
Password:
이 경우, Username을 입력하면 해당 사용자에 맞는 계정 정보가 생성되며, 파일에는 아래와 같이 저장되면 좋을 것 같습니다.
[default]
Username: (사용자 ID)
Password: (사용자 PW)
제안 2:
>>> dhapi buy_lotto645 -p asdf
프로필 명에 해당하는 계정 정보가 존재하지 않습니다. 계정 정보를 입력해주세요.
(위와 동일)
이 경우, 커맨드 라인에서 프로파일 명을 입력하였으므로, Username을 입력하였을 때 계정 정보가 생성되며, 파일에는 아래와 같이 저장되면 좋을 것 같습니다.
[asdf]
Username: (사용자 ID)
Password: (사용자 PW)
현재 API가 아래와 같이 작동하고 있는데, 이는 향후 기능 추가를 위해 남겨진 것인지, 아니면 아래와 같이 수정해도 되는지 궁금합니다.
현재
❯❯❯ dhapi buy_lotto645 -q
제안
❯❯❯ dhapi -q
'buy_lotto645'를 넘어서 다른 기능들을 추가할 계획이 있는지, 혹은 제안한 API의 변경사항이 향후 계획과 부합하는지 확인해주실 수 있나요?
빈 슬롯에 "*" 이 필요할거 같지 않습니다. 아래처럼 하면 될거 같아요..
manual mode:
-g 1,2,3,4,5,6
semi-auto mode: 6개 미만으로 입력하면 나머지 숫자는 자동으로 ...
-g 1,2,3
auto mode: 전체 자동
-g auto
위 내용까지 적용해서 실제 manual, semi-auto 도 동작하도록 PR 올렸습니다. #31
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.