Trigger KDocs WeChat login flow

This commit is contained in:
2026-01-07 13:26:31 +08:00
parent d8897f893a
commit b78bc7935f

View File

@@ -210,6 +210,12 @@ class KDocsUploader:
return False return False
except Exception: except Exception:
return False return False
try:
login_btn = self._page.get_by_role("button", name="立即登录")
if login_btn.is_visible(timeout=1200):
return False
except Exception:
pass
try: try:
login_btn = self._page.get_by_role("button", name="登录") login_btn = self._page.get_by_role("button", name="登录")
if login_btn.is_visible(timeout=1200): if login_btn.is_visible(timeout=1200):
@@ -235,37 +241,27 @@ class KDocsUploader:
return os.path.exists(storage_state) return os.path.exists(storage_state)
def _ensure_login_dialog(self) -> None: def _ensure_login_dialog(self) -> None:
try: login_names = ["登录并加入编辑", "立即登录", "登录"]
login_btn = self._page.get_by_role("button", name="登录并加入编辑") wechat_names = ["微信登录", "微信扫码登录", "微信扫码", "扫码登录"]
if login_btn.is_visible(timeout=1500): pages = self._iter_pages()
login_btn.click() clicked = False
time.sleep(1) for page in pages:
except Exception: for name in login_names:
pass if self._try_click_role(page, "button", name):
clicked = True
try: break
login_btn = self._page.get_by_role("button", name="登录") if clicked:
if login_btn.is_visible(timeout=1500): continue
login_btn.click() for name in login_names:
time.sleep(1) if self._try_click_role(page, "link", name):
except Exception: clicked = True
pass break
if clicked:
try: time.sleep(1.5)
login_link = self._page.get_by_role("link", name="登录") pages = self._iter_pages()
if login_link.is_visible(timeout=1500): for page in pages:
login_link.click() if self._try_click_names(page, wechat_names):
time.sleep(1) return
except Exception:
pass
try:
wechat_btn = self._page.get_by_role("button", name="微信登录")
if wechat_btn.is_visible(timeout=3000):
wechat_btn.click()
time.sleep(1.5)
except Exception:
pass
def _capture_qr_image(self) -> Optional[bytes]: def _capture_qr_image(self) -> Optional[bytes]:
pages = self._iter_pages() pages = self._iter_pages()
@@ -382,6 +378,46 @@ class KDocsUploader:
pass pass
return best return best
def _try_click_role(self, page, role: str, name: str, timeout: int = 1500) -> bool:
try:
el = page.get_by_role(role, name=name)
if el.is_visible(timeout=timeout):
el.click()
time.sleep(1)
return True
except Exception:
return False
return False
def _try_click_names(self, page, names: list) -> bool:
for name in names:
if self._try_click_role(page, "button", name, timeout=1200):
return True
if self._try_click_role(page, "link", name, timeout=1200):
return True
try:
for frame in page.frames:
for name in names:
try:
el = frame.get_by_role("button", name=name)
if el.is_visible(timeout=800):
el.click()
time.sleep(1)
return True
except Exception:
pass
try:
el = frame.get_by_text(name, exact=True)
if el.is_visible(timeout=800):
el.click()
time.sleep(1)
return True
except Exception:
pass
except Exception:
return False
return False
def _capture_dialog_image(self, page) -> Optional[bytes]: def _capture_dialog_image(self, page) -> Optional[bytes]:
selectors = "[role='dialog'], .dialog, .modal, .popup" selectors = "[role='dialog'], .dialog, .modal, .popup"
try: try:
@@ -442,6 +478,7 @@ class KDocsUploader:
self._ensure_login_dialog() self._ensure_login_dialog()
qr_image = None qr_image = None
for _ in range(10): for _ in range(10):
self._ensure_login_dialog()
qr_image = self._capture_qr_image() qr_image = self._capture_qr_image()
if qr_image: if qr_image:
break break