一个“通用模板”和一个“实战案例”(以查询天气为例)。

你可以直接复制下面的结构,修改成你想要的功能。

📂 第一步:建立技能目录结构

首先,在 OpenClaw 的 skills 目录下创建一个新文件夹。

  • 默认路径~/.openclaw/skills/
  • 你的技能文件夹名:建议用英文,比如 my-weather-skill

在这个文件夹里,你需要创建两个文件:

  1. SKILL.md:这是技能的“身份证”和“说明书”,告诉 AI 这个技能是干嘛的。
  2. main.py:这是技能的“大脑”,写具体的 Python 代码。

目录结构长这样:

~/.openclaw/skills/my-weather-skill/
├── SKILL.md
└── main.py

📝 第二步:编写 SKILL.md (说明书)

这个文件非常重要,AI 全靠它来决定什么时候调用你的代码。

通用模板:

---
name: my-unique-skill-name  # 技能唯一标识,用英文
description: 一句话描述技能功能,例如:查询指定城市的实时天气
version: 1.0.0
metadata:
  openclaw:
    requires:
      bins: ["python3"]  # 依赖 python3 环境
---

# 技能名称 (中文)

## 功能描述
详细描述这个技能能做什么。
例如:当用户询问某个城市的天气、温度、是否下雨时,使用此技能。

## 使用场景
- "北京今天天气怎么样?"
- "上海明天会下雨吗?"
- "帮我查查深圳的气温"

## 参数说明
- city (str): 城市名称,例如 "北京", "Shanghai"

🐍 第三步:编写 main.py (执行逻辑)

这是你之前问的 Python 代码部分。记住核心原则:接收参数 -> 处理逻辑 -> return 结果

实战案例:天气查询脚本
(这个例子演示了如何接收参数,并返回结果给 OpenClaw)

import sys
import json

def get_weather(city: str) -> str:
    """
    模拟查询天气的逻辑
    实际使用时,你可以在这里替换成 requests 调用真实的天气 API
    """
    # 1. 这里可以写 print 用于你在控制台调试
    print(f"正在查询城市: {city} 的天气...")
    
    # 模拟一些逻辑
    if "北京" in city or "Beijing" in city:
        weather_info = "北京:晴,25°C,微风,空气质量优。"
    elif "深圳" in city or "Shenzhen" in city:
        weather_info = "深圳:多云,28°C,湿度 80%。"
    else:
        weather_info = f"{city}:数据暂未收录,请尝试查询北京或深圳。"
        
    # 2. 必须使用 return 返回字符串,OpenClaw 才能把结果读出来
    return weather_info

# --- OpenClaw 调用入口 ---
# 当 OpenClaw 调用此脚本时,会通过命令行参数传递 JSON 格式的参数
if __name__ == "__main__":
    # 获取命令行参数
    # OpenClaw 通常会以 JSON 字符串的形式传入参数,例如 '{"city": "北京"}'
    if len(sys.argv) > 1:
        input_json = sys.argv[1]
        try:
            args = json.loads(input_json)
            city = args.get("city", "未知城市")
            
            # 调用你的核心函数
            result = get_weather(city)
            
            # 输出结果 (OpenClaw 会捕获标准输出或特定的返回码)
            # 在简单的脚本模式下,直接 print 结果通常也能被捕获,
            # 但最稳妥的是 print 一个 JSON 结果或者直接 print 文本
            print(result)
            
        except Exception as e:
            print(f"参数解析错误: {e}")
    else:
        print("未接收到参数,请在 OpenClaw 中通过对话调用。")

🚀 第四步:如何让 OpenClaw 识别

  1. 保存文件:确保 SKILL.mdmain.py 已保存。
  2. 重载技能
    打开终端,运行以下命令让 OpenClaw 重新扫描技能目录:

    openclaw skills reload

    或者重启你的 OpenClaw 会话。

  3. 测试
    在对话框里输入:“帮我查查北京的天气”。

💡 避坑指南

  1. return vs print

    • 在上面的脚本模式中,因为是通过命令行参数调用的,所以通常使用 print() 输出最终结果即可(OpenClaw 会捕获脚本的标准输出)。
    • 但如果你在函数内部做调试,可以用 print("调试信息...", file=sys.stderr) 输出到错误流,这样不会干扰返回给 AI 的结果。
  2. 依赖库

    • 如果你在 main.py 里用了 requests 等第三方库,记得先在终端运行 pip install requests 安装好。
  3. 路径问题

    • 脚本里的文件路径最好使用绝对路径,或者在脚本开头动态获取脚本所在目录,防止运行出错。

现在,你可以把 get_weather 函数里的逻辑换成任何你想做的功能(比如操作 Excel、调用 API、处理文件),只要保持这个外壳不变即可!