Show HN: Mochi.js:专为 Bun 原生开发的高保真浏览器自动化库

Hacker News Top 工具

摘要

Mochi.js 是一个新的开源浏览器自动化库,专为 Bun 运行时原生构建,旨在通过关系一致性、原生 Chromium 获取和行为合成来绕过检测机制。

Hi HN, 我在此分享 mochi.js (<a href="https://github.com/0xchasercat/mochi" rel="nofollow">https://github.com/0xchasercat/mochi</a>),这是一个基于 Bun 原生、使用原始 CDP 的浏览器自动化框架。它致力于通过关注一致性与常规流量在 JS 层面的适度对等性,使程序化浏览器使用更加高效,且完全兼容原版 Chromium。 最常见的浏览器自动化形式往往侧重于客户端逐行探测,这些大多只是表面功夫。这虽然让人感觉良好,但对于实际的 WAF 或反自动化防御机制并没有太大意义。 Mochi.js 专注于真正重要的部分,允许你绕过验证码、WAF 以及大多数防御机制。事实上,在某些情况下,它仅仅因为无需撒谎而优于 Chromium 分支版本。 其基础构建基于探针清单,该清单源于对多个 WAF 的分析,并力求覆盖所有关键领域,在此基础上向上构建,同时确保每个决策都有数据支持。它可以自动解决 Turnstile/中间页问题,fpjs 可疑得分是个位数,客户端测试结果非常出色,尽管 browserscan 及其他少数工具由于与 WAF 探针存在根本性冲突,仍是已知的局限性。 如果任何人想讨论细节,请查阅文档和 GitHub。它是完全免费且开源的,采用 MIT 许可证,与任何专有产品严格无任何关联。与修补过的 Chromium 分支或 SaaS 服务也无任何隶属关系。 但我也想谈谈我构建这个工具的原因,因为当前的“机器人检测”范式从根本上是失败的。 传统上,他们可能会尝试将我的仓库标记为恶意工具,或者充其量是一个灰帽工具。 以 Turnstile 为例,如果你附加调试器来查看他们从你的硬件中提取了什么数据,他们的脚本会故意自毁。 当他们试图提取你的数据时——作为你硅片上的访客,使用你的电力,未经询问——业界称之为“安全”。 但如果你编写一个脚本来精确控制你自己硬件发出的数据,拒绝提供他们没有权利要求的数据,你突然就被贴上了“恶意行为者”的标签,并被指控从事“机器人规避”。 我认为我们让自己忍受这种情况是荒谬的,而机器人规避社区的立场反而让他们感觉自己站在更高的道德制高点上。 我构建了一个尊重我硬件现实的库。如果这破坏了你的安全模型,那是因为你的安全模型依赖于侵入和秘密。我不再道歉。接下来是谁? Mochi 与 WAF 的不透明性截然相反。它是一个玻璃盒子。它是 MIT 许可的。整个 DAG、指纹清单模式、采集流程都有文档记录。我们甚至将实时基准测试结果提交到公共记录(在 Linux 数据中心 IP 上运行的 mochi 在 FingerprintJS Pro v4 中获得了 suspect_score: 8 和 bot: not_detected 的结果)。 我们甚至不撒谎。我们默认匹配主机操作系统。如果你在 Linux 服务器上运行 mochi,它会使用适合 Linux 的隐私敏感指纹,而不是 Windows,因为 Linux 是真实用户信号。这证明了 WAF 实际上并没有阻止大多数人认为它们在阻止的东西,这就引出了一个疑问:它们在那段混淆的有效载荷中到底在做什么。 合法性争论正是他们掌控叙事的方式。没有人挑战它,因为另一方的人太忙着表现得像自己做错了什么。 这是阴谋论吗?当然,但仅仅是因为他们允许它是。试着编造一个关于糯米团子的阴谋论吧。
查看原文
查看缓存全文

缓存时间: 2026/05/09 18:37

# mochi.js 来源:https://mochijs.com/ 原生 Bun · MIT 许可证 · 原生 Chromium ## 外有粘性,内有坚壁。 **mochi.js** 是一个原生基于 Bun、底层直连 CDP 的浏览器自动化框架。传入一个种子(seed)和一个配置文件(profile),即可获得一组关系一致、能够抵御 `getParameter(0x9245)` 探测的指纹特征。支持 JIT 友好的注入负载,采用 Chromium 原生 fetch(从定义上即为真实的 Chrome JA4),并在 Bezier 曲线与 Fitts 定律之上进行行为合成。不留痕迹。 bun ≥ 1.1 | macOS · Linux · Windows | MIT mochi 吉祥物——一个带着蜂蜜滴落微笑的年糕 五大支柱 ## 专为最严苛的探测而构建。 在 Playwright 和 Puppeteer 留下指纹之处,mochi.js 不留任何可测量的痕迹。每个支柱覆盖一类检测机制。 🧬 ### 关系一致性引擎 所有指纹表面——Canvas、WebGL、Audio、Fonts、MediaDevices、WebGPU——均源自同一个 (profile, seed) 对,并通过 48 规则的有向无环图(DAG)生成。没有拼凑出的“弗兰肯斯坦”式指纹;Mac 用户代理永远不会与 Linux WebGL 特征同时出现。 🌐 ### Chromium 原生 fetch session.fetch() 通过 CDP 路由至 Chromium 内部——简单 GET 请求使用 Network.loadNetworkResource,非 GET 请求使用 page.evaluate('fetch')。JA4/JA3/H2 从定义上就是真实的 Chrome。无需保持同步的并行 HTTP 层,无需安装 FFI。 🎯 ### 行为合成 humanClick / humanType / humanScroll 基于生物力学模型进行合成——带有过冲与修正的 Bezier 路径、遵循 Fitts 定律的移动时间、对数正态分布的双字母延迟。参数化配置:手部特征、颤抖、每分钟字数(wpm)、滚动风格等。 📐 ### Probe-Manifest 测试套件 来自真实设备的基线数据保存在代码库中。每个 PR 都会将当前会话的 Probe Manifest 与基线进行差异比较;零差异(Zero-Diff)是 CI 门禁。有意为之的差异必须附带书面理由。 🍡 ### 一体化连贯栈 取代了通常手工拼凑的流程(Patchright + 指纹注入器 + Turnstile 点击器 + curl-impersonate),由一个库端到端掌控全过程。仅支持 Bun。无 Node、无 Python 辅助进程、无专有组件。 三行隐身 ## 与 Playwright 相同的操作直觉。零痕迹。 ```ts import { mochi } from "@mochi.js/core"; // 三行代码启动隐身浏览器 const session = await mochi.launch({ profile: "linux-chrome-stable", seed: "user-12345", }); const page = await session.newPage(); await page.goto("https://target.example/checkout"); console.log("UA:", session.profile.userAgent); await session.close(); ```

相似文章

Show HN: 运行于 WebAssembly 的 Firefox

Hacker News Top

Firefox 被编译为在 WebAssembly 中运行,采用基于 WebGL 的渲染和实验性的 JS 到 WASM JIT,网页内容通过 Puter 托管的 Wisp 服务器进行代理。