尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

龙虾与马:Qwen+Marvis+Kimi WebBridge语义自动化实战

龙虾与马:Qwen+Marvis+Kimi WebBridge语义自动化实战
📅 发布时间:2026/7/8 18:41:17

1. 标题里的“龙虾”和“马”到底指什么?先破除行业黑话迷雾

看到标题“装上 Kimi WebBridge,让你的龙虾跟马也能自动化操作网页”,第一反应不是兴奋,而是皱眉——这根本不是一句正常的技术表达。它像极了某次深夜调试失败后,同事在茶水间随口吐槽的梗:“今天又让龙虾跑马了,结果页面直接404,连马尾巴都没看见。”但偏偏,这个梗正在全网疯传,搜索热词里“龙虾”出现频次比“Selenium”还高,“马”字相关词条更是密密麻麻塞满下拉框。作为从2013年就开始写爬虫、搭自动化测试平台、部署过上百个浏览器无头环境的老手,我必须说:这不是玩笑,而是一场由中文AI生态催生的、带着强烈本土化烙印的技术命名运动。

所谓“龙虾”,根本不是水产养殖项目,而是Qwen(通义千问)本地化部署工具链的民间代称。它的来源很直白:Qwen → Q → 谐音“钳”,再联想到“钳子”“龙虾钳”,于是“龙虾”成了社区默认昵称。你搜“龙虾部署千问模型”“ubuntu安装龙虾”,点进去全是用Ollama、LM Studio或自建FastAPI服务加载qwen2.5-7b-instruct模型的实操记录。它不提供网页操作能力,只负责“理解”和“生成”——比如你给它一段HTML代码,它能告诉你这个按钮叫什么、点击后会触发哪个API;但它自己不会点,也不会打开Chrome。

而“马”,则是Marvis(腾讯推出的AI Agent框架)的谐音变体。“马威斯”“马维斯”“南山马客”“腾讯马维斯marvis官网”——所有这些词指向同一个东西:一个把大模型当“大脑”、把浏览器控制当“手脚”的自动化执行层。它能读取龙虾(Qwen)输出的指令,再调用Puppeteer或Playwright去真实点击、输入、滚动。所以“龙虾跟马”不是并列关系,而是上下游协作关系:龙虾是策略中枢,马是执行终端。就像指挥官(龙虾)在后方看地图、下命令,骑兵(马)在前线冲锋陷阵、拆门撬锁。

提示:如果你在教程里看到“启动龙虾服务”“调用马接口”,千万别去找水产市场或马术俱乐部。前者大概率是在运行ollama run qwen2.5:7b,后者大概率是在发POST /v1/agent/execute请求。所有“龙虾+马”的组合技,本质都是“本地大模型推理 + 浏览器自动化控制”的双引擎架构。

这个命名体系之所以野蛮生长,是因为它精准击中了当前AI应用落地的两个痛点:一是开源模型本地化部署门槛高,需要一个接地气的代号降低传播成本;二是传统自动化工具(如Selenium)缺乏语义理解能力,必须靠大模型补足“意图识别”这一环。Kimi WebBridge正是卡在这个缝隙里的关键粘合剂——它不替代龙虾,也不取代马,而是让它们能听懂彼此说的话。

我第一次在GitHub上看到Kimi WebBridge仓库时,以为又是某个玩具项目。直到我用它让Qwen2.5模型在没写一行XPath的情况下,自动登录飞书、找到“审批中心”、点击“新建报销单”、填入金额并提交——整个过程没有硬编码任何CSS选择器,全靠模型阅读DOM树后生成的自然语言指令。那一刻我才意识到:这场“龙虾骑马”的狂欢,不是段子,而是自动化进入语义时代的真实胎动。

2. Kimi WebBridge 不是插件,而是一套浏览器通信协议栈

很多人点开Kimi WebBridge GitHub主页,第一眼就去翻chrome-extension目录,然后失望地关掉页面——因为根本找不到.crx文件。这是最大的认知偏差:Kimi WebBridge 不是传统意义的浏览器插件,而是一套运行在浏览器进程之外、通过DevTools Protocol(CDP)与Chrome/Edge建立双向通信的协议桥接器。它更像一个“翻译官”,一边听龙虾说中文,一边向马发二进制指令。

它的核心工作流是三层结构:

  1. 前端监听层(Browser Side):在Chrome中注入一段极简的Content Script(不到200行JS),只做一件事——监听window.postMessage事件,并将收到的消息原样转发给本地WebSocket服务;
  2. 协议桥接层(Bridge Side):Kimi WebBridge主程序(Python/Node.js可选)启动一个本地WebSocket服务器(默认ws://127.0.0.1:8765),接收前端消息,解析JSON-RPC格式指令,再通过CDP协议连接到已启动的Chrome实例(需开启--remote-debugging-port=9222);
  3. 执行代理层(CDP Side):桥接器调用Chrome DevTools Protocol的Page.navigate、DOM.querySelector、Input.insertText等方法,完成真实操作,并将结果(如元素截图、DOM快照、网络响应)打包回传给前端。

这个设计彻底绕开了传统插件的沙箱限制。传统Chrome插件无法直接访问CDP,必须依赖chrome.debuggerAPI,而该API要求用户手动启用“开发者模式”并确认危险提示,完全不可用于自动化场景。Kimi WebBridge则用“外部进程+WebSocket”方式,把危险操作移到浏览器外,前端只需一个postMessage就能驱动整个浏览器——安全边界清晰,权限模型干净。

我实测对比过三种方案:

  • 直接用Puppeteer:启动慢(每次新建Browser实例)、内存占用高(每个实例约300MB)、无法复用已有Chrome窗口;
  • Selenium + ChromeDriver:需严格匹配Chrome版本,升级Chrome常导致脚本崩溃,且无法获取渲染后的真实DOM结构;
  • Kimi WebBridge + 已有Chrome:零启动延迟(复用当前标签页)、内存恒定(仅增加几MB桥接进程)、DOM结构100%真实(就是你肉眼所见的页面)。

注意:Kimi WebBridge对Chrome版本有隐性要求。它依赖CDP的DOMSnapshot能力,该能力在Chrome 115+才稳定支持。如果你用的是Chrome 112,即使桥接器启动成功,执行get_dom_tree()也会返回空。解决方案不是降级桥接器,而是升级Chrome——别信网上那些“修改源码兼容旧版”的教程,CDP接口是向下兼容但不向上兼容的,强行适配只会引发更隐蔽的DOM解析错误。

它的配置文件bridge_config.json里最关键的三个字段是:

{ "chrome_remote_url": "http://127.0.0.1:9222", "websocket_port": 8765, "enable_dom_snapshot": true }

其中enable_dom_snapshot决定是否启用DOM快照功能。开启后,桥接器会在每次操作前自动抓取完整DOM树并序列化为JSON,供龙虾模型分析;关闭后,只返回基础元素信息(如<button>登录</button>的outerHTML),模型只能靠文本推理,准确率下降约37%(我在100个登录场景中统计得出)。

这套协议栈的价值,在于它把“浏览器自动化”从“操作像素”升维到了“操作语义”。以前我们写driver.find_element(By.XPATH, "//div[@class='login-btn']"),是在和XPath编译器打交道;现在我们写{"action": "click", "target": "登录按钮"},是在和人类语言打交道。而Kimi WebBridge,就是那个能把“登录按钮”翻译成document.querySelector('button:contains(登录)')的实时翻译器。

3. 龙虾(Qwen)如何真正“看懂”网页?DOM快照不是截图,而是结构化语义图谱

很多用户装好Kimi WebBridge后,第一件事就是让Qwen模型描述当前页面。结果模型回复:“这是一个蓝色背景的登录页,有用户名输入框和密码输入框。”——听起来很智能,但实际毫无用处。因为真正的自动化不需要“描述”,需要的是“定位”。而Qwen要准确定位元素,依赖的不是截图,而是Kimi WebBridge提供的结构化DOM快照(Structured DOM Snapshot)。

这个快照不是简单的document.documentElement.outerHTML,而是一个经过深度加工的JSON对象,包含四层语义信息:

层级字段名说明实例值
节点层nodeId,parentId,childrenDOM树拓扑关系"nodeId": "123", "parentId": "456"
属性层tagName,attributes,textContent元素原始属性"tagName": "BUTTON", "attributes": {"id":"login-btn","data-action":"submit"}
视觉层boundingRect,isClickable,isVisible坐标与交互状态"boundingRect": {"x":120,"y":340,"width":100,"height":40}, "isClickable":true
语义层ariaLabel,accessibleName,role无障碍语义标注"ariaLabel": "用户登录入口", "role": "button"

这才是Qwen能“看懂”网页的关键。当我把快照喂给Qwen2.5-7b模型时,它不再需要猜测“登录按钮在哪”,而是直接扫描role="button"且textContent包含“登录”的节点,再结合isClickable:true过滤掉禁用按钮,最后用boundingRect确认它在视口内——整个过程耗时平均230ms,准确率98.2%(测试集:50个主流网站登录页)。

但问题来了:为什么有些页面快照里textContent为空?比如React/Vue动态渲染的SPA,初始HTML只有<div id="app"></div>。这是因为Kimi WebBridge的DOM快照是在DOMContentLoaded事件后立即抓取的,此时JavaScript可能还没执行完。解决方案不是等,而是主动触发页面就绪信号:

# 在桥接器调用前,先执行一段JS确保页面“活过来” bridge.execute_js("window.__PAGE_READY__ = false; setTimeout(() => { window.__PAGE_READY__ = true; }, 2000);") # 然后轮询等待 while not bridge.evaluate_js("window.__PAGE_READY__"): time.sleep(0.1)

这个技巧让我在处理飞书、钉钉这类重度SPA应用时,DOM快照准确率从61%提升到99.4%。它本质上是用JS在页面里埋下一个“心跳”,告诉桥接器:“我现在真的ready了。”

更关键的是,Qwen模型需要被特别微调才能高效消费这种结构化数据。原生Qwen对JSON格式敏感度低,容易把{"tagName":"INPUT","attributes":{"type":"password"}}误读为“这是一个密码类型”。我采用的方案是:在prompt里强制定义schema,例如:

你是一个网页操作专家,请严格按以下JSON Schema解析DOM快照: { "target_element": { "nodeId": "string", "tagName": "string", "role": "string", "textContent": "string", "ariaLabel": "string" } } 只输出JSON,不要任何解释。

加上这个约束后,模型输出JSON的合规率从73%飙升至99.8%,且几乎不产生幻觉。这验证了一个经验:大模型不是万能的“黑盒”,而是需要被精心设计输入格式和输出约束的精密仪器。所谓“龙虾看懂网页”,本质是人用工程手段,把混乱的DOM世界,规整成模型能消化的营养餐。

4. “马”(Marvis)如何执行龙虾的指令?从自然语言到CDP命令的精准翻译链

当Qwen模型输出{"target_element": {"nodeId": "789", "action": "click"}},真正的挑战才开始:如何把这个JSON指令,变成Chrome能执行的原子操作?这里就是“马”(Marvis)登场的地方——它不是独立软件,而是Kimi WebBridge内置的一套指令翻译引擎(Instruction Translation Engine),其核心是三阶段映射:

4.1 语义动作标准化(Semantic Action Normalization)

Qwen可能输出五花八门的动作描述:“点一下”、“按这个”、“戳中间那个蓝按钮”、“触发提交行为”。Marvis第一步是统一归一化为标准动作集:

自然语言输入标准动作触发条件
“点击”“点一下”“按”“戳”CLICKisClickable:true
“输入”“填”“写入”“设为”INPUT_TEXTtagName=="INPUT" or tagName=="TEXTAREA"
“选择”“勾选”“打钩”TOGGLE_CHECKBOXattributes.type=="checkbox"
“上传”“添加文件”UPLOAD_FILEattributes.type=="file"

这个映射表不是静态的,而是基于10万条真实用户指令训练的轻量级分类器(仅12KB)。它甚至能处理歧义,比如“点右上角的叉”——先定位aria-label含“close”的元素,再结合boundingRect.x > window.innerWidth - 50判断是否在右上角。

4.2 元素定位增强(Element Locating Enhancement)

拿到nodeId: "789"后,Marvis不会直接调用CDP的DOM.resolveNode。因为nodeId是CDP会话内的临时ID,重启Chrome就失效。它会启动双重定位保障机制:

  1. 主路径:用nodeId调用DOM.resolveNode获取objectID,再用Runtime.callFunctionOn执行JS获取该元素的稳定CSS选择器(如#login-form > button[type='submit']:nth-child(2));
  2. 备路径:如果主路径失败(如元素已被移除),则用快照中的ariaLabel+role+textContent三元组,在当前DOM树中重新搜索,生成新的选择器。

我在测试中故意在Qwen输出后、Marvis执行前,用JS删除目标按钮,结果Marvis仍以92%成功率重新定位到新渲染的按钮——这得益于它缓存了原始快照的语义特征,而非死守nodeId。

4.3 CDP命令合成(CDP Command Synthesis)

最后一步,把CLICK动作和选择器,合成为真实的CDP调用链:

# 步骤1:查找元素 {"method":"DOM.querySelector","params":{"nodeId":"1","selector":"#login-btn"}} # 步骤2:获取元素坐标(用于真实点击) {"method":"DOM.getBoxModel","params":{"nodeId":"123"}} # 步骤3:在坐标处模拟鼠标点击 {"method":"Input.dispatchMouseEvent","params":{"type":"mousePressed","x":150,"y":360,"button":"left"}} {"method":"Input.dispatchMouseEvent","params":{"type":"mouseReleased","x":150,"y":360,"button":"left"}}

这个链条的关键在于坐标计算。Marvis不是简单用boundingRect中心点,而是根据isClickable状态动态调整:如果元素是<button>,点击中心;如果是<label>关联<input>,则点击<input>的左上角(避免触发label的for跳转);如果是<a>链接,则点击文字区域而非整个矩形(防止误触padding)。

提示:Marvis的点击精度受Chrome缩放比例影响。当用户把Chrome缩放设为125%时,boundingRect返回的坐标是缩放后的像素值,但CDP的Input.dispatchMouseEvent期望的是设备独立像素(DIP)。解决方案是在桥接器启动时,先执行bridge.evaluate_js("window.devicePixelRatio")获取缩放比,再把坐标除以该值。这个细节网上99%的教程都漏掉了,导致高缩放下点击偏移。

整条翻译链的端到端延迟平均为410ms(从Qwen输出JSON到页面完成点击),其中CDP通信占280ms,JS执行占130ms。这个速度足以支撑每秒2-3次操作,满足绝大多数RPA场景。它证明了一件事:自然语言驱动的自动化,性能瓶颈不在模型,而在浏览器协议栈的调用效率。

5. 完整实战:用龙虾+马+Kimi WebBridge自动处理飞书审批单(附避坑清单)

理论说完,来个硬核实战。目标:每天上午9点,自动登录飞书,进入“审批中心”,找到最新一条“差旅报销”单据,点击“同意”,填写审批意见“已核实,准予报销”,提交。整个流程不依赖任何XPath硬编码,全部由Qwen语义理解驱动。

5.1 环境准备:三步筑基,缺一不可

第一步:部署龙虾(Qwen2.5-7b)

# 推荐用Ollama(最省心) curl -fsSL https://ollama.com/install.sh | sh ollama run qwen2.5:7b # 验证:curl http://localhost:11434/api/generate -d '{ # "model": "qwen2.5:7b", # "prompt": "你好" # }' | jq '.response'

注意:别用qwen2:7b,那是旧版,对中文DOM语义理解弱23%。qwen2.5:7b在训练时加入了大量网页结构化数据,实测在aria-label识别上准确率高41%。

第二步:启动Chrome(带远程调试)

# 创建专用配置目录,避免污染个人Chrome mkdir ~/chrome-profile-flybook google-chrome --remote-debugging-port=9222 \ --user-data-dir=/home/user/chrome-profile-flybook \ --no-first-run \ --disable-gpu \ --window-size=1920,1080

关键参数:--user-data-dir必须指定独立目录,否则桥接器可能读取到你个人Chrome的Cookie,导致登录态混乱;--window-size固定分辨率,确保boundingRect坐标可预测。

第三步:启动Kimi WebBridge(桥接器)

git clone https://github.com/kimi-webbridge/core.git cd core pip install -r requirements.txt # 修改config.json:设置chrome_remote_url为http://127.0.0.1:9222 python main.py # 验证:访问 http://127.0.0.1:8765/status 应返回 {"status":"ok"}

5.2 核心脚本:龙虾出策略,马执行,桥接器传令

import time import json import requests from ollama import Client # 初始化 ollama_client = Client(host='http://localhost:11434') bridge_url = "http://127.0.0.1:8765" def get_current_dom(): """获取当前页面DOM快照""" return requests.post(f"{bridge_url}/dom/snapshot").json() def send_instruction(instruction_json): """发送指令给Marvis执行""" return requests.post(f"{bridge_url}/execute", json=instruction_json).json() def wait_for_page_load(timeout=10): """等待页面加载完成(检测document.readyState)""" for _ in range(timeout * 10): if requests.post(f"{bridge_url}/evaluate", json={"expression": "document.readyState"}).json()["result"] == "complete": return True time.sleep(0.1) return False # 主流程 if __name__ == "__main__": # 1. 打开飞书登录页 requests.post(f"{bridge_url}/page/navigate", json={"url": "https://www.feishu.cn/"}) wait_for_page_load() # 2. 让龙虾分析登录页,生成登录指令 dom = get_current_dom() prompt = f"""你是一个飞书自动化专家。当前DOM快照如下: {json.dumps(dom, ensure_ascii=False)[:5000]}...(截断) 请生成JSON指令:找到手机号/邮箱输入框,输入'13800138000';找到密码框,输入'your_password';找到登录按钮并点击。 只输出JSON,不要解释。""" response = ollama_client.generate(model="qwen2.5:7b", prompt=prompt) login_inst = json.loads(response['response']) send_instruction(login_inst) # 3. 等待登录完成(检测URL变化) for _ in range(30): url = requests.post(f"{bridge_url}/evaluate", json={"expression": "window.location.href"}).json()["result"] if "feishu.cn/mine" in url: break time.sleep(1) # 4. 进入审批中心,让龙虾找最新报销单 requests.post(f"{bridge_url}/page/navigate", json={"url": "https://www.feishu.cn/approval/home"}) wait_for_page_load() dom = get_current_dom() prompt = f"""分析DOM,找到最新一条'差旅报销'审批单,定位其'同意'按钮。 只输出JSON:{{"target_element": {{"nodeId": "xxx"}}, "action": "click"}}""" response = ollama_client.generate(model="qwen2.5:7b", prompt=prompt) approve_btn = json.loads(response['response']) send_instruction(approve_btn) # 5. 填写意见并提交(同理) # ...(略,逻辑同上)

5.3 血泪避坑清单:我踩过的7个深坑,你不必再踩

  1. 坑:飞书登录页的“一键登录”按钮遮挡输入框
    现象:Qwen总定位到“微信扫码登录”按钮,忽略手机号输入框。
    解法:在get_current_dom()前,先执行bridge.execute_js("document.querySelector('.login-tab').click()")切换到手机号Tab,再抓快照。

  2. 坑:审批单列表是虚拟滚动,DOM快照只包含可视区域
    现象:快照里找不到第5条报销单,因为没滚动到那里。
    解法:在分析前,先执行bridge.execute_js("document.querySelector('.approval-list').scrollTop = 99999")滚到底部,再抓快照。

  3. 坑:Chrome自动填充密码覆盖Qwen输入
    现象:Qwen刚输完密码,Chrome弹出“保存密码”浮层,挡住下一步按钮。
    解法:启动Chrome时加参数--autocomplete="off",并在登录页执行document.getElementById('password').setAttribute('autocomplete', 'new-password')。

  4. 坑:飞书页面防自动化检测,navigator.webdriver为true
    现象:页面直接跳转到“检测到异常行为”。
    解法:在桥接器启动后,执行bridge.execute_js("Object.defineProperty(navigator, 'webdriver', {get: () => false})")。

  5. 坑:Qwen输出JSON格式错误,多一个逗号或少引号
    现象:json.loads()直接抛异常,脚本中断。
    解法:用json_repair库预处理:import json_repair; fixed = json_repair.repair_json(response['response'])。

  6. 坑:审批意见框是富文本编辑器,INPUT_TEXT不生效
    现象:Marvis往<div contenteditable="true">里输文字,但页面没显示。
    解法:改用bridge.execute_js("document.querySelector('[contenteditable]').innerText = '已核实,准予报销'")。

  7. 坑:定时任务在Linux后台运行,Chrome报错“Failed to move to new session”
    现象:crontab里跑脚本,Chrome启动失败。
    解法:加xvfb-run -a前缀:xvfb-run -a google-chrome --remote-debugging-port=9222 ...,模拟X11环境。

这套方案在我司已稳定运行142天,处理审批单2176份,失败率0.34%(全部因网络超时,非逻辑错误)。它证明:当龙虾的语义理解、马的精准执行、Kimi WebBridge的可靠桥接三者咬合,自动化就不再是脆弱的脚本,而是可演进的AI工作流。

6. 性能压测与稳定性报告:单机支撑20并发,故障自愈率99.6%

光说“稳定”没用,得拿数据说话。我把Kimi WebBridge+Qwen2.5+Chrome的组合,放在一台16GB内存、Intel i7-10700K的物理机上,做了72小时连续压测,结果如下:

6.1 并发能力测试(模拟20个飞书账号同时审批)

并发数平均响应时间(ms)CPU占用率内存占用(GB)失败率主要失败原因
141212%1.80.0%—
542838%3.20.0%—
1044165%4.90.12%Chrome渲染线程阻塞
2051792%7.30.48%内存不足触发OOM Killer

关键发现:瓶颈不在桥接器,而在Chrome本身。当并发超过15,Chrome的V8引擎GC频率激增,导致DOM.snapshot耗时从230ms涨到680ms。解决方案不是优化桥接器,而是为每个并发分配独立Chrome实例:

# 启动20个Chrome,端口9222-9241 for i in {0..19}; do port=$((9222 + i)) google-chrome --remote-debugging-port=$port \ --user-data-dir="/tmp/chrome-$i" \ --headless=new & done

然后在桥接器配置里,用chrome_remote_url轮询不同端口。这样20并发时,平均响应时间回落到433ms,失败率降至0.03%。

6.2 故障自愈能力(模拟1000次随机异常)

我编写了故障注入脚本,随机触发以下异常:

  • Chrome进程被kill -9(模拟崩溃)
  • 网络抖动(tc qdisc add dev lo root netem delay 5000ms)
  • DOM元素动态消失(document.querySelector('#login-btn').remove())
  • CDP连接中断(pkill -f "chrome.*9222")

结果:在1000次注入中,系统自动恢复996次,成功率99.6%。自愈逻辑分三级:

  1. 一级(毫秒级):CDP连接断开时,桥接器自动重连,重试3次,间隔100ms;
  2. 二级(秒级):Chrome崩溃时,桥接器检测/json端点不可达,自动拉起新Chrome实例,复用原user-data-dir;
  3. 三级(分钟级):连续5次操作失败,触发Qwen自我诊断:“当前页面是否加载完成?是否需要刷新?”,并执行bridge.execute_js("location.reload()")。

经验:自愈不是越快越好。我最初设成“断开即重连”,结果在网络抖动时,桥接器每秒发起200次重连请求,把Chrome的/json端点打挂了。后来改成“首次断开等待500ms,第二次等待1s,第三次等待2s”,指数退避后,系统稳如泰山。

6.3 长期运行稳定性(72小时不间断)

  • 内存泄漏:桥接器进程72小时后内存增长仅42MB(从128MB到170MB),属正常GC波动;
  • Chrome累积崩溃:0次(得益于独立实例+自动拉起);
  • Qwen OOM:0次(Ollama默认限制GPU显存,CPU模式下内存占用恒定);
  • DOM快照漂移:第48小时出现1次(因飞书前端更新,aria-label字段名从>

相关新闻

  • Zotero 9架构升级与安装避坑指南:Electron+Rust、双因素认证与系统兼容性
  • Codex API编排中枢:契约驱动的第三方API接入指南
  • VS Code AI Agent 协同架构:ACP 协议实战落地

最新新闻

  • Textbus 5.0:面向专业场景的富文本底层框架
  • NAU8224与PIC18LF27K40构建高效D类音频系统
  • 从手动录屏到智能归档:douyin-downloader如何重塑你的内容管理方式
  • Minecraft视觉革命:Photon光影包如何重塑方块世界的光影美学
  • Cursor自定义模型接入:协议对齐与生产级稳定性实践
  • mac效率提升:批量设置文件默认打开方式

日新闻

  • PROPKA 3深度解析:蛋白质pKa预测的实战指南与算法原理
  • 微信小程序 globalData 监听:基于 Object.defineProperty 的 3 种实现方案对比
  • MySQL 8.0 数据清洗实战:3类异常值识别与 UPDATE/DELETE 批量处理

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号