从零到一:手把手教你开发OpenClaw高级技能
从零到一:手把手教你开发OpenClaw高级技能
!OpenClaw技能开发你是不是已经用上了OpenClaw,但总觉得内置技能不够用? 看到别人家的AI助理能自动处理邮件、监控服务器、生成周报,而你的龙虾只会基础对话?
别急!今天我就带你从零开始,开发一个真正实用的OpenClaw高级技能——「智能周报生成器」。学完这篇教程,你不仅能掌握技能开发全流程,还能让龙虾成为你的专属生产力工具!
🎯 我们要开发什么?
「智能周报生成器」技能功能:- 自动收集Git提交记录
- 分析Jira/Trello任务完成情况
- 提取Slack/企业微信工作讨论
- 智能生成结构化周报
- 自动发送到指定邮箱或聊天工具
🛠️ 开发环境准备
1. 创建技能目录结构
bash
进入OpenClaw技能目录
cd ~/.openclaw/extensions
创建技能文件夹
mkdir my-weekly-report-skill
cd my-weekly-report-skill
创建标准目录结构
mkdir -p scripts references
2. 编写SKILL.md(技能说明书)
markdown
智能周报生成器技能
描述
自动收集工作数据,生成结构化周报并发送到指定渠道。
适用场景
- 每周五下午自动生成周报
- 手动触发生成指定时间段的报告
- 集成到工作流中作为自动化环节
前置条件
- Git仓库访问权限
- Jira/Trello API密钥(可选)
- 邮件/Slack/企业微信发送权限
使用示例
帮我生成这周的周报
生成上周的工作报告
设置每周五17:00自动生成周报
3. 创建主脚本文件
python
#!/usr/bin/env python3
scripts/weekly_report.py
"""
智能周报生成器 - 主逻辑
"""
import os
import sys
import json
import datetime
from typing import Dict, List, Optional
import subprocess
import requests
class WeeklyReportGenerator:
def init(self, config_path: str = None):
"""初始化周报生成器"""
self.config = self.loadconfig(config_path)
self.week_start = None
self.week_end = None
def loadconfig(self, config_path: str) -> Dict:
"""加载配置文件"""
default_config = {
"git_repos": [],
"jira_url": "",
"jira_token": "",
"slack_webhook": "",
"email_recipients": [],
"output_format": "markdown"
}
if configpath and os.path.exists(configpath):
with open(config_path, 'r', encoding='utf-8') as f:
return {default_config, json.load(f)}
return default_config
def setdaterange(self, startdate: str = None, enddate: str = None):
"""设置时间范围"""
if not start_date:
# 默认本周
today = datetime.date.today()
self.week_start = today - datetime.timedelta(days=today.weekday())
self.weekend = self.weekstart + datetime.timedelta(days=6)
else:
self.weekstart = datetime.datetime.strptime(startdate, "%Y-%m-%d").date()
self.weekend = datetime.datetime.strptime(enddate, "%Y-%m-%d").date()
def collectgitcommits(self) -> List[Dict]:
"""收集Git提交记录"""
commits = []
for repopath in self.config.get("gitrepos", []):
if not os.path.exists(repo_path):
print(f"⚠️ 仓库不存在: {repo_path}")
continue
try:
# 切换到仓库目录
original_cwd = os.getcwd()
os.chdir(repo_path)
# 获取本周提交
cmd = [
"git", "log",
"--since", self.week_start.isoformat(),
"--until", (self.week_end + datetime.timedelta(days=1)).isoformat(),
"--pretty=format:%H|%an|%ad|%s",
"--date=short"
]
result = subprocess.run(cmd, capture_output=True, text=True)
for line in result.stdout.strip().split('\n'):
if line:
hash_val, author, date, message = line.split('|', 3)
commits.append({
"repo": os.path.basename(repo_path),
"hash": hash_val[:8],
"author": author,
"date": date,
"message": message
})
os.chdir(original_cwd)
except Exception as e:
print(f"❌ 收集Git提交失败 {repo_path}: {e}")
return commits
def collectjiratasks(self) -> List[Dict]:
"""收集Jira任务(需要API配置)"""
tasks = []
jiraurl = self.config.get("jiraurl")
jiratoken = self.config.get("jiratoken")
if not jiraurl or not jiratoken:
return tasks
try:
# Jira API调用示例
headers = {
"Authorization": f"Bearer {jira_token}",
"Content-Type": "application/json"
}
jql = f'updated >= "{self.weekstart}" AND updated <= "{self.weekend}" AND assignee = currentUser()'
params = {
"jql": jql,
"maxResults": 50,
"fields": "key,summary,status,assignee,updated"
}
response = requests.get(
f"{jira_url}/rest/api/3/search",
headers=headers,
params=params,
timeout=10
)
if response.status_code == 200:
issues = response.json().get("issues", [])
for issue in issues:
tasks.append({
"key": issue["key"],
"summary": issue["fields"]["summary"],
"status": issue["fields"]["status"]["name"],
"updated": issue["fields"]["updated"][:10]
})
except Exception as e:
print(f"❌ 收集Jira任务失败: {e}")
return tasks
def generatereport(self, gitcommits: List, jira_tasks: List) -> str:
"""生成周报内容"""
# 统计信息
totalcommits = len(gitcommits)
completedtasks = len([t for t in jiratasks if t["status"] in ["Done", "Closed"]])
inprogresstasks = len([t for t in jira_tasks if t["status"] in ["In Progress", "开发中"]])
# 按仓库分组提交
repo_stats = {}
for commit in git_commits:
repo = commit["repo"]
repo_stats.setdefault(repo, {"count": 0, "commits": []})
repo_stats[repo]["count"] += 1
repo_stats[repo]["commits"].append(commit)
# 生成Markdown报告
report = f"""# 工作周报 ({self.weekstart} ~ {self.weekend})
📊 本周概览
- 总提交次数: {total_commits} 次
- 完成任务: {completed_tasks} 个
- 进行中任务: {inprogresstasks} 个
- 报告生成时间: {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
💻 代码提交情况
"""
for repo, stats in repo_stats.items():
report += f"\n### {repo} ({stats['count']}次提交)\n"
for commit in stats["commits"][:5]: # 显示最近5条
report += f"- {commit['hash']} {commit['message']} - {commit['author']} ({commit['date']})\n"
if stats["count"] > 5:
report += f"- ... 还有 {stats['count'] - 5} 次提交\n"
if jira_tasks:
report += "\n## 📋 任务完成情况\n"
for task in jira_tasks:
status_emoji = "✅" if task["status"] in ["Done", "Closed"] else "🔄"
report += f"- {status_emoji} {task['key']} {task['summary']} - {task['status']} (更新于{task['updated']})\n"
# 本周总结与下周计划
report += f"""
🎯 本周工作总结
- 主要成果: 完成了核心功能开发,代码质量保持稳定
- 遇到的问题: {"" if total_commits > 0 else "本周提交较少,需关注进度"}
- 解决方案: 通过代码审查和自动化测试保障质量
📅 下周工作计划
- 继续推进剩余功能开发
- 优化性能瓶颈
- 准备下一阶段的技术方案
---
本报告由 OpenClaw 智能周报生成器自动生成
"""
return report
def sendreport(self, reportcontent: str, channel: str = "console"):
"""发送周报到指定渠道"""
if channel == "console":
print("\n" + "="*60)
print("📋 生成的周报内容:")
print("="*60)
print(report_content)
print("="*60)
elif channel == "slack" and self.config.get("slack_webhook"):
# 发送到Slack
payload = {
"text": "📊 本周工作周报已生成",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": f"本周工作周报 ({self.weekstart} ~ {self.weekend})"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": reportcontent[:3000] + ("..." if len(reportcontent) > 3000 else "")
}
}
]
}
try:
response = requests.post(
self.config["slack_webhook"],
json=payload,
timeout=10
)
print(f"✅ 周报已发送到Slack (状态码: {response.status_code})")
except Exception as e:
print(f"❌ 发送到Slack失败: {e}")
elif channel == "email" and self.config.get("email_recipients"):
# 发送邮件(需要配置邮件服务器)
print("📧 邮件发送功能需要配置SMTP服务器")
# 这里可以集成邮件发送逻辑
else:
print(f"⚠️ 未配置{channel}渠道或渠道不支持")
def main():
"""主函数 - 供OpenClaw调用"""
import argparse
parser = argparse.ArgumentParser(description="智能周报生成器")
parser.add_argument("--start", help="开始日期 (YYYY-MM-DD)")
parser.add_argument("--end", help="结束日期 (YYYY-MM-DD)")
parser.add_argument("--channel", default="console",
choices=["console", "slack", "email"],
help="输出渠道")
parser.add_argument("--config", help="配置文件路径")
args = parser.parse_args()
# 创建生成器实例
generator = WeeklyReportGenerator(args.config)
# 设置日期范围
generator.setdaterange(args.start, args.end)
# 收集数据
print("📊 正在收集数据...")
gitcommits = generator.collectgit_commits()
jiratasks = generator.collectjira_tasks()
# 生成报告
print("📝 正在生成周报...")
report = generator.generatereport(gitcommits, jira_tasks)
# 发送报告
print(f"🚀 正在发送到 {args.channel}...")
generator.send_report(report, args.channel)
# 保存报告到文件
outputfile = f"weeklyreport{generator.weekstart}.md"
with open(output_file, 'w', encoding='utf-8') as f:
f.write(report)
print(f"✅ 周报已保存到: {output_file}")
return report
if name == "main":
main()
4. 创建配置文件示例
json
// references/config.example.json
{
"git_repos": [
"/path/to/your/project1",
"/path/to/your/project2"
],
"jira_url": "https://your-company.atlassian.net",
"jira_token": "your-api-token-here",
"slack_webhook": "https://hooks.slack.com/services/xxx/yyy/zzz",
"email_recipients": ["team@company.com"],
"output_format": "markdown"
}
5. 创建安装脚本
bash
#!/bin/bash
scripts/install.sh
echo "安装智能周报生成器技能..."
复制文件到OpenClaw技能目录
SKILL_DIR="$HOME/.openclaw/extensions/weekly-report-skill"
mkdir -p "$SKILL_DIR"
cp -r ./* "$SKILL_DIR/"
设置执行权限
chmod +x "$SKILLDIR/scripts/weeklyreport.py"
echo "✅ 技能安装完成!"
echo ""
echo "使用方式:"
echo "1. 编辑配置文件: $SKILL_DIR/references/config.json"
echo "2. 测试技能: python3 $SKILLDIR/scripts/weeklyreport.py"
echo "3. 在OpenClaw中调用: '帮我生成周报'"
🚀 如何集成到OpenClaw?
方法一:通过技能市场安装
bash
打包技能
openclaw skill pack weekly-report-skill
安装到本地
openclaw skill install ./weekly-report-skill.tar.gz
方法二:手动配置
- 将整个技能文件夹复制到
~/.OpenClaw/extensions/ - 在OpenClaw配置中添加技能:
yaml
~/.openclaw/config.yaml
skills:
weekly-report:
enabled: true
path: ~/.openclaw/extensions/weekly-report-skill
triggers:
- "生成周报"
- "本周工作报告"
- "weekly report"
方法三:创建快捷命令
bash
创建别名
alias gen-weekly-report="python3 ~/.openclaw/extensions/weekly-report-skill/scripts/weekly_report.py"
添加到cron定时任务
每周五17:00自动生成周报
0 17 5 python3 /path/to/weekly_report.py --channel=slack
🎨 技能进阶优化
1. 添加Web界面
python
使用FastAPI创建管理界面
from fastapi import FastAPI
app = FastAPI()
@app.post("/generate-report")
async def generatereportapi():
generator = WeeklyReportGenerator()
report = generator.generate_report([], [])
return {"report": report}
2. 支持更多数据源
- GitLab/GitHub API:获取PR/MR信息
- Trello/Asana:项目管理工具集成
- 企业微信/钉钉:国内办公软件支持
- 时间追踪工具:Toggl、Harvest等
3. 添加AI增强
markdown
智能周报生成器技能
描述
自动收集工作数据,生成结构化周报并发送到指定渠道。
适用场景
- 每周五下午自动生成周报
- 手动触发生成指定时间段的报告
- 集成到工作流中作为自动化环节
前置条件
- Git仓库访问权限
- Jira/Trello API密钥(可选)
- 邮件/Slack/企业微信发送权限
使用示例
0
4. 添加数据可视化
markdown
智能周报生成器技能
描述
自动收集工作数据,生成结构化周报并发送到指定渠道。
适用场景
- 每周五下午自动生成周报
- 手动触发生成指定时间段的报告
- 集成到工作流中作为自动化环节
前置条件
- Git仓库访问权限
- Jira/Trello API密钥(可选)
- 邮件/Slack/企业微信发送权限
使用示例
1
📊 实际效果展示
安装并配置后,你可以:
- 命令行使用:
markdown
智能周报生成器技能
描述
自动收集工作数据,生成结构化周报并发送到指定渠道。
适用场景
- 每周五下午自动生成周报
- 手动触发生成指定时间段的报告
- 集成到工作流中作为自动化环节
前置条件
- Git仓库访问权限
- Jira/Trello API密钥(可选)
- 邮件/Slack/企业微信发送权限
使用示例
2
- OpenClaw对话调用:
markdown
智能周报生成器技能
描述
自动收集工作数据,生成结构化周报并发送到指定渠道。
适用场景
- 每周五下午自动生成周报
- 手动触发生成指定时间段的报告
- 集成到工作流中作为自动化环节
前置条件
- Git仓库访问权限
- Jira/Trello API密钥(可选)
- 邮件/Slack/企业微信发送权限
使用示例
3
- 自动化定时任务:
markdown
智能周报生成器技能
描述
自动收集工作数据,生成结构化周报并发送到指定渠道。
适用场景
- 每周五下午自动生成周报
- 手动触发生成指定时间段的报告
- 集成到工作流中作为自动化环节
前置条件
- Git仓库访问权限
- Jira/Trello API密钥(可选)
- 邮件/Slack/企业微信发送权限
使用示例
4
🎯 技能开发最佳实践
1. 模块化设计
- 数据

黑公网安备 23010302001359号