Showing
2 changed files
with
25 additions
and
2 deletions
| @@ -28,6 +28,8 @@ from .selectors import ( | @@ -28,6 +28,8 @@ from .selectors import ( | ||
| 28 | PHONE_INPUT, | 28 | PHONE_INPUT, |
| 29 | PHONE_LOGIN_SUBMIT, | 29 | PHONE_LOGIN_SUBMIT, |
| 30 | QRCODE_IMG, | 30 | QRCODE_IMG, |
| 31 | + USER_NICKNAME, | ||
| 32 | + USER_PROFILE_NAV_LINK, | ||
| 31 | ) | 33 | ) |
| 32 | from .urls import EXPLORE_URL | 34 | from .urls import EXPLORE_URL |
| 33 | 35 | ||
| @@ -48,15 +50,32 @@ def _wait_for_auth_ui(page: Page, timeout: float = 8.0) -> None: | @@ -48,15 +50,32 @@ def _wait_for_auth_ui(page: Page, timeout: float = 8.0) -> None: | ||
| 48 | 50 | ||
| 49 | 51 | ||
| 50 | def get_current_user_nickname(page: Page) -> str: | 52 | def get_current_user_nickname(page: Page) -> str: |
| 51 | - """获取当前登录用户的昵称,失败时返回空字符串(best-effort)。""" | 53 | + """获取当前登录用户的真实昵称,失败时返回空字符串(best-effort)。 |
| 54 | + | ||
| 55 | + 流程:首页导航栏取个人主页 href → 导航过去 → 读 .user-name 文字。 | ||
| 56 | + """ | ||
| 52 | try: | 57 | try: |
| 53 | page.navigate(EXPLORE_URL) | 58 | page.navigate(EXPLORE_URL) |
| 54 | page.wait_for_load() | 59 | page.wait_for_load() |
| 55 | _wait_for_auth_ui(page) | 60 | _wait_for_auth_ui(page) |
| 56 | if not page.has_element(LOGIN_STATUS): | 61 | if not page.has_element(LOGIN_STATUS): |
| 57 | return "" | 62 | return "" |
| 63 | + | ||
| 64 | + # 从导航栏"我"的链接取个人主页 URL(含 /user/profile/<user_id>) | ||
| 65 | + profile_href = page.evaluate( | ||
| 66 | + f"document.querySelector({json.dumps(USER_PROFILE_NAV_LINK)})?.getAttribute('href') || ''" | ||
| 67 | + ) | ||
| 68 | + if not profile_href: | ||
| 69 | + return "" | ||
| 70 | + | ||
| 71 | + # 导航到个人主页读取真实昵称 | ||
| 72 | + profile_url = f"https://www.xiaohongshu.com{profile_href}" | ||
| 73 | + page.navigate(profile_url) | ||
| 74 | + page.wait_for_load() | ||
| 75 | + page.wait_dom_stable() | ||
| 76 | + | ||
| 58 | nickname = page.evaluate( | 77 | nickname = page.evaluate( |
| 59 | - f"document.querySelector({json.dumps(LOGIN_STATUS)})?.innerText?.trim() || ''" | 78 | + f"document.querySelector({json.dumps(USER_NICKNAME)})?.innerText?.trim() || ''" |
| 60 | ) | 79 | ) |
| 61 | return nickname or "" | 80 | return nickname or "" |
| 62 | except Exception: | 81 | except Exception: |
| @@ -91,3 +91,7 @@ LOGOUT_MENU_ITEM = 'div.menu-item[data-name="退出登录"]' | @@ -91,3 +91,7 @@ LOGOUT_MENU_ITEM = 'div.menu-item[data-name="退出登录"]' | ||
| 91 | 91 | ||
| 92 | # ========== 用户主页 ========== | 92 | # ========== 用户主页 ========== |
| 93 | SIDEBAR_PROFILE = "div.main-container li.user.side-bar-component a.link-wrapper span.channel" | 93 | SIDEBAR_PROFILE = "div.main-container li.user.side-bar-component a.link-wrapper span.channel" |
| 94 | +# 登录后导航栏"我"的链接(href 含 /user/profile/<user_id>) | ||
| 95 | +USER_PROFILE_NAV_LINK = ".main-container .user .link-wrapper a.link-wrapper" | ||
| 96 | +# 个人主页真实昵称 | ||
| 97 | +USER_NICKNAME = ".user-name" |
-
Please register or login to post a comment