Skill: easyhoov/feishu-morning-news (version 1.0.3)

--- name: feishu-morning-news description: 飞书每日早报配置Skill。封装了每日早报的完整配置流程，包含数据源获取、格式整理、深圳天气查询、生活建议整合。触发关键词：早报配置、创建早报、生成早报、每日早报。 --- # 飞书每日早报Skill ## 功能说明 封装每日早报生成的完整配置，包含： - 从 `https://60s.viki.moe/v2/60s` API 获取今日新闻 - 使用 weather 技能获取指定城市天气预报 - 整理为标准Markdown格式 - 添加生活工作健康建议 - 使用API返回的tip作为每日箴言 ## 配置说明 | 参数 | 说明 | 默认值 | |------|------|--------| | `city` | 获取天气预报的城市名称 | 深圳 | | `data_source` | 新闻数据源API | `https://60s.viki.moe/v2/60s` | | `push_time` | 默认推送时间 | 每天 8:30 | | `timeout` | 超时限制（秒） | 180 | 使用者可根据自身情况修改城市配置。 ## 当使用此Skill时 1. **生成早报内容**：按照固定流程生成完整早报 2. **不直接发送消息**：由OpenClaw cron系统自动投递，不要调用任何消息发送工具 3. **保持格式规范**：严格遵循约定的Markdown结构 4. **重要提醒**：只生成早报内容，系统会自动投递 ## 标准早报生成流程 ### 步骤 1. **获取今日新闻**：调用 `GET https://60s.viki.moe/v2/60s` 获取今日新闻数据 2. **获取城市天气**：调用 weather 技能获取配置城市天气预报（温度范围、天气状况、湿度、风速） 3. **整理新闻**：将新闻按重要性排序（重要新闻放前面），保持每条新闻简洁呈现，只保留核心内容 4. **添加建议**：生成工作、生活、健康各一条简短建议 5. **添加每日一句**：使用API返回的tip字段 ## 输出格式要求 ```markdown ## ☀️ 今日早报 | {日期} {星期} ### 🌤️ {城市}天气 {天气状况} | 气温{温度} | {湿度} | {风速} 💡 出行建议：{出行建议} ### 📰 60秒读懂世界 {新闻列表，每条带序号} ### 💡 今日建议 - **工作**：{工作建议} - **生活**：{生活建议} - **健康**：{健康建议} ### 💪 每日一句 {每日箴言} ``` 模板中的 `{城市}` 会替换为使用者配置的城市名称（默认为深圳）。 ## 配置参数（参考jobs.json） - **数据源**: `https://60s.viki.moe/v2/60s` - **默认推送时间**: 每天 8:30 (Asia/Shanghai) - **超时限制**: 180 秒 - **推送目标**: 使用者配置为自己的飞书会话 ## 使用示例 当用户说"生成一份综合早报"，加载此Skill并按照上述流程生成即可。

path: references/config.json
content: data_source: https://60s.viki.moe/v2/60s
push_time: 08:30
target_open_id: ou_b8bd6c6f4b69a9dda0dd16c2788c32ca
max_retries: 3
retry_delay: 60
log_file: /var/log/feishu-morning-news.log

path: scripts/push.py
content: #!/usr/bin/env python3
import json
import requests
from openclaw.tools.feishu_im_user_message import feishu_im_user_message

def main():
    # 拉取数据
    response = requests.get("https://60s.viki.moe/v2/60s")
    response.raise_for_status()
    data = response.json()["data"]
    
    # 格式化新闻
    news = "\n".join([f"{i+1}. {item}" for i, item in enumerate(data["news"])])
    
    # 组装消息
    content = f"""## ☀️ 今日早报 | {data['date']} {data['day_of_week']}

### 📰 60秒读懂世界
{news}

### 💡 每日箴言
{data['tip']}"""
    
    # 发送消息
    result = feishu_im_user_message(
        action='send',
        receive_id_type='open_id',
        receive_id='ou_b8bd6c6f4b69a9dda0dd16c2788c32ca',
        msg_type='text',
        content=json.dumps({"text": content})
    )
    
    print(f"消息发送成功，message_id: {result['message_id']}")

if __name__ == "__main__":
    main()


path: scripts/push.sh
content: #!/bin/bash
set -e

# 配置
CONFIG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
LOG_FILE="/var/log/feishu-morning-news.log"
DATA_URL="https://60s.viki.moe/v2/60s"
MAX_RETRIES=3
RETRY_DELAY=60

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# 发送飞书消息
send_message() {
    local content="$1"
    log "正在发送早报消息..."
    
    # 保存内容到临时文件
    tmp_file=$(mktemp)
    echo "$content" > "$tmp_file"
    
    # 使用openclaw message工具发送
    openclaw message send --to "user:ou_b8bd6c6f4b69a9dda0dd16c2788c32ca" --file "$tmp_file" >> "$LOG_FILE" 2>&1
    
    local exit_code=$?
    rm -f "$tmp_file"
    
    if [ $exit_code -eq 0 ]; then
        log "早报发送成功"
        return 0
    else
        log "早报发送失败"
        return 1
    fi
}

# 主逻辑
main() {
    log "=== 开始执行早报推送 ==="
    
    # 重试逻辑
    for ((retry=1; retry<=MAX_RETRIES; retry++)); do
        log "尝试第 $retry 次拉取数据..."
        
        # 拉取数据
        response=$(curl -s -w "\n%{http_code}" "$DATA_URL")
        http_code=$(echo "$response" | tail -n1)
        data=$(echo "$response" | head -n -1)
        
        if [ "$http_code" != "200" ]; then
            log "数据拉取失败，HTTP状态码: $http_code"
            if [ $retry -lt $MAX_RETRIES ]; then
                log "等待 $RETRY_DELAY 秒后重试..."
                sleep $RETRY_DELAY
            fi
            continue
        fi
        
        log "数据拉取成功，开始解析..."
        
        # 解析数据
        date=$(echo "$data" | python3 -c "import json, sys; print(json.load(sys.stdin)['data']['date'])")
        week=$(echo "$data" | python3 -c "import json, sys; print(json.load(sys.stdin)['data']['day_of_week'].replace('星期', ''))")
        tip=$(echo "$data" | python3 -c "import json, sys; print(json.load(sys.stdin)['data']['tip'])")
        news=$(echo "$data" | python3 -c "
import json, sys
news_list = json.load(sys.stdin)['data']['news']
for i, item in enumerate(news_list, 1):
    print(f'{i}. {item}')
")
        
        # 格式化消息
        content="## ☀️ 今日早报 | $date 星期$week

### 📰 60秒读懂世界
$news

### 💡 每日箴言
$tip"
        
        # 发送消息
        if send_message "$content"; then
            log "=== 早报推送完成 ==="
            exit 0
        else
            if [ $retry -lt $MAX_RETRIES ]; then
                log "等待 $RETRY_DELAY 秒后重试..."
                sleep $RETRY_DELAY
            fi
        fi
    done
    
    log "=== 所有重试都失败，早报推送失败 ==="
    exit 1
}

# 执行主函数
main "$@"


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)