逆向 WhatsApp Web:前端 SDK 深度剖析与 Chrome 插件实战指南

🚀 逆向 WhatsApp Web:前端 SDK 深度剖析与 Chrome 插件实战指南

用一行代码调用 WhatsApp 发送消息?揭秘非官方 SDK 的技术原理、选型与安全边界


1. 为什么你需要一个 WhatsApp SDK?

跨境电商、SaaS 客服、营销自动化......当你的业务依赖 WhatsApp 与全球客户沟通时,官方 Web 端的"三板斧"远远不够:

  • 无法自动回复
  • 无法批量群发
  • 无法与 CRM 数据打通
  • 无法在聊天界面嵌入 AI 能力

于是,非官方 WhatsApp Web SDK 应运而生。它们通过逆向 WhatsApp Web 的内部 API,让开发者能够用 JavaScript 直接调用发送消息、读取联系人、管理群组等能力。

本文将从技术专家的视角,深入剖析前端可用的 WhatsApp SDK 方案,对比优劣,并提供架构设计与安全建议。


2. 核心原理:WhatsApp Web 是如何被"劫持"的?

WhatsApp Web (window.Store) 注入的 SDK (WA-JS) Chrome 插件 Content Script 用户浏览器 WhatsApp Web (window.Store) 注入的 SDK (WA-JS) Chrome 插件 Content Script 用户浏览器 #mermaid-svg-Xmg4b4nYPEJMv13F{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Xmg4b4nYPEJMv13F .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Xmg4b4nYPEJMv13F .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Xmg4b4nYPEJMv13F .error-icon{fill:#552222;}#mermaid-svg-Xmg4b4nYPEJMv13F .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Xmg4b4nYPEJMv13F .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Xmg4b4nYPEJMv13F .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Xmg4b4nYPEJMv13F .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Xmg4b4nYPEJMv13F .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Xmg4b4nYPEJMv13F .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Xmg4b4nYPEJMv13F .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Xmg4b4nYPEJMv13F .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Xmg4b4nYPEJMv13F .marker.cross{stroke:#333333;}#mermaid-svg-Xmg4b4nYPEJMv13F svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Xmg4b4nYPEJMv13F p{margin:0;}#mermaid-svg-Xmg4b4nYPEJMv13F .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Xmg4b4nYPEJMv13F text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Xmg4b4nYPEJMv13F .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Xmg4b4nYPEJMv13F .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-Xmg4b4nYPEJMv13F .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Xmg4b4nYPEJMv13F .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Xmg4b4nYPEJMv13F #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Xmg4b4nYPEJMv13F .sequenceNumber{fill:white;}#mermaid-svg-Xmg4b4nYPEJMv13F #sequencenumber{fill:#333;}#mermaid-svg-Xmg4b4nYPEJMv13F #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Xmg4b4nYPEJMv13F .messageText{fill:#333;stroke:none;}#mermaid-svg-Xmg4b4nYPEJMv13F .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Xmg4b4nYPEJMv13F .labelText,#mermaid-svg-Xmg4b4nYPEJMv13F .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Xmg4b4nYPEJMv13F .loopText,#mermaid-svg-Xmg4b4nYPEJMv13F .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Xmg4b4nYPEJMv13F .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Xmg4b4nYPEJMv13F .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Xmg4b4nYPEJMv13F .noteText,#mermaid-svg-Xmg4b4nYPEJMv13F .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Xmg4b4nYPEJMv13F .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Xmg4b4nYPEJMv13F .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Xmg4b4nYPEJMv13F .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Xmg4b4nYPEJMv13F .actorPopupMenu{position:absolute;}#mermaid-svg-Xmg4b4nYPEJMv13F .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Xmg4b4nYPEJMv13F .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Xmg4b4nYPEJMv13F .actor-man circle,#mermaid-svg-Xmg4b4nYPEJMv13F line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Xmg4b4nYPEJMv13F :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 安装插件,打开 web.whatsapp.com 通过 chrome.scripting.executeScript 注入脚本 等待 Store 对象初始化 劫持 window.Store 对象 暴露全局 API (例如 window.WPP) 调用 WPP.chat.sendTextMessage() 调用 Store 内部方法 返回执行结果 Promise resolve

核心步骤:

  1. WhatsApp Web 在加载完成后,会在 window.Store 中挂载大量内部模块(Chat、Contact、MsgKey 等)。
  2. 第三方 SDK 通过注入脚本 (Manifest V3 中使用 chrome.scripting.executeScript)获得对 window.Store 的访问权限。
  3. SDK 封装这些内部模块,暴露友好的 API,例如 WPP.chat.sendTextMessage(chatId, text)。
  4. 你的插件或应用调用这些 API,实现自动化。

⚠️ 注意:WhatsApp 官方严禁这种逆向行为,账号存在被封禁的风险。


3. 主流前端 SDK 全面对比

以下 SDK 均可在浏览器环境(Chrome 插件 Content Script) 中运行。

📊 对比一览表

SDK 名称 GitHub Stars 维护活跃度 核心优势 典型应用场景 文档质量
@wppconnect/wa-js 439 ⭐⭐⭐⭐⭐ 每日更新 最全面的 WhatsApp Web 功能覆盖,提供 WPP 全局对象 企业级 CRM 集成、自动化营销 极佳,有官网+示例
Venom 6.6k ⭐⭐⭐⭐ 近两周有更新 社区知名度高,API 简洁,支持多开 个人开发者、中小团队快速原型 良好,文档较全
whatsapp-api (yotam180) 437 ⭐⭐ 两年前更新 专为 Chrome 扩展设计,轻量 简单的消息发送/接收插件 一般,示例代码较少
WTF (WhatsApp Transformer 94 ⭐⭐⭐ 近月有更新 专注于批量和自动化,拟人化操作 群发、自动回复机器人 有限,主要看源码

🔍 深度解析

👑 @wppconnect/wa-js ------ 企业级首选
  • 技术栈 :纯 JavaScript,通过内联脚本注入,直接操作 window.Store。
  • 功能覆盖:消息(发送、撤回、编辑)、媒体(图片、语音、文件)、联系人(获取、封禁)、群组(创建、修改设置)、标签、状态等。
  • 代码示例:
javascript 复制代码
// 在 content_script 中注入并调用
async function sendWhatsAppMessage(phoneNumber, text) {
  // 确保 WPP 已加载
  if (!window.WPP) {
    console.error('WPP not ready');
    return;
  }
  // 格式化号码:去掉 '+',添加 '@c.us'
  const chatId = phoneNumber.replace('+', '') + '@c.us';
  await window.WPP.chat.sendTextMessage(chatId, text);
}
  • 集成到 Chrome 插件:
javascript 复制代码
// manifest.json 中声明 content_scripts
"content_scripts": [{
  "matches": ["https://web.whatsapp.com/*"],
  "js": ["wa-js-bundle.js", "your-plugin.js"],
  "run_at": "document_idle"
}]
  • 与你的 CRM AI 系统集成 :可利用它实现聊天记录自动同步、AI 回复注入、客户标签读取。
🐍 Venom ------ 社区宠儿
  • 技术原理 :同样基于浏览器注入,但提供更高级的抽象,例如 create() 返回 session 对象。
  • 代码示例:
javascript 复制代码
const venom = require('venom-bot');
venom.create().then((client) => {
  client.sendText('5511999999999@c.us', 'Hello from Venom!');
});
  • 注意 :Venom 原本设计用于 Node.js 环境,但可以通过 Browserify 或 Webpack 打包成浏览器可用的 bundle,然后注入到 WhatsApp Web。更复杂,不推荐纯前端插件使用。
⚡ WTF ------ 低调的"模拟大师"
  • 独特之处 :它不直接调用 window.Store,而是通过模拟键盘、鼠标事件来操作 DOM。优点是"更像真人",可能降低封号概率;缺点是需要控制焦点、依赖 UI 结构变化。
  • 适用场景:简单的定时群发、自动回复,不适合需要读取复杂数据的场景。

4. 架构设计:如何将 SDK 集成到你的 Chrome 插件?

#mermaid-svg-N7TA514a6mRHiMce{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N7TA514a6mRHiMce .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N7TA514a6mRHiMce .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N7TA514a6mRHiMce .error-icon{fill:#552222;}#mermaid-svg-N7TA514a6mRHiMce .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N7TA514a6mRHiMce .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N7TA514a6mRHiMce .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N7TA514a6mRHiMce .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N7TA514a6mRHiMce .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N7TA514a6mRHiMce .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N7TA514a6mRHiMce .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N7TA514a6mRHiMce .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N7TA514a6mRHiMce .marker.cross{stroke:#333333;}#mermaid-svg-N7TA514a6mRHiMce svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N7TA514a6mRHiMce p{margin:0;}#mermaid-svg-N7TA514a6mRHiMce .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N7TA514a6mRHiMce .cluster-label text{fill:#333;}#mermaid-svg-N7TA514a6mRHiMce .cluster-label span{color:#333;}#mermaid-svg-N7TA514a6mRHiMce .cluster-label span p{background-color:transparent;}#mermaid-svg-N7TA514a6mRHiMce .label text,#mermaid-svg-N7TA514a6mRHiMce span{fill:#333;color:#333;}#mermaid-svg-N7TA514a6mRHiMce .node rect,#mermaid-svg-N7TA514a6mRHiMce .node circle,#mermaid-svg-N7TA514a6mRHiMce .node ellipse,#mermaid-svg-N7TA514a6mRHiMce .node polygon,#mermaid-svg-N7TA514a6mRHiMce .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N7TA514a6mRHiMce .rough-node .label text,#mermaid-svg-N7TA514a6mRHiMce .node .label text,#mermaid-svg-N7TA514a6mRHiMce .image-shape .label,#mermaid-svg-N7TA514a6mRHiMce .icon-shape .label{text-anchor:middle;}#mermaid-svg-N7TA514a6mRHiMce .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N7TA514a6mRHiMce .rough-node .label,#mermaid-svg-N7TA514a6mRHiMce .node .label,#mermaid-svg-N7TA514a6mRHiMce .image-shape .label,#mermaid-svg-N7TA514a6mRHiMce .icon-shape .label{text-align:center;}#mermaid-svg-N7TA514a6mRHiMce .node.clickable{cursor:pointer;}#mermaid-svg-N7TA514a6mRHiMce .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N7TA514a6mRHiMce .arrowheadPath{fill:#333333;}#mermaid-svg-N7TA514a6mRHiMce .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N7TA514a6mRHiMce .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N7TA514a6mRHiMce .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N7TA514a6mRHiMce .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N7TA514a6mRHiMce .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N7TA514a6mRHiMce .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N7TA514a6mRHiMce .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N7TA514a6mRHiMce .cluster text{fill:#333;}#mermaid-svg-N7TA514a6mRHiMce .cluster span{color:#333;}#mermaid-svg-N7TA514a6mRHiMce div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N7TA514a6mRHiMce .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N7TA514a6mRHiMce rect.text{fill:none;stroke-width:0;}#mermaid-svg-N7TA514a6mRHiMce .icon-shape,#mermaid-svg-N7TA514a6mRHiMce .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N7TA514a6mRHiMce .icon-shape p,#mermaid-svg-N7TA514a6mRHiMce .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N7TA514a6mRHiMce .icon-shape .label rect,#mermaid-svg-N7TA514a6mRHiMce .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N7TA514a6mRHiMce .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N7TA514a6mRHiMce .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N7TA514a6mRHiMce :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 你的后端 CRM
Chrome 插件
定时任务/事件监听
注入脚本
暴露 window.WPP
API 调用
DOM 操作/Store调用
REST API / WebSocket
Background Service Worker
Content Script
SDK Loader
您的业务逻辑
WhatsApp Web 页面
WhatsApp 服务器
CRM AI 系统

关键组件说明:

  • SDK Loader :负责检测 WhatsApp Web 何时加载完成,然后动态注入 SDK 脚本(例如从 CDN 拉取或使用本地打包的 wa-js)。
  • 业务逻辑 :调用 window.WPP 实现翻译、回复建议、自动同步等。
  • Background Service Worker:作为持久运行的后台,与你的 CRM AI 系统保持通信,接收指令(例如"给客户 A 发送营销消息"),再转发给 Content Script。

5. 安全与封号风险实战建议

所有非官方 SDK 都违反了 WhatsApp 服务条款,但有办法降低风险。

📉 风险等级

行为 风险等级 建议
仅读取联系人/聊天记录 🟡 中 可接受,但建议不要高频轮询
发送消息(低频,像真人) 🟠 中高 随机延迟 5~10 秒,不发送完全相同内容
批量群发(>50 条/小时) 🔴 极高 极可能被封,建议使用 WhatsApp Business API
自动添加陌生人 🔴 极高 几乎必封,不要尝试
调用未公开的 mutation 方法 🔴 极高 SDK 可能误操作导致触发风控

🛡️ 防护策略

  1. 模拟人类行为:
javascript 复制代码
// 在发送每条消息前随机等待
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
await delay(Math.floor(Math.random() * 5000) + 2000); // 2-7 秒
  1. 限制频率:使用队列,每秒最多 1 条消息。
  2. 使用独立 WhatsApp 号码:绝不要用主号测试。
  3. 定期更换用户代理 :在 Chrome 插件中可以通过 chrome.webRequest 修改部分头部(但较复杂)。
  4. 监控异常 :如果发现消息发送失败并收到 "此号码已被禁止使用 WhatsApp",立即停止所有操作。

6. 实战:用 @wppconnect/wa-js 实现 AI 翻译与快捷回复

假设你的 CRM 已经集成了 AI 翻译 API。在 WhatsApp 插件中,你可以这样实现"一键翻译并发送":

javascript 复制代码
// content_script.js
async function initWPP() {
  // 等待 WPP 就绪
  while (!window.WPP) await new Promise(r => setTimeout(r, 500));

  // 监听新消息(示例:自动翻译)
  window.WPP.event.onNewMessage(async (msg) => {
    if (msg.body && msg.fromMe === false) {
      const translated = await callYourCRMTranslationAPI(msg.body, 'zh');
      // 在界面上显示翻译(例如在消息下方添加小气泡)
      injectTranslationUI(msg.id, translated);
    }
  });

  // 注册快捷键:Ctrl+Shift+S 发送快捷回复模板
  document.addEventListener('keydown', (e) => {
    if (e.ctrlKey && e.shiftKey && e.key === 'S') {
      const activeChat = window.WPP.chat.getActiveChat();
      const template = `感谢您的咨询!我们的优惠活动正在进行中,请点击链接:https://yourdomain.com/promo`;
      window.WPP.chat.sendTextMessage(activeChat.id, template);
    }
  });
}

注意:callYourCRMTranslationAPI 需要从 content script 通过 chrome.runtime.sendMessage 转发到 background,再由 background 调用你的后端。


7. 总结:如何选择适合你的 SDK?

  • 如果你开发企业级产品(如 CRM 插件),需要最完整的功能和稳定更新 :选 @wppconnect/wa-js。它是最专业的方案,文档齐全,社区活跃。
  • 如果你是个人开发者,想快速搭建一个 WhatsApp 机器人 :可以试试 Venom(但需 Node.js 环境打包)。
  • 如果你只需要极简的"发送消息",且不希望太复杂 :whatsapp-api (yotam180) 或许够用。
  • 如果你极度关心账号安全,愿意牺牲部分功能 :WTF 的拟人化操作值得关注。

最终建议 :无论选择哪个 SDK,请一定做好账号隔离 和频率限制 。并且,如果你的业务达到一定规模(每天发送超过 1000 条消息),官方 WhatsApp Business API 才是合法且可持续的方案。


8. 附录:快速开始模板(Chrome 插件 + WA-JS)

json 复制代码
// manifest.json (Manifest V3)
{
  "manifest_version": 3,
  "name": "WhatsApp AI Assistant",
  "permissions": ["storage", "scripting"],
  "host_permissions": ["https://web.whatsapp.com/*"],
  "background": {
    "service_worker": "background.js"
  },
  "content_scripts": [{
    "matches": ["https://web.whatsapp.com/*"],
    "js": ["content.js"],
    "run_at": "document_idle"
  }],
  "web_accessible_resources": [{
    "resources": ["wa-js-bundle.js"],
    "matches": ["https://web.whatsapp.com/*"]
  }]
}
javascript 复制代码
// content.js
const script = document.createElement('script');
script.src = chrome.runtime.getURL('wa-js-bundle.js');
script.onload = () => {
  // 等待 WPP 初始化完成
  const checkWPP = setInterval(() => {
    if (window.WPP && window.WPP.isReady) {
      clearInterval(checkWPP);
      console.log('WPP ready');
      // 你的业务代码开始...
    }
  }, 500);
};
document.head.appendChild(script);

你可以在 https://github.com/wppconnect-team/wa-js 获取最新 wa-js-bundle.js。


希望这篇博客能帮助你安全、高效地使用 WhatsApp 前端 SDK 构建强大的 Chrome 插件。 如果你有任何具体的技术问题(例如如何实现多账号、如何处理验证码),欢迎在评论区交流!

相关推荐
被摘下的星星2 分钟前
CSS 基础说明
前端·css
To_OC10 小时前
从一头雾水到跑通全流程:我用一个周末啃透了JWT登录鉴权
前端·后端·http
excel12 小时前
研究 Vue 3 源码的收获
前端·vue.js
可乐鸡翅yeah_14 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
lerhxx14 小时前
AI 应用如何高效优雅地恢复中断?—— "连接解耦 + 状态持久化"
前端·javascript
计算机魔术师14 小时前
METR 演示 AI 智能体如何篡改 Inspect 评估记录以掩盖不当行为
前端
前端snow14 小时前
ai agent --- 异步处理之 Rabbit MQ
前端
念何架构之路14 小时前
zap扩展生态与总结
java·前端·数据库
独孤九剑打醒他15 小时前
【原创开源】【概念设计】源 - 栅 - 漏 - 栅 - 源 横向双栅 MOS,低压交流多值逻辑芯片探索
前端·其他·架构·开源·硬件工程
mantou13215 小时前
我给 AI Agent 做了个「油猴」:让 Claude Code / Codex 直接用你已登录的浏览器
前端·javascript·后端