0

OpenClaw技能开发实战:从零构建自定义AI助手功能

2026.06.03 | youres | 23次围观

为什么需要自定义OpenClaw技能?

OpenClaw作为一款强大的本地AI智能体框架,其核心魅力在于可扩展的技能(Skill)系统。虽然官方和社区已经提供了90+技能,但在实际工作中,我们经常会遇到需要特定功能的情况。

比如:你需要一个自动抓取竞争对手价格并生成报表的技能;或者需要一个能自动登录公司内部系统执行操作的技能。这些场景下,掌握OpenClaw技能开发能力,就像给你的AI助手装上了"自定义零件"的能力。

OpenClaw技能架构解析

一个标准的OpenClaw技能包含以下核心文件结构:

  • SKILL.md - 技能说明文档,定义触发条件、使用场景、参数说明
  • scripts/ - 可执行脚本目录,存放实际业务逻辑
  • config/ - 配置文件目录,存放API密钥、环境变量等
  • README.md - 用户使用指南

实战案例:开发一个"每日科技新闻摘要"技能

下面我以一个真实案例,演示如何从零开发一个实用技能。这个技能的目标是:每天早上8点,自动搜索指定关键词的科技新闻,生成摘要并保存到指定位置。

第一步:创建技能目录结构

daily-tech-news/
├── SKILL.md          # 技能定义文件
├── scripts/
│   └── fetch_news.js # 核心抓取脚本
├── config/
│   └── sources.json  # 新闻源配置
└── README.md         # 使用说明

第二步:编写SKILL.md(关键!)

SKILL.md是OpenClaw识别和使用技能的核心,必须包含以下信息:

---
name: daily-tech-news
description: |
  每日自动抓取科技新闻并生成摘要。
  触发词:每日科技新闻、科技新闻摘要、tech news digest
metadata:
  openclaw:
    emoji: "📰"
---

# 每日科技新闻摘要技能

## 触发条件
当用户提到以下任一需求时,应激活此技能:
- "帮我获取今日科技新闻"
- "生成科技新闻摘要"
- "每日科技资讯汇总"

## 使用方法
1. 配置感兴趣的新闻源(编辑 config/sources.json)
2. 设置推送时间(通过cron定时任务)
3. 指定输出格式(Markdown/HTML/纯文本)

## 技术实现
本技能通过调用NewsAPI和新浪科技RSS源,结合OpenClaw的在线搜索能力,
实现智能化新闻筛选和摘要生成。

第三步:实现核心功能脚本

scripts/fetch_news.js 的核心逻辑:

const axios = require('axios');
const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

async function fetchTechNews(keywords = ['AI', '大模型', '自动驾驶']) {
    // 1. 使用OpenClaw的online-search技能获取最新新闻
    const searchCommand = 'node "C:\\Program Files\\QClaw\\v0.2.23.532\\resources\\openclaw\\config\\skills\\online-search\\scripts\\prosearch.cjs" --keyword="' + keywords.join(' ') + '" --freshness=24h';
    
    try {
        const { stdout } = await execPromise(searchCommand);
        const searchResult = JSON.parse(stdout);
        
        if (searchResult.success) {
            // 2. 提取前5条重要新闻
            const topNews = searchResult.data.docs.slice(0, 5);
            
            // 3. 生成结构化摘要
            const summary = generateSummary(topNews);
            
            // 4. 保存结果
            require('fs').writeFileSync(
                './output/daily_tech_news.md',
                summary,
                'utf8'
            );
            
            return summary;
        }
    } catch (error) {
        console.error('新闻获取失败:', error);
        return null;
    }
}

function generateSummary(newsItems) {
    let markdown = '# 今日科技新闻摘要\n\n';
    markdown += '> 生成时间: ' + new Date().toLocaleDateString('zh-CN') + '\n\n';
    
    newsItems.forEach((item, index) => {
        markdown += '## ' + (index + 1) + '. ' + item.title + '\n\n';
        markdown += '- **来源**: ' + (item.site || '未知来源') + '\n';
        markdown += '- **日期**: ' + item.date + '\n';
        markdown += '- **摘要**: ' + item.passage.substring(0, 150) + '...\n\n';
        markdown += '🔗 [阅读原文](' + item.url + ')\n\n';
        markdown += '---\n\n';
    });
    
    return markdown;
}

// 导出供OpenClaw调用
module.exports = { fetchTechNews };

关键技巧与避坑指南

1. 路径处理必须用双反斜杠

在Windows环境下开发OpenClaw技能时,最容易出现的问题就是路径处理。错误示例:

// ❌ 错误 - 单反斜杠会被当作转义字符
const scriptPath = 'C:Program FilesQClawscriptsprosearch.cjs';

// ✅ 正确 - 双反斜杠或正斜杠
const scriptPath = 'C:\\Program Files\\QClaw\\scripts\\prosearch.cjs';
// 或者
const scriptPath = 'C:/Program Files/QClaw/scripts/prosearch.cjs';

2. 异步操作必须用Promise包装

OpenClaw的技能脚本通常需要调用外部命令或API,务必使用async/await或Promise确保执行顺序:

// ✅ 推荐写法
async function main() {
    console.log('开始执行技能...');
    const result1 = await step1();
    const result2 = await step2(result1);
    console.log('技能执行完成');
    return result2;
}

// ❌ 避免回调地狱
function main() {
    step1(function(err, result1) {
        if (err) return handleError(err);
        step2(result1, function(err, result2) {
            if (err) return handleError(err);
            console.log(result2);
        });
    });
}

3. 错误处理要完善

技能可能会因为网络、权限、配置错误等原因失败,必须做好错误捕获和用户提示:

async function safeExecute() {
    try {
        const result = await riskyOperation();
        return { success: true, data: result };
    } catch (error) {
        console.error('技能执行失败:', error.message);
        // 提供可操作的错误提示
        if (error.code === 'ENOTFOUND') {
            return { 
                success: false, 
                message: '网络连接失败,请检查网络设置后重试' 
            };
        }
        return { 
            success: false, 
            message: '未知错误: ' + error.message 
        };
    }
}

技能测试与调试

开发完成后,需要通过以下步骤测试技能:

  1. 单元测试:直接运行scripts/下的脚本,验证核心逻辑
  2. 集成测试:将技能复制到OpenClaw的skills目录,重启网关
  3. 触发测试:在对话中说"测试每日科技新闻技能",观察是否被正确触发
  4. 日志检查:查看OpenClaw的日志输出,定位问题
测试阶段 检查要点 常见问题
SKILL.md格式 YAML front matter是否正确 缩进错误、缺少分隔线
脚本可执行性 node脚本能否正常运行 缺少依赖、路径错误
触发识别 OpenClaw能否识别触发词 description描述不清晰
权限问题 能否读写目标文件/目录 Windows UAC拦截

进阶:技能打包与分享

当你的技能开发完成并测试稳定后,可以通过以下方式分享给社区:

  • 打包为.zip:使用标准zip格式,保留目录结构
  • 编写详细README:包含安装步骤、配置说明、常见问题
  • 提交到SkillHub:通过skillhub_install工具发布
  • 版本管理:在SKILL.md中标注版本号,方便用户更新

相关资源与内链

总结与展望

OpenClaw技能开发并不神秘,核心是理解"触发-执行-反馈"的流程。通过本文的实战案例,你应该已经掌握了:

  1. 技能的基本目录结构和文件作用
  2. SKILL.md的编写规范和触发词设计
  3. 实际开发中的避坑技巧(路径、异步、错误处理)
  4. 测试、调试、打包的完整流程

随着OpenClaw生态的不断发展,掌握技能开发能力将让你能够打造真正个性化的AI助手。下一次,当你发现现有技能无法满足需求时,不妨尝试自己动手,构建一个专属的AI功能扩展。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论