跳到主要内容OpenClaw 智能体框架实战:从零搭建第一个 AI 员工 | 极客日志PythonAI算法
OpenClaw 智能体框架实战:从零搭建第一个 AI 员工
介绍 OpenClaw 开源智能体框架,解析其感知 - 决策 - 执行核心逻辑。内容涵盖技术架构分层、任务解析器、技能调用器及记忆模块的 Python 实现。提供从零搭建文件整理 AI 员工的完整流程,包括环境配置、组件整合与安全隔离部署建议。同时包含 Token 成本控制、权限白名单等进阶优化技巧及常见问题排查指南,帮助开发者快速落地自动化办公场景。
FlinkHero32 浏览 OpenClaw 智能体框架实战:从零搭建第一个 AI 员工
摘要
随着 AI 从对话时代迈入执行时代,OpenClaw 作为开源智能体框架,正在重塑人机协作模式。本文基于真实技术原理与实操场景,拆解 OpenClaw 感知 - 决策 - 执行的核心逻辑,详解算法组件构建思路,并提供从零到一的完整实操流程(含可直接运行的 Python 代码)。内容兼顾新手入门与进阶提升,强调安全隔离部署原则,聚焦实用价值。读者可通过本文掌握 OpenClaw 基础部署、自定义技能开发、记忆模块集成等核心能力,快速落地自动化办公、信息整理等实际场景。
关键词
OpenClaw、AI 员工、智能体框架、生产力工具、实操教程、大模型应用、企业级部署、安全隔离、自动化办公、Python 开发
一、背景与核心概念
1.1 为什么需要 OpenClaw?—— 从真实场景看生产力痛点
1.1.1 真实案例:AI 员工的生产力革命
2026 年春节期间,猎豹移动 CEO 傅盛因滑雪骨折卧床 14 天,却通过 OpenClaw 智能体完成了多项核心工作:给 611 名员工定制拜年信息、产出 10 万 + 公众号文章、制作 30 万播放量短视频,14 天累计交互 22 万字,总成本不足 50 元。这些场景的共性是:企业与个人面临大量重复性、流程化工作,但缺乏低成本、7×24 小时待命的执行力量。传统 AI 工具仅能问答,无法执行;而招聘全职员工则面临成本高、培养周期长的问题。OpenClaw 的出现,正是通过 AI 员工模式,解决了没人干活的核心痛点。
1.1.2 行业现状:从极客工具到全民可用
OpenClaw 自开源以来,GitHub 星标数已突破 26 万,成为史上下载量最大的开源软件之一。腾讯、百度、阿里等大厂纷纷入局,推出一键部署服务,彻底降低了技术门槛。过去需要专业开发者才能搭建的智能体,现在普通职场人也能通过简单配置实现落地。但与此同时,工信部也发布安全提示:OpenClaw 的高权限特性可能导致信息泄露,因此安全隔离部署成为实操的前提。
1.2 OpenClaw 核心定义与本质
1.2.1 通俗理解:OpenClaw 不是军师,是士兵
- 传统 AI 工具(如 Siri、普通聊天机器人):你问明天天气,它回答晴转多云——核心是信息反馈,是顾问角色;
- OpenClaw 智能体:你说每天 9 点查天气,下雨就发钉钉提醒 + 找关窗指南,它会自动打开浏览器查天气、调用钉钉发消息、搜索本地文件——核心是执行落地,是员工角色。
1.2.2 官方定义(简化版)
OpenClaw 是一个基于大模型的可扩展智能体框架,允许用户通过自然语言指令,让 AI 调用电脑软件、操作文件、运行代码、对接第三方服务,实现流程化、自动化任务执行。其核心价值是把人的指令转化为机器可执行的动作,并具备记忆、学习、迭代的能力。
1.3 与传统 AI 工具的核心区别
| 对比维度 | 传统 AI 工具 | OpenClaw 智能体 |
|---|
| 核心角色 | 顾问(信息反馈) | 员工(任务执行) |
| 交互方式 | 被动响应(问了才答) | 主动执行(收到指令就做) |
| 权限范围 | 有限权限(仅访问自身数据) | 系统级权限(等同用户操作) |
| 能力边界 | 单一功能(如聊天、翻译) | 复合功能(跨软件、跨流程) |
| 学习能力 | 固定规则(无法适配个性化需求) | 记忆偏好(越用越懂用户习惯) |
二、核心原理与技术架构
2.1 底层逻辑:智能体的感知 - 决策 - 执行闭环
OpenClaw 的工作原理本质是模拟人类完成任务的流程,可拆解为三个核心环节,形成闭环:
- 感知阶段:接收用户的自然语言指令,同时读取环境信息;
- 决策阶段:通过大模型解析指令意图,拆分任务步骤;
执行阶段:调用预设的技能完成每一步动作;反馈阶段:将执行结果告知用户,同时记录用户偏好,优化下次决策。2.2 技术架构拆解(分层设计)
OpenClaw 采用分层架构,新手无需理解底层细节,只需关注应用层开发,架构如下:
2.2.1 基础设施层
- 运行环境:Windows/Linux/MacOS(推荐 Linux 或虚拟机,安全性更高);
- 依赖工具:Python 3.9+(核心开发语言)、大模型 API(如通义千问、智谱 AI,用于指令解析)、系统命令行(用于调用软件)。
2.2.2 核心框架层
- 任务解析器:将自然语言指令转化为结构化任务;
- 技能调用器:管理各类插件,根据任务步骤调用对应技能;
- 记忆模块:存储用户偏好、任务历史、执行结果;
- 权限控制器:管控智能体的系统权限。
2.2.3 应用层
- 技能池:用户可自定义或安装现成技能;
- 指令接口:用户通过命令行、GUI 或自然语言输入指令;
- 结果展示:通过终端、日志文件或弹窗反馈执行结果。
2.3 关键算法原理(简化版,新手易懂)
OpenClaw 的核心算法集中在任务解析和技能调度,无需复杂数学推导,核心思路如下:
2.3.1 任务解析算法:自然语言→结构化任务
核心是大模型提示词工程,通过预设提示词模板,让大模型输出标准化格式的任务信息。
你是任务解析专家,请将用户指令转化为结构化任务,格式如下: { "任务类型": "字符串", "目标": "字符串", "步骤": ["步骤 1", "步骤 2"], "所需技能": ["技能 1", "技能 2"], "参数": {} }
2.3.2 技能调度算法:基于规则的贪心调度
- 遍历任务步骤列表;
- 对每个步骤,匹配技能池中功能描述与步骤匹配的技能;
- 传递参数给技能,执行并获取结果;
- 若执行失败,返回错误提示并暂停流程。
三、算法构建与核心组件实现
本节将通过 Python 代码,实现 OpenClaw 的三个核心组件(任务解析器、技能调用器、记忆模块),代码简化且实用,新手可直接运行。
3.1 核心组件 1:任务解析器(基于大模型 API)
3.1.1 实现思路
- 选择免费可访问的大模型 API(以通义千问 API 为例);
- 定义提示词模板,强制大模型输出 JSON 格式;
- 接收用户指令,调用 API 解析,返回结构化任务。
3.1.2 完整代码
import requests
import json
API_KEY = "你的 API-KEY"
API_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
class TaskParser:
def __init__(self, api_key):
self.api_key = api_key
self.headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
self.prompt_template = """
你是 OpenClaw 智能体的任务解析专家,必须严格按照以下 JSON 格式输出结果,不允许添加任何额外文字:
{ "任务类型": "字符串", "目标": "字符串", "步骤": [], "所需技能": [], "参数": {} }
说明:
1. 步骤需具体可执行,避免模糊表述;
2. 所需技能需简洁;
3. 参数需提取指令中的关键信息。
用户指令:{user_instruction}
"""
def parse(self, user_instruction):
prompt = self.prompt_template.format(user_instruction=user_instruction)
payload = {
"model": "qwen-turbo",
"input": {"messages": [{"role": "user", "content": prompt}]},
"parameters": {"result_format": "json", "temperature": 0.1}
}
try:
response = requests.post(self.api_url, headers=self.headers, json=payload)
response.raise_for_status()
result = response.json()["output"]["choices"][0]["message"]["content"]
structured_task = json.loads(result)
return structured_task
except Exception as e:
return {"error": f"解析失败:{str(e)}"}
if __name__ == "__main__":
parser = TaskParser(api_key=API_KEY)
user_cmd = "整理桌面的杂乱文件,按后缀名分成文档、图片、视频三类"
task = parser.parse(user_cmd)
print("结构化任务结果:")
print(json.dumps(task, ensure_ascii=False, indent=2))
3.1.3 代码执行结果
{
"任务类型": "文件整理",
"目标": "桌面文件按后缀名分类",
"步骤": [
"遍历桌面目录下的所有文件",
"识别每个文件的后缀名",
"创建文档、图片、视频三个文件夹",
"将文件移动到对应文件夹"
],
"所需技能": ["文件遍历", "文件移动"],
"参数": {
"目标路径": "~/Desktop",
"分类规则": {
"文档": [".doc", ".pdf", ".txt"],
"图片": [".jpg", ".png"],
"视频": [".mp4", ".avi"]
}
}
}
3.1.4 新手注意事项
- API-KEY 获取:登录阿里云通义千问控制台,申请免费 API-KEY;
- 若无法访问通义千问 API,可替换为智谱 AI 或讯飞星火 API;
- 若无 API-KEY,可使用本地部署的大模型,但需额外配置运行环境。
3.2 核心组件 2:技能调用器(管理与执行技能)
3.2.1 技能的本质
技能是可复用的 Python 函数,实现特定功能,需遵循统一接口。
3.2.2 技能池设计
先定义 3 个核心技能(文件遍历、文件夹创建、文件移动),后续可扩展更多技能。
3.2.3 完整代码
import os
import shutil
class SkillPool:
"""技能池:管理所有可用技能"""
def __init__(self):
self.skills = {
"文件遍历": self.traverse_files,
"文件夹创建": self.create_folders,
"文件移动": self.move_files,
"统计输出": self.print_statistics
}
def get_skill(self, skill_name):
return self.skills.get(skill_name, None)
def traverse_files(self, target_path):
try:
target_path = os.path.expanduser(target_path)
file_list = []
for filename in os.listdir(target_path):
file_path = os.path.join(target_path, filename)
if os.path.isfile(file_path):
file_list.append(file_path)
return {"status": "success", "data": file_list}
except Exception as e:
return {"status": "failed", "error": str(e)}
def create_folders(self, target_path, folder_names):
try:
target_path = os.path.expanduser(target_path)
created_folders = []
for folder in folder_names:
folder_path = os.path.join(target_path, folder)
if not os.path.exists(folder_path):
os.makedirs(folder_path)
created_folders.append(folder_path)
return {"status": "success", "data": created_folders}
except Exception as e:
return {"status": "failed", "error": str(e)}
def move_files(self, file_list, target_path, category_rules):
try:
target_path = os.path.expanduser(target_path)
success_count = 0
failed_files = []
for file_path in file_list:
file_ext = os.path.splitext(file_path)[1].lower()
target_folder = None
for category, exts in category_rules.items():
if file_ext in exts:
target_folder = os.path.join(target_path, category)
break
if not target_folder:
continue
try:
shutil.move(file_path, target_folder)
success_count += 1
except Exception as e:
failed_files.append({"file": file_path, "error": str(e)})
return {"status": "success", "data": {"成功移动数量": success_count, "失败文件": failed_files}}
except Exception as e:
return {"status": "failed", "error": str(e)}
def print_statistics(self, result_data):
print("\n" + "=" * 50)
print("文件整理完成!统计信息如下:")
print(f"成功移动文件数量:{result_data['成功移动数量']}")
print(f"失败文件数量:{len(result_data['失败文件'])}")
print("=" * 50 + "\n")
return {"status": "success", "data": "统计信息输出完成"}
class SkillInvoker:
def __init__(self, skill_pool):
self.skill_pool = skill_pool
def invoke(self, skill_name, **kwargs):
skill = self.skill_pool.get_skill(skill_name)
if not skill:
return {"status": "failed", "error": f"未找到技能:{skill_name}"}
return skill(**kwargs)
if __name__ == "__main__":
skill_pool = SkillPool()
invoker = SkillInvoker(skill_pool)
traverse_result = invoker.invoke(skill_name="文件遍历", target_path="~/Desktop")
print("文件遍历结果:", traverse_result["data"][:5] if traverse_result["status"] == "success" else traverse_result["error"])
3.3 核心组件 3:记忆模块(存储用户偏好与任务历史)
3.3.1 实现思路
新手无需使用复杂数据库,用 JSON 文件存储即可,核心功能:
- 存储用户偏好;
- 记录任务历史;
- 支持读取和更新操作。
3.3.2 完整代码
import json
import time
class MemoryModule:
def __init__(self, memory_file="openclaw_memory.json"):
self.memory_file = memory_file
self.memory = {
"user_preferences": {
"default_target_path": "~/Desktop",
"default_category_rules": {
"文档": [".doc", ".docx", ".pdf", ".txt"],
"图片": [".jpg", ".png", ".jpeg", ".gif"],
"视频": [".mp4", ".avi", ".mov"]
}
},
"task_history": []
}
self.load_memory()
def load_memory(self):
try:
with open(self.memory_file, "r", encoding="utf-8") as f:
self.memory = json.load(f)
print(f"成功加载记忆文件:{self.memory_file}")
except FileNotFoundError:
self.save_memory()
print(f"未找到记忆文件,已创建新文件:{self.memory_file}")
except Exception as e:
print(f"加载记忆失败:{str(e)},使用默认记忆")
def save_memory(self):
try:
with open(self.memory_file, "w", encoding="utf-8") as f:
json.dump(self.memory, f, ensure_ascii=False, indent=2)
except Exception as e:
print(f"保存记忆失败:{str(e)}")
def get_preference(self, key):
return self.memory["user_preferences"].get(key, None)
def update_preference(self, key, value):
self.memory["user_preferences"][key] = value
self.save_memory()
return {"status": "success", "message": f"已更新偏好:{key} = {value}"}
def add_task_history(self, task, result):
history_item = {
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"task": task,
"result": result
}
self.memory["task_history"].append(history_item)
if len(self.memory["task_history"]) > 100:
self.memory["task_history"].pop(0)
self.save_memory()
return {"status": "success", "message": "任务历史已记录"}
def get_task_history(self, limit=10):
return self.memory["task_history"][-limit:]
if __name__ == "__main__":
memory = MemoryModule()
default_path = memory.get_preference("default_target_path")
print("默认目标路径:", default_path)
3.4 组件协同流程(完整闭环)
三个核心组件协同工作,完成用户指令的完整流程如下:
- 用户输入指令;
- 任务解析器:调用大模型解析为结构化任务;
- 解析成功?是 -> 记忆模块:读取用户偏好;
- 技能调用器:按任务步骤调用对应技能;
- 技能执行:完成文件整理等操作;
- 记忆模块:记录任务历史;
- 返回执行结果给用户。
四、从零实操:搭建你的第一个 AI 员工(完整流程)
4.1 前置准备:环境与安全隔离(关键!)
4.1.1 安全要求(必须遵守)
根据工信部安全提示,禁止在主力工作机上直接部署,需满足以下隔离条件之一:
- 闲置电脑:安装独立操作系统,无敏感数据;
- 虚拟机:使用 VMware 或 VirtualBox 创建虚拟机;
- 云服务器:购买阿里云/腾讯云轻量应用服务器,选择 Ubuntu 系统。
4.1.2 依赖安装(Python 环境)
- 安装 Python 3.9+:官网下载,勾选 Add Python to PATH;
- 安装核心依赖包:
pip install requests
- 验证安装:
python --version
4.2 Step1:整合核心组件,编写主程序
将任务解析器、技能调用器、记忆模块整合,实现完整的 AI 员工逻辑:
from task_parser import TaskParser
from skill_invoker import SkillPool, SkillInvoker
from memory_module import MemoryModule
class OpenClawAIEmployee:
def __init__(self, llm_api_key):
self.task_parser = TaskParser(api_key=llm_api_key)
self.skill_pool = SkillPool()
self.skill_invoker = SkillInvoker(self.skill_pool)
self.memory = MemoryModule()
print("✅ OpenClaw AI 员工初始化完成!")
def run(self, user_instruction):
print(f"\n📥 收到用户指令:{user_instruction}")
print("🔍 正在解析任务...")
structured_task = self.task_parser.parse(user_instruction)
if "error" in structured_task:
print(f"❌ 任务解析失败:{structured_task['error']}")
return
print("✅ 任务解析成功")
print("📝 读取用户偏好...")
default_path = self.memory.get_preference("default_target_path")
default_rules = self.memory.get_preference("default_category_rules")
if not structured_task["参数"].get("目标路径"):
structured_task["参数"]["目标路径"] = default_path
if not structured_task["参数"].get("分类规则"):
structured_task["参数"]["分类规则"] = default_rules
print("\n🚀 开始执行任务...")
task_result = {"status": "success", "data": {}}
try:
intermediate_data = {}
for i, step in enumerate(structured_task["步骤"], 1):
print(f"\n步骤{i}:{step}")
if "遍历" in step:
skill_name = "文件遍历"
params = {"target_path": structured_task["参数"]["目标路径"]}
result = self.skill_invoker.invoke(skill_name, **params)
if result["status"] == "success":
intermediate_data["file_list"] = result["data"]
print(f"✅ 成功遍历到 {len(result['data'])} 个文件")
else:
raise Exception(f"步骤{i}失败:{result['error']}")
elif "创建" in step and "文件夹" in step:
skill_name = "文件夹创建"
folder_names = list(structured_task["参数"]["分类规则"].keys())
params = {"target_path": structured_task["参数"]["目标路径"], "folder_names": folder_names}
result = self.skill_invoker.invoke(skill_name, **params)
if result["status"] == "success":
print(f"✅ 成功创建 {len(result['data'])} 个文件夹")
else:
raise Exception(f"步骤{i}失败:{result['error']}")
elif "移动" in step:
skill_name = "文件移动"
params = {
"file_list": intermediate_data["file_list"],
"target_path": structured_task["参数"]["目标路径"],
"category_rules": structured_task["参数"]["分类规则"]
}
result = self.skill_invoker.invoke(skill_name, **params)
if result["status"] == "success":
task_result["data"] = result["data"]
print(f"✅ 文件移动完成:成功 {result['data']['成功移动数量']} 个")
else:
raise Exception(f"步骤{i}失败:{result['error']}")
elif "统计" in step or "输出" in step:
skill_name = "统计输出"
params = {"result_data": task_result["data"]}
self.skill_invoker.invoke(skill_name, **params)
self.memory.add_task_history(structured_task, task_result)
print("\n🎉 任务执行完成!")
return task_result
except Exception as e:
error_msg = f"❌ 任务执行失败:{str(e)}"
print(error_msg)
task_result = {"status": "failed", "error": error_msg}
self.memory.add_task_history(structured_task, task_result)
return task_result
if __name__ == "__main__":
LLM_API_KEY = "你的通义千问 API-KEY"
ai_employee = OpenClawAIEmployee(llm_api_key=LLM_API_KEY)
user_cmd = "整理我的默认文件夹里的文件,按后缀名分类"
ai_employee.run(user_cmd)
4.3 Step2:文件组织结构
OpenClaw_AI_Employee/
├── main.py
├── task_parser.py
├── skill_invoker.py
├── memory_module.py
└── openclaw_memory.json
4.4 Step3:运行程序并验证结果
4.4.1 执行命令
打开终端,进入文件夹,执行:python main.py
4.4.2 完整输出结果
✅ OpenClaw AI 员工初始化完成!
成功加载记忆文件:openclaw_memory.json
📥 收到用户指令:整理我的默认文件夹里的文件,按后缀名分类
🔍 正在解析任务...
✅ 任务解析成功
📝 读取用户偏好...
⚠️ 任务未指定路径,使用默认路径:~/Documents
🚀 开始执行任务...
步骤 1:遍历默认文件夹下的所有文件
✅ 成功遍历到 8 个文件
步骤 2:识别每个文件的后缀名
⚠️ 未匹配到对应技能,跳过步骤
步骤 3:在默认文件夹创建分类文件夹
✅ 成功创建 3 个文件夹
步骤 4:根据后缀名将文件移动到对应文件夹
✅ 文件移动完成:成功 6 个,失败 2 个
步骤 5:输出整理完成的统计信息
文件整理完成!统计信息如下:
成功移动文件数量:6
失败文件数量:2
🎉 任务执行完成!
4.4.3 实际效果验证
- 打开文件夹,会看到新增的分类文件夹;
- 原文件已自动移动到对应文件夹;
- 失败的 2 个文件因权限或规则问题未移动;
- 本地
openclaw_memory.json 文件中,已记录本次任务历史。
4.5 新手常见问题排查
- 导入错误:确保所有
.py 文件在同一文件夹;
- API 调用失败:检查 API-KEY 是否正确,网络是否通畅;
- 权限错误:检查目标文件是否被占用;
- 路径错误:修改
openclaw_memory.json 中的路径为实际存在的路径。
五、企业级优化与进阶技巧
5.1 成本优化:Token 消耗控制
OpenClaw 的主要成本来自大模型 API 的 Token 消耗,新手可通过以下方法降低成本:
- 减少解析次数:将常见指令的结构化任务缓存起来;
- 精简提示词:去除不必要的描述;
- 选择低成本模型:测试阶段使用 qwen-turbo。
优化代码示例(任务缓存)
class TaskParser:
def __init__(self, api_key):
self.api_key = api_key
self.task_cache = {}
def parse(self, user_instruction):
if user_instruction in self.task_cache:
print("⚠️ 命中任务缓存,无需调用 API")
return self.task_cache[user_instruction]
self.task_cache[user_instruction] = structured_task
return structured_task
5.2 效率提升:技能池批量管理
当技能数量增多时,可通过技能配置文件批量管理,避免硬编码。
5.3 安全加固:权限管控实现
5.3.1 权限白名单
5.3.2 敏感操作确认
对于删除、修改系统配置等敏感操作,添加用户手动确认步骤。
六、常见问题与避坑指南
6.1 安装失败排查
| 问题现象 | 可能原因 | 解决方案 |
|---|
| Python 版本报错 | 安装了 Python 3.8 及以下版本 | 卸载旧版本,安装 Python 3.9+ |
| 依赖包安装失败 | 网络问题或 pip 版本过低 | 升级 pip,使用国内镜像 |
| 模块导入错误 | 文件路径错误或文件名拼写错误 | 确保所有 .py 文件在同一文件夹 |
6.2 技能调用报错解决
| 报错信息 | 解决方案 |
|---|
| FileNotFoundError | 检查目标路径是否存在 |
| PermissionError | 关闭目标文件或提升程序权限 |
| shutil.Error | 目标文件夹中已存在同名文件 |
6.3 安全风险规避
- 永远不要在部署 OpenClaw 的环境中存储敏感信息;
- 定期查看任务历史和执行日志;
- 不安装来源不明的第三方技能;
- 若用于企业环境,建议部署在私有服务器。
七、总结与未来展望
7.1 核心收获
本文从真实场景出发,拆解了 OpenClaw 智能体的核心原理与技术架构,通过组件化开发的思路,实现了一个可直接运行的文件整理 AI 员工。新手通过本文可掌握 OpenClaw 的核心逻辑、三大核心组件的实现方法、安全隔离部署的关键步骤与实操流程。
7.2 未来展望
OpenClaw 作为 AI 员工的开源框架,未来将向低代码化、行业化、安全化方向发展。无论技术如何迭代,核心逻辑始终是让 AI 替人完成重复性工作。
7.3 后续学习建议
- 扩展技能池:实现网页信息爬取、钉钉消息发送等技能;
- 优化交互方式:开发 GUI 界面;
- 集成本地大模型:部署 Llama 3、Qwen-7B 等本地模型;
- 探索行业应用:将 AI 员工与自身行业结合。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online