当前位置: 首页 > news >正文

AI 玩转网页自动化无压力:基于函数计算 FC 构建 Browser Tool Sandbox

作者:计缘

浏览器自动化的前世今生

从 Web 1.0 到 Web2.0,再到单页应用(SPA)和 React/Vue 等前端框架时代,再到当下的 AI Agent 时代。每个阶段都有当时的浏览器自动化的王者。

Selenium 昔日王者

Selenium 的时代诞生于 Web 1.0 和 2.0 初期,当时网页主要是静态或多页面应用。Selenium 的架构基于命令驱动、需要显式等待,这完美契合了那个时代可预测的、步骤化的测试流程。

作为最早的行业标准,Selenium 的核心是 WebDriver 协议。该协议充当了测试脚本和浏览器驱动程序之间的中间层,通过 HTTP 进行通信。这种架构虽然实现了广泛的跨浏览器和跨语言兼容性,但也引入了额外的网络开销,导致性能相对较低,且架构较为复杂。

虽然 Selenium 支持的语言(Java, Python, C#, Ruby, JavaScript 等)和兼容性(包括一些旧版浏览器,比如老 IE)相对广泛,但是性能问题,复杂度问题使得使用 Selenium 构建的自动化脚本非常脆弱和不稳定,也无法满足当前各种具备“动态”属性的前端特性和需求。

Puppeteer 现代挑战者

随着单页应用 (SPA) 和 React/Vue 等前端框架的普及,Web 变得高度动态、异步和状态化。网页不再是简单的文档,而是复杂的应用程序。为了应对这种新的现实,Google Chrome 团队开发了Puppeteer。 Puppeteer 绕过了 WebDriver 协议,通过 WebSocket 直接与 Chrome DevTools Protocol (CDP) 通信。这种直接通信的方式极大地提升了执行速度和控制的可靠性。

显而易见,Puppeteer 的最大优势是与 Chrome/Chromium 浏览器的深度集成,这也是 Puppeteer 性能很好的核心原因,这让 Puppeteer 非常适合执行 Chrome 特定的自动化任务,如网页截图、PDF 生成、Web录制和性能分析等。

但是 Puppeteer 也有明显的劣势,核心还是在支持的语言和兼容性方面。目前只支持 JavaScript、Node.js 和 Chromium 生态,虽然也支持 Firefox,但其跨浏览器能力远不如 Selenium 或 Playwright。

Playwright 当代领跑者

Playwright 由微软推出,其核心开发团队正是来自最初创建 Puppeteer 的团队。Playwright 沿用了与 CDP 类似的 WebSocket 直接通信架构,但将其扩展为了一个统一的协议,能够同时支持 Chromium、Firefox 和 WebKit (Safari) 三大主流浏览器引擎,且提供完全一致的 API。

在当前 AI Agent 的时代下,AI Agent 代表了更高维度的交互模式。AI Agent 不是在执行预设的脚本,而是在根据实时感知的页面状态进行动态决策。这种模式要求其底层的执行器必须具备极高的鲁棒性、稳定性和对异步环境的适应能力,以应对来自 Web 和 AI 推理过程的双重不确定性。而 Playwright 正是在这个大背景下诞生的,所以天然具备自动等待、工具链、面向现在 Web 框架的鲁棒性等特性,从而使其成为构建 AI Agent 的理想选择。

  • 自动等待(Auto-waiting):这是 Playwright 的核心价值点之一。它会在执行点击、输入等操作前,自动等待目标元素变为可操作状态。这极大地简化了代码,并从根本上解决了由异步加载导致的脚本不稳定性问题,对于需要应对不可预测的 Web 环境的 AI Agent 来说至关重要。
  • 强大的工具链:内置了 Codegen(录制生成代码)、Playwright Inspector(交互式调试)和 Trace Viewer(全链路追踪)等强大的开发工具,显著提升了开发和调试效率。
  • 面向现代 Web 的鲁棒性:对 Shadow DOM、iframes 等现代 Web 应用的复杂结构提供了无缝支持,使得与这些元素的交互变得简单直接。

AI Agent 场景下为什么需要 Browser Tool Sandbox

应用场景

当下,AI Agent 的能力类比人类,所以任何一个人类用户能在浏览器中完成的事情,理论上都可以通过 Browser Tool 赋予 AI Agent 来完成。但是有很多网站、企业内部系统和在线服务都是为人类用户设计的图形界面,它们并没有提供专门为机器准备的 API 接口。所以,Browser Tool 可以使得 AI Agent 能够直接操作这些为人类设计的界面,从而极大地扩展了其能力范围。比如:

  • 信息获取与研究:

    • 网页抓取与数据提取:从复杂的动态网站中提取数据,例如收集产品评论、监控电商价格、从目录中提取联系方式等。
    • 市场与竞品分析:自动访问竞争对手的网站,收集产品信息、定价策略和客户评价,并进行汇总分析。
    • 综合研究:跨多个信息源进行全面的网络研究,并综合信息生成报告或摘要。
    • 等等
  • 工作流程自动化:

    • 表单填写与提交:自动登录网站、填写复杂的在线表单并提交。
    • 潜在客户挖掘:自动从 LinkedIn 等平台筛选和收集潜在客户信息,并整合到 CRM 或表格中。
    • 电子商务自动化管理:自动化处理订单、更新商品信息、监控库存等。
    • 等等
  • 个人与工作协同:

    • 差旅规划与预订: 根据要求自动搜索并预订机票、酒店。
    • 日程与事务管理: 访问在线日历,根据邮件或新闻内容安排会议。
    • 数据整理: 访问在线表格,并根据指令进行数据更新和格式调整。
    • 等等
  • 社交媒体与内容互动:

    • 内容发布与互动: 自动登录社交媒体账户(如 Weibo、LinkedIn、Twitter),发布帖子或与其他帖子进行互动。
    • 等等

安全隐患

然而,AI Agent 的强大自主性同时也带来了很多安全问题:

参考:https://dev.to/polozhevets/are-browser-ai-agents-a-security-time-bomb-unpacking-the-risks-and-how-to-stay-safe-55fihttps://www.imperva.com/blog/the-rise-of-agentic-ai-uncovering-security-risks-in-ai-web-agents

  • 提示词注入与任务劫持(Prompt Injection & Task Hijacking): 攻击者可以将恶意指令嵌入到看似无害的网页内容中,例如产品评论、论坛帖子,甚至是隐藏的 HTML < div > 标签里。当 AI Agent 为了理解页面内容而解析这些文本时,会无意中执行攻击者的指令。有研究论文指出:仅仅通过让 Agent 读取一个包含恶意内容的 GitHub issue 页面,就成功诱使其泄露了用户的凭证 。

  • 凭证与数据窃取(Credential & Data Exfiltration): 由于 AI Agent 在使用 Browser Tool 时可能会需要登录,所以它天然地能够访问到浏览器状态中的所有敏感信息。一个被劫持的 AI Agent 可以被指令去定位并窃取会话 cookies、本地存储(Local Storage)中的数据,乃至浏览器自动填充的密码。开源框架 Browser Use 最近被披露的一个 CVE 漏洞,就恰恰是这种凭证窃取风险的真实写照。

  • OAuth 授权和钓鱼诱骗: AI Agent 同样可能被钓鱼网站或恶意的 OAuth 授权流程所欺骗。安全公司 SquareX 的研究显示,一个 AI Agent 在被要求注册文件共享工具时,盲目地批准了一个恶意应用的 OAuth 请求,授予了攻击者完全访问用户电子邮件的权限。整个过程中,AI Agent 忽略了多个对于人类而言极为明显的危险信号。

综上所述,在沙箱环境(Sandbox)中运行 Browser Tool 或者 Browser Use Agent 就变的至关重要,只有在沙箱(Sandbox)提供的受控环境中,我们才有可能安全地释放 AI Agent 的潜力。

Sandbox 环境有效避免安全隐患

众所周知,沙箱环境(Sandbox)最基本的作用是充当一个与你的主机系统、主程序完全隔离的、受控的环境 。你可以把它想象成将 Browser Agent 放置在一个行为受到严格限制的安全房间里。所以,即使 AI Agent 被欺骗而“失控”,沙箱环境(Sandbox)也能将“爆炸半径”控制在内部,确保损害仅限于这个临时的、可随时销毁的环境。

  • 防止系统级损害:即使攻击者成功注入恶意提示并劫持了 AI Agent,沙箱环境(Sandbox)也能充当一道坚实的屏障。被入侵的 AI Agent 被困在这个隔离环境中,无法对你的真实计算机执行破坏性操作,例如删除个人文件、安装恶意软件或更改关键系统配置。
  • 限制资源访问:沙箱环境(Sandbox)的特点就是隔离,网络隔离,资源隔离,所以可以阻止 AI Agent 访问其指定范围之外的资源。例如,当发现 AI Agent 被劫持后,一个合格的沙箱环境(Sandbox)可以快速禁止被劫持 AI Agent 访问外部服务。或者快速关闭沙箱环境(Sandbox),直接泯灭掉被劫持的 AI Agent 以及所有数据。本质就是阻止数据外泄。

手把手带你构建 Browser Tool Sandbox

在带大家实操构建 Browser Tool Sandbox 前,我对整体的架构和涉及到的组件,以及基于函数计算 FC 构建的 Browser Tool Sandbox 的优势先作以解释,让大家有初步的概念。

FC Browser Tool Sandbox 架构

image

核心组件解释:

  • Xvfb (X Virtual Framebuffer): 作用是在 Linux 中创建一个虚拟的显示器,可以让图形程序可以在没有物理显示器的服务器上运行,所有图形输出都在内存中完成,不需要真实屏幕。
  • VNC (Virtual Network Computing): 远程桌面控制技术,允许你通过网络查看和控制另一台计算机的桌面。
  • RFB (Remote Framebuffer Protocol): 远程帧缓冲协议,是 VNC 的底层通信协议。定义了如何传输屏幕图像和键盘鼠标事件,本质上就是 VNC 的"语言规范"。
  • x11vnc: 一个 VNC 服务器程序,专门用于共享 X11 显示。可以把真实的或虚拟的 X11 桌面通过 VNC 协议分享出去。
  • x11 (x Window System): Linux/Unix 系统的图形显示系统,负责管理窗口、处理鼠标键盘输入、绘制图形界面。
  • Fluxbox: 轻量级的窗口管理器,为 x11 提供基本的窗口管理功能。
  • 显示编号(Display Number): x 服务器的显示编号
    • :0 = 第一个X服务器(通常是你的物理显示器)
    • :1 = 第二个X服务器(可能是另一个物理显示器或虚拟显示器)
    • :2 = 第三个X服务器,以此类推
  • NoVNC: 基于 HTML5 的 VNC 客户端,让你能够在网页浏览器中直接访问 VNC 服务器。
  • CDP(Chrome DevTools Protocol): 远程调试协议,让开发者能够通过 WebSocket 连接直接控制 Chromium 内核浏览器的底层功能。

FC Browser Tool Sandbox 优势

别看上面涉及到那么多的组件和概念,其实我们都已经封装好了,你只需要一键,就可以把 Browser Tool Sandbox 构建出来并使用。除了快捷的构建以外,基于函数计算 FC 构建的 Browser Tool Sandbox 还有其他的一些优势和特性:

  • 安全性:这个是首当其冲的优势,因为函数计算 FC 可以提供完全隔离的运行环境,所以可以杜绝 AI Agent 操作浏览器时的安全隐患,上文中已经做过解释。
  • 会话管理:实现浏览器页签级别的会话管理,包括自动保存会话状态,支持断线后的会话恢复,自动清理过期会话等能力。
  • 内置录制/回放:支持每个 VNC 会话自动录制。
  • 可观测:支持连统计(活跃 VNC 连接数)、资源使用(CPU、内存、磁盘)、性能(API 响应时间、错误率等)三个维度的可观测。
  • 启动速度:函数计算FC实例的百毫秒级拉起速度配合预下载的浏览器驱动,大幅减少启动时间。
  • 资源管理:基于函数计算 FC,可以针对不同的浏览器访问内容,构建不同规格的实例运行,做到精细化管控 Browser Tool Sandbox 资源。
  • 并发管理:支持多个浏览器会话同时运行,可智能管理 VNC 连接池。

FC Browser Tool Sandbox 构建实操

部署

登录阿里云帐号,打开 FunctionAI 中的 Browser Tool Sandbox [ 1] 模板,点击立即部署。

image

image

  • 项目名称:根据需求自行输入。
  • 地域:选择对应的地域。
  • 服务角色 ARN:选择 AliyunFcDeafultRole。
  • 实例名称,根据需求自行输入。

点击部署项目按钮,等待部署。

image

几分钟后,整个项目即可部署完成。

image

整个项目包含 3 个函数:

  • browserTool:包含了上述架构中的虚拟显示层、VNC 服务层、协议代理层内容。
  • mcp:包含了上述架构中的浏览器自动化层内容。
  • vncclient:包含了 NoVNC 客户端。

使用 NoVNC 客户端

选择 nvcclient 函数,进入触发器页签,可以看到访问 NoVNC 客户端的公网地址和内网地址。

image

但是为了安全考虑,我们提供的默认域名不能直接在浏览器中访问,所以需要配合云原生 API 网关或者绑定自定义域名来使用。

进入配置页签,找到最下方的自定义域名,点击编辑进行配置。

image

具体的配置方法可参见文档:配置自定义域名 [ 2]

当配置完自定义域名后可以看到该函数有变更,点击右上角部署按钮进行部署。

image

部署成功后,使用浏览器访问你绑定的自定义域名,便可以打开 NoVNC 客户端。

image

点击左侧配置按钮,在 WebSocket 中配置协议代理层的地址。

image

  • 主机:进入 browserTool 函数,点击触发器页签,负责公网访问地址。这里因为是 WS 协议,所以不需要 http://

image

  • 端口:80
  • 路径:ws/livestream

配置完后点击连接,便可以使 NoVNC 通过 RBF 协议连接到 x11VNC 服务了。

image

这里因为没有对浏览器做任何请求,所以看到的是黑屏,后续我们通过 Playwright 对浏览器做操作时,通过 NoVNC 就可以看到内容了。

使用 Playwright MCP

文本中我使用 DeepChat 这个客户端来演示如何使用 Playwright MCP 操作浏览器。大家也可以使用其他的 MCP Client,配置 MCP 服务的方式都是一致的。

进入 DeepChat 的 MCP 服务设置界面,点击新增按钮。

image

image

image

  • 服务器名称:根据需求自行输入。
  • 服务器类型:选择服务器发送事件(SSE)
  • 基础 URL:进入 mcp 函数,点击服务测试页签,可以看到访问地址。

image

  • 自动授权:选择全部
  • 自定义请求头:因为默认有 Token,所以需要配置 Authorization Header。同样在服务测试页签可以找到 Token。
    • Content-Type=application/json
    • Authorization=Bearer [Token]

点击提交并开启该 MCP 服务后,可以看到我们提供的 21 个工具。

image

image

回到对话界面,开启 Playwright MCP 服务。

image

我们可以输入“使用浏览器,在 Bing 中搜索函数计算,列出前 3 条内容”。

image

此时,开始调用 Playwright MCP,对浏览器进行操作。
image

此时打开 NoVNC 客户端,可以看到界面中显示了浏览器,并访问了 Bing。

image

然后开始使用 browser_type 工具,也就是开始进行搜索。

image

此时在 NoVNC 客户端可以看到在搜索框输入了函数计算,并进行了搜索。

image

最后显示出了结果。

image

大家可以使用提供的其他工具玩出更多花样。

使用 Browser Use 操作

使用 Browser Use 框架稍微需要点编程能力。在熟悉的 Code IDE 中使用如下实例代码:

from browser_use import Agent, BrowserSession
from browser_use.llm import ChatDeepSeek
from browser_use.browser import BrowserProfile
from playwright.async_api import async_playwright
from dotenv import load_dotenv
import os
import asyncio
load_dotenv()
async def main():
    browser_session_wss_url = "ws://[browserTool函数的连接地址]/ws/automation"
    browser_session = BrowserSession(cdp_url=browser_session_wss_url, browser_profile=BrowserProfile(
        headless=False,
        user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
        timeout= 3000000,
        keep_alive=True,
    ))
    # 需要修改DeepSeek的sk,如果您使用其他模型,请自行修改
    llm = ChatDeepSeek(api_key="sk-your-deepseek-sk")
    agent = Agent(
        task="请访问 https://www.aliyun.com/product/list 并分析一下阿里云目前都提供了哪些产品",
        llm=llm,
        browser_session=browser_session,
        use_vision=True
    )
    result = await agent.run()
    print(result)
if __name__ == "__main__":
    asyncio.run(main())
  • browser_session_wss_url 这个属性的值从 browserTool 函数的触发器页签中获取,协议需要改为 ws://。

image

使用 Puppeteer 操作

示例代码:

const puppeteer = require('puppeteer-core');
const browser = await puppeteer.connect({
  browserWSEndpoint: 'ws://[browserTool函数的连接地址]/ws/automation/'
});
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'screenshot.png' });
await browser.close();

使用 REST API 操作

  • 打开特定页面:
curl -X POST http://[browserTool函数的连接地址]/navigate \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com", "wait_for":{"timeout": 3000}}'
● 截图:
  • 截图:
curl-XPOSThttp://[browserTool函数的连接地址]/screenshot\
-H"Content-Type: application/json"\
-d'{"url": "https://example.com"}'\
--outputscreenshot.png
  • 生成 PDF:
curl-XPOSThttp://[browserTool函数的连接地址]/pdf\
-H"Content-Type: application/json"\
-d'{"url": "https://example.com", "options": {"format": "A4"}}'\
--outputdocument.pdf

提取内容:

curl-XPOSThttp://[browserTool函数的连接地址]/content\
-H"Content-Type: application/json"\
-d'{"url": "https://example.com", "selector": "h1"}'

录制:

# 获取录制文件列表
curlhttp://localhost:3000/api/vnc/recordings
# 下载录制文件
curlhttp://localhost:3000/api/vnc/recordings/filename.fbs
# 删除录制文件
curl-XDELETEhttp://localhost:3000/api/vnc/recordings/filename.fbs

会话管理

Context API:

# 创建 Context
curl-XPOSThttp://[browserTool函数的连接地址]/contexts\
-H"Content-Type: application/json"\
-d'{
"name":"test-session",
"browser":"chromium"
}'
# 使用 Context 进行操作
curl-XPOSThttp://[browserTool函数的连接地址]/contexts/navigate\
-H"Content-Type: application/json"\
-d'{
"context_id":"context-id",
"url":"https://example.com"
}'

相关链接:

[1] Browser Tool Sandbox

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Ffunctionai.console.aliyun.com%2Ftemplate-detail%3Ftemplate%3DPlaywrightMCP-With-BrowserTool%400.1.2&clearRedirectCookie=1&lang=zh

[2] 配置自定义域名

https://help.aliyun.com/zh/functioncompute/fc/user-guide/configure-custom-domain-names

相关文章:

AI 玩转网页自动化无压力:基于函数计算 FC 构建 Browser Tool Sandbox

从 Web 1.0 到 Web2.0,再到单页应用(SPA)和 React/Vue 等前端框架时代,再到当下的 AI Agent 时代。每个阶段都有当时的浏览器自动化的王者。作者:计缘 浏览器自动化的前世今生 从 Web 1.0 到 Web2.0,再到单页应用(SPA)和 React/Vue 等前端框架时代,再到当下的 AI Agen…...

AI时代的全栈框架:独立开发者的机会与挑战

独立开发者终于能全干了?AI帮忙还愁生态?一体性是王道,但选什么框架还得自己纠结。AI写代码真靠谱?前言 本文本来只是 DjangoStarter v3.2.1 新版本发布博客里的一段思考,不过越写越长,干脆拆分成一篇独立的文章得了。😄全栈这个词已经被喊烂了,但在 AI 时代,它的含义…...

创建逻辑卷

查看创建pv创建vg创建lv...

Server 13 ,CentOS 上使用 Nginx 部署多个前端项目完整指南( 协助多端口与脚本自动化 )

Server 13 ,CentOS 上使用 Nginx 部署多个前端项目完整指南( 协助多端口与脚本自动化 )pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…...

洛谷P2490 [SDOI2011] 黑白棋

传送门 首先容易想到,白色棋子与其右边的黑色棋子越靠越近,最后挨在一起,与其他棋子无关。 朴素地想到 \(NimK\) 的建模,一共有 \(\dfrac{k}{2}\) 堆石子,每次取 \(d\) 堆。 注意到必胜局面比较难求,适合正难则反,用总方案数 \(\dbinom{n}{k}\) 减去必败局势。 难点在于…...

WGCLOUD的告警日志在哪儿存贮的?

WGCLOUD所有发送的告警消息都存贮在【系统日志】模块里 WGCLOUD系统日志功能模块,用于存贮系统操作的各种记录,也包括各种系统运行的日志信息,告警通知信息,告警恢复信息 所有系统运行产生的错误日志,操作日志,告警日志都会记录在系统日志中 系统日志记录只能查看,不能删…...

传统软件部署的痛点

这是对之前《Docker 容器化》文章的一个补充 在 Docker 等容器技术普及前,开发、测试、运维团队常被环境不一致、部署复杂、资源浪费、扩容低效为典型的问题困扰,这些问题不仅可能导致项目的交付周期的延后,还会引发跨团队协作矛盾,甚至导致线上故障,我们逐一来看每个问题…...

HarmonyOS 5分布式数据管理初探:实现跨设备数据同步

本文将引导您了解HarmonyOS 5的分布式数据管理能力,并通过一个简单的示例演示如何实现跨设备数据同步。1. 分布式数据管理简介 HarmonyOS的分布式数据管理能力允许应用程序在多个设备之间无缝地同步和共享数据。它抽象了底层设备差异,让开发者可以像操作本地数据一样处理跨设…...

qoj965 Trade

题意 有 \(n\) 件商品,第 \(i\) 件商品有基准价格 \(c_i\) 和抬价价格 \(p_i\),\(p_i\) 互不相同,每件商品只能买一件,你有 \(S\) 元钱。 若你买了 \(k\) 件商品,则第 \(i\) 件商品的价格为 \(c_i+k\times p_i\)。问你最多能买多少件商品。 \(1\le c_i\le 10^9,0\le p_i,S…...

复盘我的第一个 大模型Agent:从核心循环到模块化架构的演进之路

本文将以我编写的一个 Go Agent Demo 为例,穿透各类框架的表层封装,回归其工程本质。我将首先分析其核心的 ReAct 循环,并展示这个看似简单的循环是如何通过模块化设计,演进为一个结构化、可扩展的软件系统。最近,我投入了一些时间学习和研究大语言模型(LLM)驱动的 Agen…...

Linux内核不使用bear如何快速生成compile_commands.json使用vscode阅读源码

野火鲁班猫SDK 进入内核目录 cd /opt/LubanCat_SDK/kernel-5.10 编译内核 ../build.sh kernel 生成compile_commands.json /opt/LubanCat_SDK/kernel-5.10/scripts/clang-tools/gen_compile_commands.py打开vscode code . 安装clangd插件 打开一个c文件 开始生成clangd数据库...

Docker 容器化

引言 在解释docker是什么之前,我们首先应该先了解的是容器化的概念。 什么是容器?就是一个沙箱,在这个沙箱中涵盖了特定应用运行的一切依赖的内容。但他不是一个操作系统,且和底层的操作系统是隔离的。 什么是容器化?容器化就是将软件和应用所需要的所有依赖打包到一个独立…...

phpmyadmin漏洞利用

1、信息搜集 1.1、版本号 访问/README /doc/html/index.html获取版本信息1.2、绝对路径 (1) phpinfo() 页面:最理想的情况,直接显示web路径 (2) web报错信息:可以通过各种fuzz尝试让目标报错,也有可能爆出绝对路径 (3) 一些集成的web框架:如果目标站点是利用phpstudy、LAM…...

CF19E Fairy

题意:给定一个无向图,$n,m \le 10^4$,需对每个点黑白染色,使每条边两端点颜色不同,求对每一条边,删除该边后是否存在合法染色方案。思路:合法染色方案即删除边后图为二分图,不存在奇环。先构造 dfs 生成树,将一条非树边和其覆盖树边形成的环称为基本环,包含多个非树边…...

Wireshark 学习笔记(二)

Wireshark 学习笔记 (二) 数据包操作 统计|摘要 统计 此菜单提供多种统计选项,可供调查,帮助用户了解流量范围、可用协议、端点和会话等宏观情况,以及一些特定协议的详细信息,如 DHCP、DNS 和 HTTP/2。 解析地址 此选项通过提供解析地址及其主机名的列表,帮助分析师识别捕…...

鸿蒙应用开发从入门到实战(三):第一个鸿蒙应用

持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中。本文使用DevEco Studio创建应用,并使用预览、模拟器、真机三种方式进行调试。​ 大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更…...

Litctf2025 Write-up

逼逼叨 很难受啊,出去跑项目封闭管理,结果没打上,只能赛后复现了。 上班是真滴累 Web [LitCTF 2025]多重宇宙日记进来先随便注册个账户,说实话看到这样的题目第一眼怀疑二次注入、直接不想做登陆后发现可以设置主题语言之类的,随便试试无果查看页面源码摘出JS中的关键代码…...

DFS算法(递归)

DFS算法(递归) DFS(Depth-First Search,深度优先搜索)是一种用于遍历或搜索树、图等数据结构的算法。其核心思想是:沿着一条路径尽可能深入地探索,直到无法继续前进(遇到已访问节点或无未访问邻接节点),再回溯到上一个节点,选择另一条未探索的路径继续深入。所以可以…...

博客园出海记

在开篇中我们宣布了博客园出海计划的启航,出海航船选择了阿里云。第一件准备工作是在航船上组装集装箱 —— 搭建 Kubernetes 集群。出海根据地选在了阿里云新加坡机房,Kubernetes 集群用阿里云 ECS 自己搭建,没有使用阿里云容器服务 ACK。首先购买一台 ECS 用于部署 Contro…...

vue3 - pinia状态管理库

概念 Pinia 是 Vue 官方推荐的状态管理库,是 Vuex 的继任者(Vuex 作者同一人开发),专门为 Vue 3 设计,完全支持 Composition API 和 TypeScript。它简化了状态管理的流程,提供了更简洁的 API 和更好的开发体验。 核心特点简洁的 API 去掉了 Vuex 中的 mutation(突变),…...

做会议海报就是在淘汰老实人

还好有模板直接用!不仅节省更多时间,做出来的ppt,或是学术海报既清晰又美观,导师看了都说好! ppt和学术海报都是可直接编辑的哦!每张文件图片均获取网络,仅供学习与研究交流使用。支持原创! 感兴趣可直接无套路领取 【450+学术会议海报poster模板】+【600+学术汇报PPT模…...

ubuntu24.04安装mysql5.7.42

环境Os:ubuntu 24.04 desktop桌面版mysql:5.7.42 说明: a.ubuntu24下安装mysql 5.7 使用的依赖库 需要创建软连接指向新的依赖库.查看操作系统信息root@hxl-VirtualBox:/# uname -a Linux hxl-VirtualBox 6.14.0-29-generic #29~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Aug 14…...

易基因:Cell封面:中国科学家杨学勇/黄三文m6A-seq等揭示同义突变通过表观转录调控机制决定生物性状|顶刊突破

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,中国农业科学院蔬菜花卉研究所杨学勇研究员、中国农业科学院深圳农业基因组所黄三文研究员和英国约翰英纳斯中心丁一倞研究员团队合作,以封面文章形式在顶刊《Cell》(细胞)上发表题为“Recessive epi…...

一文看懂Deepspeed:用ZeRO训练大模型原理解析及参数含义解释

实际训练中Deepspeed参数配置ZeRO各stage含义是什么,offload以及gradient checkpoint是如何起作用的,本篇基于ZeRO不同stage含义,以及实践时参数含义来阐述Deepspeed原理。 这几天在做大模型的微调,发现几乎所有都用到了deepspeed,这里给大家提供一个ChatGLM2在ptuning模式…...

AC-DC整流器双闭环控制MATLAB/Simulink仿真

AC-DC整流器双闭环控制系统的MATLAB/Simulink仿真程序,包含电压外环和电流内环控制。 这个仿真实现了一个三相PWM整流器的双闭环控制:电压外环:控制直流侧输出电压,提供电流内环的参考信号 电流内环:控制网侧电流,实现单位功率因数运行MATLAB:参数设置与仿真启动 % AC-D…...

新娘化妆 造型 美甲 护肤 资料合集

化妆的核心--眉妆 眉毛的结构认识眉毛主要由眉头眉峰眉尾眉头在鼻翼外侧到内眼角的垂直线上眉峰在眉头到眉尾的三分之二处, 是鼻翼外侧至人眼平视前方时外眼球的延长线上。眉腰眉头与眉峰中间称之为眉腰眉尾在鼻翼外侧到外眼角的 延长线上,或则嘴角到外眼角的延长线上。 标准…...

rabbitMQ-基础day1 - a

微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态,因此我们成这种调用方式为同步调…...

实用指南:Nginx反向代理与负载均衡部署

实用指南:Nginx反向代理与负载均衡部署pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

C# Avalonia 13- MoreDrawing - BlurEffects

C# Avalonia 13- MoreDrawing - BlurEffectsBlurEffects.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xm…...

【IEEE出版】第三届算法、图像处理与机器视觉国际学术会议(AIPMV2025)

由江苏科技大学、江苏大学、中国图象图形学学会联合主办,江苏科技大学计算机学院、镇江市计算机学会承办,镇江市软件行业协会、AEIC学术交流中心协办的第三届算法、图像处理与机器视觉国际学术会议(AIPMV2025)将于2025年9月26日-28日在江苏镇江召开。【江苏科技大学、江苏大…...

C++ - 了解STL的数据容器

CSP考试用的STL内容也越来越多了,我们有必要详细了解一下。 常用容器array 静态数组(大小固定,) vector 矢量(动态数组,大小可变) string 字符串 stack 栈 queue 队列 set 集合 map 键值对array 静态数组 array是固定大小的序列容器,array中包含特定个数并且严格按照线…...

收费详情

套餐价格_真免费!导出采集结果无任何限制_后羿采集器 https://www.houyicaiji.com/?type=pricing个人免费版 ¥ 0永久免费,不要积分智能模式:智能识别列表和分页,一键采集 流程图模式:可视化操作,可以模拟人为操作 采集任务:100个任务 支持多任务同时运行,无数量限制,…...

bluetoothctl UUIDs

数据 bluetoothctl 中的抓取数据: [CHG] Device 66:55:44:33:22:11 UUIDs: 1beeffff-0000-1000-8000-00805f9b34fb [CHG] Device 66:55:44:33:22:11 UUIDs: 4af678c8-0000-1000-8000-00805f9b34fb [CHG] Device 66:55:44:33:22:11 UUIDs: 5a079046-0000-1000-8000-00805f9b34f…...

ANOLIS8安装配置ldap账号登录

sudo dnf install -y openldap-clients nss-pam-ldapd authconfig配置 nslcd​​ sudo vim /etc/nslcd.confuri ldap://your_ldap_server base dc=example,dc=com binddn cn=admin,dc=example,dc=com bindpw your_admin_password ssl no tls_cacertdir /etc/openldap/cacerts​…...

实用指南:小程序非主页面的数据动作关联主页面的数据刷新操作

实用指南:小程序非主页面的数据动作关联主页面的数据刷新操作pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...

【光照】[光照模型]是什么?以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达核心定义 ‌光照模型‌是计算机图形学中用于模拟光线与物体表面相互作用的数学算法,它通过计算光能传播的物理特性,决定场景中每个像素的最终颜色值。其本质是求解‌光能传输方程‌的简化实现。 graph LR A[光源发射光子] --> B[与…...

从知识管理困境到高效协同:Gitee Wiki如何重塑研发团队的知识体系

从知识管理困境到高效协同:Gitee Wiki如何重塑研发团队的知识体系 在数字化转型浪潮中,知识管理已成为企业研发效能提升的关键瓶颈。许多技术团队都曾陷入"知识坟场"的困境——大量文档散落在不同平台,难以检索和维护,最终导致知识资产的价值流失。Gitee Wiki的出…...

cache和主存的映射方式

cache和主存的映射方式 全相联映射 主存块可以放在cache的任意位置 假设某个计算机的主存地址空间大小为256MB,按字节编址。 其数据cache有8个cache行,行长64B 由此可知,我们想要求出主存被分为多少块,就用256MB/64B =228/26=2^22 由于主存有28位,那么它就有22位用来表示主…...

PHP数组去重和集合有什么关系

PHP数组去重与集合:不止是简单的去重你可能会觉得PHP数组去重很简单,array_unique()不就搞定了吗? 但事情远没有那么简单。深入理解PHP数组去重,其实就触及到了集合论的一些核心概念,这能帮你写出更高效、更优雅的代码,避免一些常见的坑。这篇文章,咱们不玩虚的,直接深…...

kkFileView4.4.0 安装与使用

1、码云搜索kkfileview项目,下载项目源码(https://gitee.com/kekingcn/file-online-preview),或者直clone也可以,使用idea打开项目,使用maven加载项目所需要的依赖包2、使用maven进行打包 mvn package,然后 linux环境使用kkFileView.xx.tar.gz, windows使用kkFileView.…...

ubuntu22挂载windows server2019的共享文件夹

本文实现以下目标 1、win 2019 共享一个文件夹 2、ubuntu22访问win2019共享文件夹 ================== 在win2019文件上-右键-属性-共享 选择共享用户和密码。完成,此方法为20世界80年代的经典共享。今年2025年9月,建议寻找更好的共享方法,比如云盘、nas等等。在ubuntu22上…...

PHP数组去重适用于哪些场景

PHP数组去重:不止是array_unique()那么简单你可能觉得PHP数组去重很简单,array_unique()函数一用就完事了。但实际上,这只是冰山一角。 不同的场景下,对数组去重的需求和最佳方案大相径庭,盲目使用array_unique()可能会导致性能问题甚至结果错误。这篇文章,咱们就深入探讨…...

下载视频

1.下载ffmpeg放在电脑上,并设置成环境变量 2.下载yt-dlp,并设置成环境变量 3.下载脚本@echo off chcp 65001 >nul title YouTube Batch Downloader (Best Quality)setlocal enabledelayedexpansion:: 检查 yt-dlp.exe 是否存在 if not exist yt-dlp.exe (echo ERROR: yt-d…...

常用Linux配置

允许上下查看命令历史: vi ~/.bashrc添加 HISTFILESIZE=500 HISTSIZE=500 set -o history退出,输入 source ~/.bashrc 生效本文来自博客园,作者:mariocanfly,转载请注明原文链接:https://www.cnblogs.com/mariocanfly/p/19087376...

m1max可以装windows系统很卡吗

m1max可以装Windows系统很卡吗? 一、M1 Max芯片简介 M1 Max是苹果公司推出的一款高性能集成芯片,主要应用于MacBook Pro等高端产品中。它拥有强大的计算能力、图形处理能力和能效比,专为专业用户设计。M1 Max采用了先进的5纳米工艺制造,集成了高达10核的CPU、32核的GPU以及…...

1 | 移动语义:浅拷贝,深拷贝和引用拷贝,左值和右值

1、浅拷贝和深拷贝(和引用拷贝) ​ 浅拷贝&深拷贝&引用拷贝?浅拷贝就是把表面的数据都拷贝一遍,但是指针指向的地址不会被拷贝。深拷贝就是所有的全部拷贝一遍。引用拷贝就是换个名字,指向的地址还是和原来一样。 2、左值和右值(和右值引用) ​ 左值就是有具体…...

macbook air和windows系统区别

如何选择:MacBook Air与Windows系统的区别 一、引言 在当今这个数字化时代,个人电脑已经成为我们工作、学习和娱乐不可或缺的工具。面对市场上琳琅满目的电脑产品,如何选择一款适合自己的设备成为许多人关心的问题。其中,MacBook Air 和搭载 Windows 系统的电脑是两大主流选…...

Gitee:国产代码托管的领军者,助力企业应对CODING停服挑战

Gitee:国产代码托管的领军者,助力企业应对CODING停服挑战 在数字化转型浪潮中,软件开发效率成为企业核心竞争力的关键。近日,腾讯云旗下CODING DevOps系列产品宣布将于2028年9月30日全面停止服务,这一消息在开发者社区引发广泛关注。作为国产代码托管平台的标杆,Gitee凭借…...

锂电池外围均衡电路仿真

面对当前严峻的能源危机、环境污染等问题,开发研究电动汽车已成为汽车行业的主流方向,而目前高效稳定的动力电池是电动汽车研究领域的核心问题。因此,本项目研究电动汽车电池管理系统(BMS)的关键技术,探究准确估测电池的荷电状态(SOC)以及锂电池的外围均衡电路的设计方…...

Wireshark 学习笔记(一)

Wireshark 学习笔记 (一) 基础 图形界面和数据工具栏 主工具栏包含多个用于数据包嗅探和处理的菜单和快捷方式,包括过滤、排序、摘要、导出和合并。显示过滤栏 主要查询和过滤区域。近期文件 最近调查的文件列表。您可以通过双击调出列出的文件。捕获过滤器和接口 捕获过滤器以…...