-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcaptcha.py
More file actions
87 lines (62 loc) · 2.17 KB
/
captcha.py
File metadata and controls
87 lines (62 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import asyncio
import logging
import re
from pathlib import Path
import zendriver
from websockets import ConnectionClosedError
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
LOG_PATH = Path.cwd() / "logs"
LOG_PATH.mkdir(parents=True, exist_ok=True)
file_handler = logging.FileHandler(filename=str(LOG_PATH / "log.txt"), encoding="cp949")
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
class TokiCaptcha:
CAPTCHA_URL = "https://manatoki469.net/bbs/captcha.php"
PAGE_LOAD_DELAY = 1.0
def __init__(self, args):
self.captcha = args.captcha
async def run(self):
if not self.captcha:
return
browser = await zendriver.start(
headless=False
)
await self.load_cookies(browser)
page = await browser.get(TokiCaptcha.CAPTCHA_URL)
await self.wait_until_captcha_pass(page)
await self.save_cookies(browser)
await self.stop_browser(browser)
logger.info(f"CAPTCHA completed")
async def wait_until_captcha_pass(self, page):
while True:
if self.is_browser_stopped(page):
break
if self.is_captcha_passed(page):
break
await asyncio.sleep(TokiCaptcha.PAGE_LOAD_DELAY)
def is_browser_stopped(self, page):
return page.browser.stopped
def is_captcha_passed(self, page):
return re.match(f"{TokiCaptcha.CAPTCHA_URL}.*", page.url) is None
async def load_cookies(self, browser):
try:
await browser.cookies.load()
except FileNotFoundError:
pass
async def save_cookies(self, browser):
try:
await browser.cookies.save()
except ConnectionClosedError:
pass
async def stop_browser(self, browser):
try:
await browser.stop()
except ConnectionClosedError:
pass