【OpenClaw】钉钉数据分析bot

🩵创建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}&timestamp={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 [文件路径]
相关推荐
菜包eo15 小时前
Kingsway Ultra:从视频到 AI,出海企业完整解决方案
人工智能·外贸b2b·外贸独立站·openclaw·kingwayvideo·视频营销
leo·Thomas15 小时前
OpenClaw多节点一键部署脚本(Ubuntu)
ai·openclaw
landuochong20015 小时前
OpenClaw 架构文档
人工智能·架构·openclaw
泯仲16 小时前
Ragent项目7种设计模式深度解析:从源码看设计模式落地实践
java·算法·设计模式·agent
cxr82816 小时前
OpenClaw与NetLogo之间的调用与数据交互机制
人工智能·交互·netlogo·openclaw
码克疯v116 小时前
OpenClaw 安装与入门:从零到跑通 Gateway(详细可操作)
gateway·openclaw·龙虾
DigitalOcean17 小时前
OpenClaw 多智能体部署:弹性扩展、零运维
agent·ai编程
七夜zippoe17 小时前
OpenClaw 接入 Discord:从零开始
大数据·人工智能·microsoft·discord·openclaw
deephub18 小时前
信息访问 vs. 推理能力:LLM Agent 性能归因的实验分析
人工智能·深度学习·大语言模型·agent