rednote.com 支持:v2.4 下各功能页的实测差异(登录 / 主页 tab / 通知)

Author: podollybCreated Aug 13, 2026Updated Aug 13, 2026

背景

相关:#579 #699 #701。在 #701 里 maintainer 提到「会先统一确定支持策略(域名切换的范围、登录与各功能页的差异处理),再决定采用哪种实现」。

这个 issue 想补上的正是**「各功能页的差异」这部分的实测数据** —— 我在英国网络下把 v2.4.0 跑通了 rednote.com,把踩到的每个坑和定位过程记在下面,供确定策略时参考。不是要推销某种实现,只是提供事实。

环境:英国家宽(无代理),rednote 账号,v2.4.0 + PR #701 的 XHS_BASE_URL 补丁。

一、域名切换只是第一步,页面行为还有 3 处不同

把域名换成 rednote.com 之后,仍有三处会失败,而且失败方式都是无声挂死(见第二节):

1. 登录:首页不弹二维码

FetchQrcodeImage 打开 /explore.login-container .qrcode-img。小红书原站会自动弹出登录弹窗;rednote 首页不弹,只在侧边栏放一个「登录」按钮(#login-btn),点了才出弹窗。

好消息是 rednote 有独立登录页 /login,且该页的 DOM 结构与原站选择器完全一致.login-container .qrcode-img 一字不差)。所以最小改动是把导航目标从 /explore 换成 /login,选择器不用动。

顺带一提,直接点侧边栏那个登录按钮是走不通的,原因见下面第 2 条。

2. 主页 tab(v2.4 新功能):两次点击都点不动

GetMyProfileViaSidebar 的路径是「点侧边栏『我』→ 点子 tab」,rednote 下两步都失败:

  • 侧边栏「我」:元素找得到(选择器 div.main-container li.user.side-bar-component a.link-wrapper span.channel 在 rednote 上完全匹配,DOM 结构一模一样),但 go-rod 的 WaitInteractable 过不了,20s 超时。试过把视口放大到 1920×1080,一样不行,所以不是尺寸/滚动问题。
  • 子 tabselectTab 靠中文文字匹配(「收藏」「点赞」)。这在界面语言不是中文时必然失效 —— rednote 会按浏览器语言渲染界面,v2.4 的内置浏览器写死了 WithLanguage("zh-CN") 所以碰巧是中文,但这层依赖挺脆的。

我们的做法供参考:不点击,直接导航。侧边栏那个 <a>href 里就带着自己的 user id:

/user/profile/<uid>

读出来拼成 <base>/user/profile/<uid>?tab=fav&subTab=note 一步导航过去即可。实测 tab=fav / liked / note 三个都能正确拿到 __INITIAL_STATE__activeTab.query 与请求的 tab 一致,notes[index] 就是对应 tab 的内容)。这样既绕开可交互性问题,也不依赖界面语言,还少一次往返。

另外:个人主页不能用 MustWaitStable。主页是无限滚动,永远等不到「稳定」,会一路吃满 60s 超时。

3. 通知功能有 4 处新的硬编码域名

v2.4 新增的 notification.go / notification_like.go / notification_reply.go 里有 4 处 https://www.xiaohongshu.com 硬编码。如果最终采纳某种域名切换方案,这几处需要一起覆盖。

二、真正难排查的不是这些差异,是「无声挂死」

上面三个问题,每一个的表现都是完全一样的:卡住,没有任何输出

原因是 go-rod 的 MustXxx 系列默认无限期等待。元素不出现时既不报错也不超时,日志里什么都看不到。用户看到的就是「双击启动了,但没反应」,maintainer 收到的 issue 也只能是「用不了」,双方都没有可用信息。

我为登录那一处单独提了个小 PR(#811),只把二维码等待改成带超时。但这是个共性问题MustWaitStableMustElement 在这个代码库里用得比较多,海外域名只是把它们集中暴露出来了。如果统一加超时(哪怕超时很长),海外用户的问题至少能自己看懂、也能给出有效的 issue 报告。

三、一条已经验证走不通的路,供参考

有人可能会想绕过浏览器直接调数据接口。我实测过,在英国网络下这条路不通,但原因和想象的不一样

  • https://www.xiaohongshu.com/(网页域)→ 被边缘节点 404
  • https://edith.xiaohongshu.com/api/...(数据接口域)→ 正常应答(无签名时返回 406,说明请求到达了 API 层)

所以被拦的只是网页域,接口域没被拦。但浏览器的网页登录态换不成接口登录态:拿当天新扫码的 cookie 试,rednote 域的会话返回 -100,xiaohongshu 域的 cookie 被当作游客(guest: true)。与 cookie 新旧无关。

结论:海外场景下仍然只能走浏览器方案,这个方向不用再花时间了。

小结

如果最终要支持 rednote,除了域名切换,还需要覆盖:登录走 /login主页改用直接导航而非点击通知页的域名。另外建议把无限期等待统一加上超时 —— 那个改动的收益不限于海外用户。

需要的话我可以把上面任何一部分整理成 PR。也很乐意提供更多实测数据(DOM dump、各步骤耗时等)。

Source: xpzouying/xiaohongshu-mcp