☰
OpenClaw Skill 实战指南:用 SKILL.md 让 AI Agent 学会新技能并接入 TaoToken
2026/9/25 9:58:54 网站建设 项目流程

1. 为什么你的 AI Agent 总是“学不会”新技能

如果你用 OpenClaw 跑过稍微复杂一点的任务,大概率遇到过这种场景:让 Agent 帮忙把一篇 Markdown 发到 CSDN,它要么漏掉图片上传,要么把标签填错,要么干脆在编辑器里迷路。你手动纠正一遍,下次换个标题,它又忘了。问题不在于模型不够聪明,而在于你从来没有给过它一份“上岗手册”。

OpenClaw Skill 就是这份手册。它不是插件框架,不是代码库,而是一份结构化的指令包,告诉 AI Agent 三件事:什么时候该用这个技能、具体怎么做、需要调用哪些脚本和资源。SKILL.md 是唯一必需的文件,其余目录按需添加。这意味着一个 Skill 可以简单到只有一个 Markdown 文件,只要描述清楚,Agent 就能按图索骥。

这篇文章聚焦 OpenClaw Skill 从零落地。我会用 Playwright 场景演示一个真实可跑的 Skill:让 AI Agent 学会“把 Markdown 发布到 CSDN 草稿箱”。过程中会给出可复制的 SKILL.md 配置片段、TaoToken 统一 Key/API 通道的接入步骤,以及运行验证动作。适合正在用 OpenClaw 做自动化、想让 Agent 稳定执行固定流程的开发者。读完之后,你可以直接复现一个能跑通的 Skill,并确认它真的生效。

2. TaoToken 前置:给 Agent 一条稳定的模型通道

在写 SKILL.md 之前,先把模型通道准备好。OpenClaw 的 Agent 在触发 Skill 后,需要调用大模型来理解指令、生成参数、判断执行结果。如果每次都要在代码里硬编码不同厂商的 Key,维护成本会很高。TaoToken 提供的是统一 Key 和统一 API 通道,你只需要一个 Key,就能在 OpenClaw 里切换不同模型。

官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数,配置时直接写这个。

你需要先拿到 API Key。进入控制台创建 Key,路径是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。创建完成后复制 Key,后面在 OpenClaw 的模型配置里会用到。如果你还没决定用哪个模型,可以先在模型对话页面测试一下 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,确认通道可用再接入。

注意:API Key 只显示一次,创建后立即保存到本地环境变量或密钥管理工具里,不要直接写进 SKILL.md 或提交到 Git。

对于长期跑编码和 Agent 任务的场景,Coding Plan 会更划算,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它适合需要频繁调用模型、跑自动化流程的开发者。如果你只是偶尔验证一下 Skill,用按量计费的 Key 就够了。

3. 可复制配置:SKILL.md 骨架与 Playwright 脚本

现在进入核心部分。一个 OpenClaw Skill 的目录结构极简:

csdn-blog/ ├── SKILL.md # 唯一必需:元数据 + 指令 └── scripts/ └── csdn_publish.py # Playwright 自动化脚本

只有 SKILL.md 是必需的,scripts 目录按需添加。下面先写 SKILL.md。

3.1 SKILL.md 的触发器与指令体

SKILL.md 由两部分组成:YAML front matter 里的元数据,以及正文指令。元数据中的 description 是触发器,Agent 每次收到请求时会扫描所有 Skill 的 description,语义匹配成功才激活对应 Skill。正文只有触发后才会加载到上下文,不会长期占用 Token。

--- name: csdn-blog description: "Publish blog drafts to CSDN via browser automation (Playwright). Use when: user wants to post/publish/write a blog to CSDN, create CSDN draft. NOT for: reading CSDN articles or non-CSDN platforms." --- # CSDN Blog Publisher ## First-Time Setup python {baseDir}/scripts/csdn_publish.py --login ## Usage python {baseDir}/scripts/csdn_publish.py -t "标题" -f article.md python {baseDir}/scripts/csdn_publish.py -t "标题" -c "内容" --tags Python AI ## Image Handling 本地图片自动上传到 CSDN CDN,远程图片链接保持不变。 ## Troubleshooting - 登录会话过期:重新执行 --login 缓存账号 - 内容写入失败:CSDN 前端 UI 更新,需微调选择器

注意{baseDir}占位符,Agent 执行时会自动替换为 Skill 的实际路径,不需要硬编码。description 里写清楚了触发条件和使用边界,这是 Skill 能否被正确调用的关键。写得太模糊会被忽略,写得太窄会错过相关场景。

3.2 Playwright 脚本的核心逻辑

脚本负责处理浏览器自动化这类脆弱操作。CSDN 会检测无头浏览器,所以必须用有头模式,并且用持久化上下文保存 Cookie,避免每次重新登录。

import argparse import asyncio from playwright.async_api import async_playwright USER_DATA_DIR = "./csdn_user_data" async def publish(title, content=None, file_path=None, tags=None): async with async_playwright() as p: ctx = await p.chromium.launch_persistent_context( USER_DATA_DIR, headless=False, # CSDN 屏蔽无头浏览器,必须可视化 viewport={"width": 1280, "height": 720}, locale="zh-CN", ) page = await ctx.new_page() await page.goto("https://mp.csdn.net/mp_blog/creation/editor") # 检测登录状态,首次需要手动扫码 if await page.locator("iframe[src*='login']").count() > 0: print("请扫码登录...") await page.wait_for_selector("#txtTitle", timeout=120000) # 写入标题 await page.fill("#txtTitle", title) # 通过 CKEditor API 注入内容,绕过 Markdown/富文本切换 if file_path: with open(file_path, "r", encoding="utf-8") as f: content = f.read() await page.evaluate( "(c) => CKEDITOR.instances.editor.setData(c)", content ) # 设置原创声明 await page.click("input.el_mcm-radio__original[value='original']") # 标签输入:自定义组件,必须用键盘模拟 if tags: tag_area = page.locator(".el-select__input").first await tag_area.click() for tag in tags: await page.keyboard.type(tag, delay=50) await page.keyboard.press("Enter") # 保存草稿 await page.click("button:has-text('保存草稿')") print("草稿已保存") await ctx.close() if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--login", action="store_true") parser.add_argument("-t", "--title") parser.add_argument("-f", "--file") parser.add_argument("-c", "--content") parser.add_argument("--tags", nargs="*") args = parser.parse_args() if args.login: asyncio.run(publish("登录测试")) else: asyncio.run(publish(args.title, args.content, args.file, args.tags))

脚本里几个关键点:launch_persistent_context把 Cookie 保存在本地目录,下次启动自动复用;CKEDITOR.instances.editor.setData直接注入 HTML,避免富文本切换的不稳定;标签输入框是只读的自定义组件,fill()会失败,必须用keyboard.type()模拟键盘输入。

3.3 在 OpenClaw 里接入 TaoToken

OpenClaw 的模型配置支持自定义 API 地址。把 TaoToken 的 API 入口填进去,Key 用你在控制台创建的那个。

# openclaw config 片段 model: provider: openai-compatible base_url: https://taotoken.net/api api_key: ${TAOTOKEN_API_KEY} model: claude-sonnet-4-20250514

环境变量TAOTOKEN_API_KEY在启动 OpenClaw 前 export 好。这样 Agent 在触发 Skill 后,所有模型调用都走 TaoToken 的统一通道,换模型只需要改model字段,不用动 Skill 本身。

4. 验证请求:确认 Skill 真的生效

配置写完了,怎么确认 Skill 被正确触发、脚本真的跑通?分三步验证。

第一步,检查 Skill 是否被 OpenClaw 识别。在 OpenClaw 的 Skill 列表里应该能看到csdn-blog,description 显示正常。如果没出现,检查 SKILL.md 的 front matter 格式,YAML 的---必须顶格,name和description不能缺。

第二步,用自然语言触发。在对话里输入:“帮我把这篇 Markdown 发到 CSDN 草稿箱,标题是《测试文章》,标签 Python AI。” Agent 应该自动匹配到csdn-blog这个 Skill,加载 SKILL.md 正文,然后调用脚本。你可以在 OpenClaw 的日志里看到 Skill 激活记录和脚本执行命令。

第三步,检查 CSDN 草稿箱。脚本跑完后,打开 CSDN 创作中心,草稿箱里应该出现一篇标题为《测试文章》的草稿,标签已填好,原创声明已勾选。如果图片是本地路径,检查是否已替换为 CSDN CDN 的远程 URL。

验证模型通道是否正常,可以在模型对话页面发一条测试消息 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,确认返回正常。如果 Agent 在触发 Skill 后报模型调用错误,优先检查 API Key 和 base_url 是否写对。

5. 本篇常见错排查

Skill 没有被触发。最常见的原因是 description 写得太模糊。Agent 做的是语义匹配,如果 description 里只有“发布博客”而没有“CSDN”“草稿”这些关键词,匹配成功率会下降。把触发场景写具体,同时用NOT for排除不相关场景。

脚本报CKEDITOR is not defined。说明页面还没加载完,或者 CSDN 前端改了编辑器实现。在page.goto之后加await page.wait_for_selector("#txtTitle"),确保编辑器初始化完成再注入内容。如果 CSDN 换了编辑器,需要更新选择器和注入方式。

标签输入失败。标签框是 Element UI 的自定义组件,fill()会因为只读状态报错。必须用click()展开,再用keyboard.type()逐字输入,最后Enter确认。输入速度太快可能触发不了联想,delay=50是实测比较稳的值。

登录会话过期。Cookie 存在USER_DATA_DIR里,如果长时间不用会失效。重新执行python csdn_publish.py --login,手动扫码一次即可。不要用无头模式,CSDN 会检测并拒绝。

模型调用 401。检查 TaoToken 的 API Key 是否复制完整,base_url 是否写成https://taotoken.net/api(不带 UTM)。如果 Key 没问题,去控制台确认额度是否充足。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有各语言的调用示例。

图片上传后链接失效。本地图片上传到 CSDN CDN 需要时间,脚本里应该等上传完成再替换 URL。如果图片较大,加一个wait_for_response监听上传接口。远程图片链接不要动,保持原样。

6. 把 Skill 用起来:从验证到长期运行

Skill 跑通之后,你可以把它当成一个可复用的能力单元。每次写新文章,只需要在 OpenClaw 里说一句“发到 CSDN”,Agent 就会自动加载 SKILL.md、调用 Playwright 脚本、走 TaoToken 通道完成模型调用。整个过程不需要你手动打开浏览器、复制粘贴、填标签。

如果你要长期跑编码和 Agent 任务,建议把模型通道切到 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,成本更可控。API Key 管理在控制台 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,可以按项目创建不同的 Key,方便追踪调用量。

写 Skill 的本质,是把业务规则、操作流程、专属约束压缩成 AI Agent 能精准识别、高效执行的标准化指令。规则越精简,运行越稳定。SKILL.md 不需要写“为什么”,只需要写“做什么”和“怎么做”。脚本处理脆弱操作,自然语言处理灵活判断。桥窄加栏杆,路宽少限制。

最后留一个实用技巧:每次 CSDN 前端 UI 更新后,选择器可能失效。把选择器集中写在脚本顶部,方便统一替换。SKILL.md 的 Troubleshooting 里记下常见问题和修复方式,下次 Agent 遇到报错时,可以自己参考排查。这样你的 Skill 会越用越稳,而不是越用越脆。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询