Skill: vic240821/dailynews (version 1.0.0)

--- name: daily-news description: 每日新闻获取技能。通过 API 获取每日新闻摘要和详情，支持按日期查询、热点新闻排行、新闻详情阅读。 version: 1.0.0 metadata: openclaw: requires: bins: - curl - node homepage: https://api.cjiot.cc --- # 每日新闻 Skill 通过 API 获取每日新闻，支持新闻列表查询、热点新闻、新闻详情阅读等功能。 ## API 接口 ### 1. 获取每日新闻列表 **接口地址：** ``` https://api.cjiot.cc/api/v1/daily?date={YYYY-MM-DD} ``` **参数说明：** - `date` - 日期，格式：YYYY-MM-DD（如：2026-03-10） - 如果不传日期，默认获取最新日期的新闻 **返回结构：** ```json { "code": 200, "data": { "date": "2026-03-10", "title": "3 月 10 日日知录 - 交通部约谈国际航运巨头", "article_count": 17, "articles": [ { "article_id": 8533, "title": "交通部约谈两大国际航运巨头：直指运价暴涨和乱收费", "summary": "2026 年 3 月 9 日交通运输部就国际航运经营行为...", "heat": 93.0, "cover_image": "https://...", "category_id": 2, "is_pinned": 0, "sort_order": 0 } ] }, "message": "success" } ``` ### 2. 获取新闻详情 **接口地址：** ``` https://api.cjiot.cc/api/v1/articles/{article_id} ``` **参数说明：** - `article_id` - 文章 ID（从新闻列表中获取） **返回结构：** ```json { "code": 200, "data": { "article_id": 8533, "title": "交通部约谈两大国际航运巨头：直指运价暴涨和乱收费", "category_name": "时政", "heat": 93.0, "cover_image": "https://...", "summary": "...", "content": { "story": "<p>新闻正文内容...</p>", "impact": "<p>影响分析...</p>", "heat": 93, "type": "2" }, "publish_time": "2026-03-10T15:05:49" }, "message": "success" } ``` ## 触发条件 用户表达了以下意图之一： - 查询今日新闻、每日新闻、新闻摘要 - 查看某日期的新闻（如"查看 3 月 10 日的新闻"） - 获取热点新闻、热门新闻 - 阅读具体新闻详情（如"看第 3 条新闻"、"读一下这条新闻"） - 包含"新闻"、"日报"、"日知录"、"头条"等关键词 ## 使用场景 ### 场景一：获取今日新闻列表 **用户输入示例：** - "今天有什么新闻" - "查看每日新闻" - "来份今日日报" **处理步骤：** 1. 获取当前日期（格式：YYYY-MM-DD） 2. 调用 API：`curl -s "https://api.cjiot.cc/api/v1/daily?date={当前日期}"` 3. 解析返回的新闻列表 4. 按热度排序展示前 10 条新闻摘要 **回复模板：** ``` 📰 {日期} 每日新闻摘要 共 {article_count} 条新闻，以下是热点 TOP10： 🔥 {热度} {标题} {摘要前 50 字}... 🔥 {热度} {标题} {摘要前 50 字}... ... 💡 回复"新闻 1"、"新闻 2"等查看具体新闻详情 ``` ### 场景二：获取指定日期新闻 **用户输入示例：** - "查看 3 月 10 日的新闻" - "前天的新闻" - "昨天的日报" **处理步骤：** 1. 解析用户输入的日期 2. 调用 API：`curl -s "https://api.cjiot.cc/api/v1/daily?date={日期}"` 3. 解析并展示新闻列表 **回复模板：** ``` 📰 {日期} 每日新闻摘要 共 {article_count} 条新闻： 1️⃣ 🔥 {热度} {标题} 2️⃣ 🔥 {热度} {标题} ... 💡 回复"新闻 1"、"新闻 2"等查看具体新闻详情 ``` ### 场景三：查看新闻详情 **用户输入示例：** - "看新闻 1" - "读一下第 3 条" - "第一条新闻详情" **处理步骤：** 1. 从上下文获取当前新闻列表 2. 提取用户指定的文章 ID 3. 调用 API：`curl -s "https://api.cjiot.cc/api/v1/articles/{article_id}"` 4. 解析并展示新闻详情（标题、分类、热度、正文） **回复模板：** ``` 📄 {标题} 📁 分类：{category_name} 🔥 热度：{heat} 🕐 发布时间：{publish_time} 📝 新闻摘要： {summary} 📖 详细内容： {content.story 去除 HTML 标签后的文本} 💡 影响分析： {content.impact 去除 HTML 标签后的文本} ``` ### 场景四：按分类查看新闻 **用户输入示例：** - "看时政新闻" - "科技类新闻" - "财经新闻有哪些" **处理步骤：** 1. 先获取当日新闻列表 2. 根据分类 ID 筛选新闻（category_id） 3. 展示该分类下的新闻 **分类参考：** - 1 - 娱乐 - 2 - 时政 - 3 - 社会 - 4 - 财经 - 5 - 科技 - 7 - 体育 ## 脚本工具 ### 获取新闻列表 ```bash node scripts/get-daily.js [date] ``` **示例：** ```bash # 获取今日新闻 node scripts/get-daily.js # 获取指定日期新闻 node scripts/get-daily.js 2026-03-10 ``` ### 获取新闻详情 ```bash node scripts/get-article.js <article_id> ``` **示例：** ```bash node scripts/get-article.js 8533 ``` ## 注意事项 1. **日期格式**：必须使用 YYYY-MM-DD 格式（如：2026-03-10） 2. **API 限制**：注意 API 调用频率，避免频繁请求 3. **HTML 处理**：新闻详情中的 content.story 和 content.impact 包含 HTML 标签，展示时需要去除或转换 4. **热度排序**：新闻列表默认按 sort_order 排序，可按 heat 字段重新排序展示热点新闻 5. **上下文保持**：查看新闻详情时需要保持新闻列表上下文，以便用户连续查看多条新闻 6. **错误处理**：API 返回 code 不为 200 时，提示用户网络错误或日期无数据 ## 相关链接 - API 文档：https://api.cjiot.cc - 数据源：共晓天下日知录每日新闻

path: scripts/get-article.js
content: #!/usr/bin/env node

/**
 * 获取新闻详情
 * 用法：node get-article.js <article_id>
 * 示例：node get-article.js 8533
 */

const https = require('https');

function stripHtml(html) {
  if (!html) return '';
  return html
    .replace(/<p>/g, '\n')
    .replace(/<\/p>/g, '')
    .replace(/<br>/g, '\n')
    .replace(/<br\/>/g, '\n')
    .replace(/<strong>/g, '**')
    .replace(/<\/strong>/g, '**')
    .replace(/<[^>]*>/g, '')
    .trim();
}

function getArticleDetail(articleId) {
  if (!articleId) {
    console.error('❌ 请提供文章 ID');
    console.error('用法：node get-article.js <article_id>');
    console.error('示例：node get-article.js 8533');
    process.exit(1);
  }

  const url = `https://api.cjiot.cc/api/v1/articles/${articleId}`;

  https.get(url, (res) => {
    let data = '';

    res.on('data', (chunk) => {
      data += chunk;
    });

    res.on('end', () => {
      try {
        const result = JSON.parse(data);
        
        if (result.code !== 200) {
          console.error(`❌ API 返回错误：${result.message || '未知错误'}`);
          process.exit(1);
        }

        const article = result.data;
        const content = article.content || {};

        console.log('\n' + '═'.repeat(60));
        console.log(`\n📄 ${article.title}\n`);
        console.log('─'.repeat(60));
        console.log(`📁 分类：${article.category_name || '未知'}`);
        console.log(`🔥 热度：${article.heat}`);
        console.log(`🕐 发布时间：${article.publish_time || article.created_at}`);
        console.log('─'.repeat(60));

        if (article.summary) {
          console.log('\n📝 新闻摘要：\n');
          console.log(article.summary);
        }

        if (content.story) {
          console.log('\n📖 详细内容：\n');
          console.log(stripHtml(content.story));
        }

        if (content.impact) {
          console.log('\n💡 影响分析：\n');
          console.log(stripHtml(content.impact));
        }

        console.log('\n' + '═'.repeat(60) + '\n');

      } catch (error) {
        console.error(`❌ 解析 JSON 失败：${error.message}`);
        process.exit(1);
      }
    });
  }).on('error', (error) => {
    console.error(`❌ 请求失败：${error.message}`);
    process.exit(1);
  });
}

// 获取命令行参数
const articleId = process.argv[2];
getArticleDetail(articleId);


path: scripts/get-daily.js
content: #!/usr/bin/env node

/**
 * 获取每日新闻列表
 * 用法：node get-daily.js [date]
 * 示例：node get-daily.js 2026-03-10
 */

const https = require('https');

function getDailyNews(date = null) {
  // 如果没有传入日期，使用当前日期
  if (!date) {
    const now = new Date();
    date = now.toISOString().split('T')[0];
  }

  // 验证日期格式
  const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
  if (!dateRegex.test(date)) {
    console.error('❌ 日期格式错误，请使用 YYYY-MM-DD 格式（如：2026-03-10）');
    process.exit(1);
  }

  const url = `https://api.cjiot.cc/api/v1/daily?date=${date}`;

  https.get(url, (res) => {
    let data = '';

    res.on('data', (chunk) => {
      data += chunk;
    });

    res.on('end', () => {
      try {
        const result = JSON.parse(data);
        
        if (result.code !== 200) {
          console.error(`❌ API 返回错误：${result.message || '未知错误'}`);
          process.exit(1);
        }

        const newsData = result.data;
        
        console.log(`\n📰 ${newsData.date} 每日新闻摘要\n`);
        console.log(`📋 共 ${newsData.article_count} 条新闻\n`);
        console.log('━'.repeat(60));

        // 按热度排序
        const sortedArticles = [...newsData.articles].sort((a, b) => b.heat - a.heat);

        sortedArticles.forEach((article, index) => {
          const rank = index + 1;
          const heat = article.heat.toFixed(0);
          const title = article.title;
          const summary = article.summary ? 
            (article.summary.length > 50 ? article.summary.substring(0, 50) + '...' : article.summary) 
            : '无摘要';
          
          console.log(`\n${rank}. 🔥${heat} ${title}`);
          console.log(`   ${summary}`);
          console.log(`   [ID: ${article.article_id}]`);
        });

        console.log('\n' + '━'.repeat(60));
        console.log('\n💡 使用 node get-article.js <article_id> 查看新闻详情\n');

      } catch (error) {
        console.error(`❌ 解析 JSON 失败：${error.message}`);
        process.exit(1);
      }
    });
  }).on('error', (error) => {
    console.error(`❌ 请求失败：${error.message}`);
    process.exit(1);
  });
}

// 获取命令行参数
const dateArg = process.argv[2];
getDailyNews(dateArg);


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