乐于分享
好东西不私藏

实战:从零创建你的第一个 OpenClaw 技能(附完整代码)

实战:从零创建你的第一个 OpenClaw 技能(附完整代码)

上期我们聊了什么是技能,今天直接动手——手把手教你创建一个"天气查询"技能,让你的 AI 助手学会调用和风天气 API。

一、技能的本质

OpenClaw 的技能其实很简单,就是一个文件夹,里面包含:

my-skill/

├── SKILL.md          ← 技能说明书(告诉 AI 什么时候用、怎么用)

└── (可选)脚本文件    ← Python/Shell 等实际执行代码

**核心逻辑:**

  1. 用户说某句话 → AI 判断该用哪个技能
  2. AI 读取 SKILL.md → 知道该执行什么命令
  3. 执行命令 → 返回结果给用户

二、实战:创建"天气查询"技能

步骤 1:创建技能目录

在你的 OpenClaw 工作区创建文件夹:

```bash

mkdir-p~/.openclaw/workspace/skills/weather-query

步骤 2:编写 SKILL.md

这是最重要的文件,告诉 AI 这个技能的一切。

```markdown

weather-query

描述

通过和风天气 API 查询指定城市的实时天气和温度。

使用场景

当用户询问以下问题时使用:
  • "北京今天天气怎么样?"
  • "查询郑州的天气"
  • "上海明天会下雨吗?"

使用方法

  1. 从用户问题中提取城市名称
  2. 调用脚本:`python weather.py 城市名`
  3. 将脚本输出返回给用户

示例

输入:"查询杭州的天气"
执行:`python weather.py 杭州`
输出:"杭州:晴,26°C,湿度 65%"

注意事项

  • 需要配置和风天气 API 密钥
  • 免费版每天 1000 次调用额度

步骤 3:编写 Python 脚本

创建`weather.py`文件:

```python

import sys
import requests
import json

和风天气 API 配置

API_KEY ="你的_API_密钥"
BASE_URL ="https://devapi.qweather.com/v7/weather/now"

城市名转城市代码(简化版,实际需要完整对照表)

CITY_CODES = {
"北京":"101010100",
"上海":"101020100",
"广州":"101280101",
"深圳":"101280601",
"杭州":"101210101",
"郑州":"101180101",
}
defget_weather(city_name):
获取城市代码
city_code = CITY_CODES.get(city_name)
if not city_code:
return f"暂不支持查询{city_name}的天气"
调用 API
url =f"{BASE_URL}?location={city_code}&key={API_KEY}"
try:
response = requests.get(url,timeout=10)
data = response.json()
if data.get("code") =="200":
now = data["now"]
temp = now["temp"]
text = now["text"]
humidity = now["humidity"]
wind = now["windDir"]
return f"{city_name}:{text},{temp}°C,湿度{humidity}%,{wind}"
else:
returnf"查询失败:{data.get('code')}"
except Exception as e:
return f"查询出错:{str(e)}"
if__name__=="__main__":
if len(sys.argv) <2:
print("用法:python weather.py 城市名")
sys.exit(1)
city = sys.argv[1]
result = get_weather(city)
print(result)

步骤 4:测试脚本

先在命令行测试是否能正常运行:

```bash

pythonweather.py郑州

预期输出:

郑州:晴,15°C,湿度 45%,东南风

步骤 5:告诉 AI 这个技能

在 OpenClaw 的 USER.md 或 MEMORY.md 中添加:

```markdown

自定义技能

-**weather-query**:位于`skills/weather-query/`
-功能:查询指定城市天气
-触发词:"查询...天气"、"...天气怎么样"
-执行命令:`python weather.py 城市名`

三、进阶:让技能更智能

改进 1:自动获取城市代码

上面的脚本只支持几个固定城市,实际可以用和风天气的"城市搜索 API":

```python

def get_city_code(city_name):
"""通过城市名获取城市代码"""
search_url =f"https://geoapi.qweather.com/v2/city/lookup"
params = {"location": city_name,"key": API_KEY}
response = requests.get(search_url,params=params)
data = response.json()
if data.get("code") =="200"anddata.get("location"):
return data["location"][0]["id"]
return None

改进 2:添加错误处理

```python

import os
从环境变量读取 API 密钥(更安全)
API_KEY = os.environ.get("QWEATHER_API_KEY")
ifnotAPI_KEY:
print("错误:请设置 QWEATHER_API_KEY 环境变量")
sys.exit(1)

改进 3:添加缓存

```python

import time
简单的内存缓存
cache = {}
CACHE_TIME =600  #10分钟
def get_weather_cached(city_name):
now = time.time()
ifcity_nameincache:
result, timestamp = cache[city_name]
ifnow - timestamp < CACHE_TIME:
returnresult +" (缓存)"
result = get_weather(city_name)
cache[city_name] = (result, now)
return result

四、常见问题

**Q1:API 密钥从哪里获取?**

A:访问 https://dev.qweather.com/ 注册账号,免费版每天 1000 次调用足够个人使用。

**Q2:为什么 AI 不执行我的技能?**

A:检查以下几点:

  • SKILL.md 描述是否清晰?
  • 使用场景是否匹配用户的提问?
  • 脚本路径是否正确?
  • 脚本是否有执行权限?

**Q3:可以调用其他语言的脚本吗?**

A:可以!SKILL.md 里写清楚执行命令即可:

  • Node.js: node script.js
  • Bash: bash script.sh
  • Go: ./my-program

**Q4:如何让技能在 OpenClaw 启动时自动加载?**

A:把技能文件夹放在`~/.openclaw/workspace/skills/`目录下,OpenClaw 会自动发现。

五、技能发布(可选)

如果你写了一个好用的技能,可以:

  1. **分享给朋友**:直接打包文件夹发送
  2. **提交到 ClawHub**:访问 clawhub.com 了解发布流程
  3. **开源到 GitHub**:让更多人使用和贡献

总结

创建技能只需要 3 步:

  1. **创建文件夹** → `mkdir skills/weather-query`
  2. **写 SKILL.md** → 告诉 AI 什么时候用、怎么用
  3. **写执行脚本** → Python/Shell 实现具体功能

**今天就开始:**

  • 试着创建一个查询快递、翻译文本、或者提醒日程的技能
  • 从简单开始,逐步完善
💡**下期预告:**我们将学习如何让技能"记住"事情——使用 OpenClaw 的 ontology 知识图谱技能管理个人知识库。

**👇 互动时间**

你想创建一个什么技能?在评论区分享你的想法,我可以帮你设计 SKILL.md!

*本文使用 OpenClaw + skill-creator 技能辅助创作*

**关注「私享斋」,获取更多科技技能实操干货 👆**

**觉得有用?点个「在看」让更多人看到 👀**