🩵创建Agent------vana
openclaw agents add vana --workspace ~/.openclaw/workspace-vana
配置Agent
| 文件 | 作用 | 生效场景 | 对你当前任务的影响 |
|---|---|---|---|
SOUL.md |
定义人设、回复风格 | 通过聊天通道交互时 | ❌ 无(你直接用 CLI 发指令) |
TOOLS.md |
指导工具使用偏好 | Agent 自己规划任务时 | ⚠️ 很小(你的指令已经很具体) |
HEARTBEAT.md |
定义定时任务 | 定时触发时 | ❌ 无(你手动执行) |
这三个文件可以不配置。
1. 读取数据
🩵安装Skills------browser
clawhub install browser-automation
🩵安装OpenClaw支持的浏览器chrome
🩵打开目标网址
javascript
openclaw browser --browser-profile openclaw open 'https://channels.weixin.qq.com/mcn/statistic/video?mode=singleVideo'
🩵手动扫码登录(浏览器窗口会显示二维码),找到对应页面
🩵读取网页数据的指令
javascript
openclaw browser --browser-profile openclaw evaluate --fn '
async () => {
function wait(ms) { return new Promise(r => setTimeout(r, ms)); }
// 读取表头
const headers = [];
const thElements = document.querySelectorAll(".ant-table-thead th");
thElements.forEach(th => {
let text = th.innerText.trim();
if (text === "") {
const iconSpan = th.querySelector(".like-wrp, .thumb-wrp");
if (iconSpan) {
if (iconSpan.querySelector(".like-icon")) text = "点赞";
else if (iconSpan.querySelector(".thumb-icon")) text = "推荐";
}
}
if (text && text !== "详情") headers.push(text);
});
const allData = [];
let pageNum = 1;
let minDate = null;
let maxDate = null;
while (pageNum <= 20) {
const rows = document.querySelectorAll("tr");
for (let i = 0; i < rows.length; i++) {
const cells = rows[i].querySelectorAll("td");
if (cells.length > 5) {
const firstCell = cells[0].textContent.trim();
const dateCell = cells[2]?.textContent.trim() || "";
if (firstCell && !/^\d+$/.test(firstCell) && firstCell !== "视频" && dateCell.includes("2026")) {
// 更新日期范围
if (dateCell) {
if (!minDate || dateCell < minDate) minDate = dateCell;
if (!maxDate || dateCell > maxDate) maxDate = dateCell;
}
const row = {};
for (let j = 0; j < cells.length && j < headers.length; j++) {
let text = cells[j].textContent.trim();
text = text.replace(/\n/g, " ").substring(0, 50);
row[headers[j]] = text;
}
allData.push(row);
}
}
}
const buttons = document.querySelectorAll("a, button");
let nextBtn = null;
for (let i = 0; i < buttons.length; i++) {
if (buttons[i].textContent.includes("下一页")) {
nextBtn = buttons[i];
break;
}
}
if (nextBtn && !nextBtn.disabled) {
nextBtn.click();
await wait(2000);
pageNum++;
} else {
break;
}
}
// 构建发布日期范围字符串
const dateRange = minDate && maxDate
? (minDate === maxDate ? minDate : `${minDate} 至 ${maxDate}`)
: "未检测到日期";
return {
发布日期范围: dateRange,
表头: headers,
视频总数: allData.length,
视频列表: allData
};
}
' > /Users/dudumac003/.openclaw/workspace-vana/videojson/$(date +%Y%m%d).json && \
echo "✅ JSON 已保存" && \
ls -lh /Users/dudumac003/.openclaw/workspace-vana/videojson/$(date +%Y%m%d).json
2. 分析数据
🩵让openclaw对数据进行分析
javascript
openclaw agent --agent vana --message "请读取文件夹/Users/dudumac003/.openclaw/workspace-vana/videojson中文件名为今日日期的文件,然后对这个JSON数据做数据分析,包括:
1. 整体数据概览(视频总数、总播放量、总互动量)
2. 按账号分组统计(各账号的视频数、总播放量、平均完播率)
3. 爆款视频TOP 5(按播放量排序)
4. 内容类型分析(根据视频标题特征分类)
5. 发现的问题和建议
分析结果请同时输出到:
- CLI 终端显示
- 保存为markdown文件至/Users/dudumac003/.openclaw/workspace-vana/analysis,文件名为发布日期范围"
3. 钉钉机器人
🩵在钉钉群聊中点击「群设置」→「机器人」→「添加机器人」,选择「自定义机器人」,设置安全设置(推荐使用「加签」方式),复制 Webhook 地址和签名密钥
🩵发送信息的脚本
javascript
cat > send_to_dingtalk.py << 'EOF'
import sys
import os
import time
import hmac
import hashlib
import base64
import urllib.parse
import urllib.request
import json
ACCESS_TOKEN = "e7167a4dec693f0ae09b88949da7a5d3f42bf7b4ec17446b01257b70cb11f8bb"
SECRET = "SEC1bd18e9c0bf54b5d959cf3a7ad50d680d52f93df59f5e06eac3b828f8f185c12"
def send_to_dingtalk(file_path, title=None):
if not os.path.exists(file_path):
print(f"❌ 文件不存在: {file_path}")
return False
# 读取文件内容
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 截断过长内容
original_length = len(content)
if len(content) > 4500:
content = content[:4500] + "\n\n... (内容过长已截断,完整内容请查看原始文件)"
print(f"⚠️ 内容已截断: {original_length} -> 4500 字符")
if not title:
title = f"📄 {os.path.basename(file_path)}"
# 生成钉钉签名
timestamp = str(round(time.time() * 1000))
secret_enc = SECRET.encode('utf-8')
string_to_sign = f"{timestamp}\n{SECRET}"
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
url = f"https://oapi.dingtalk.com/robot/send?access_token={ACCESS_TOKEN}×tamp={timestamp}&sign={sign}"
# 构建消息 - 修复:这里要包含实际的内容
data = {
"msgtype": "markdown",
"markdown": {
"title": title,
"text": f"""### {title}
**文件:** `{file_path}`
**大小:** {os.path.getsize(file_path)} 字节
**时间:** {time.strftime('%Y-%m-%d %H:%M:%S')}
---
#### 📝 文件内容:
{content}
---
*完整内容长度: {original_length} 字符*
"""
}
}
req = urllib.request.Request(
url,
data=json.dumps(data).encode('utf-8'),
headers={'Content-Type': 'application/json'}
)
try:
with urllib.request.urlopen(req, timeout=10) as response:
result = json.loads(response.read())
if result.get('errcode') == 0:
print(f"✅ 发送成功: {title}")
print(f" 文件: {file_path}")
print(f" 内容长度: {original_length} 字符")
return True
else:
print(f"❌ 发送失败: {result}")
return False
except Exception as e:
print(f"❌ 请求失败: {e}")
return False
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法: python3 send_to_dingtalk.py <文件路径> [标题]")
print("\n示例:")
print(" python3 send_to_dingtalk.py /path/to/file.md")
print(" python3 send_to_dingtalk.py /path/to/file.md '我的报告'")
sys.exit(1)
file_path = sys.argv[1]
title = sys.argv[2] if len(sys.argv) > 2 else None
send_to_dingtalk(file_path, title)
EOF
chmod +x send_to_dingtalk.py
(chmod +x send_to_dingtalk.py 的作用是给这个 Python 脚本文件添加可执行权限)
🩵执行脚本,需传入需要发送的文件路径(在send_to_dingtalk.py的保存路径执行)
javascript
python3 send_to_dingtalk.py [文件路径]