Install
openclaw skills install @thcjp/cctv-news-tool-freeopenclaw skills install @thcjp/cctv-news-tool-free指定日期、抓取标题、生成简报。三步完成央视新闻联播内容获取。
无需复杂配置,通过简单的命令即可获取指定日期的新闻联播内容。免费版聚焦单日查询场景,快速生成结构化新闻简报.
免费版央视新闻抓取工具为个人用户提供基础的新闻联播内容获取能力。通过 news_crawler.js 脚本调用,将新闻联播内容转化为结构化JSON数据,便于后续处理和分析.
| 维度 | 免费版能力 |
|---|---|
| 单日查询 | 支持 |
| 批量日期查询 | 不支持(需专业版) |
| AI智能摘要 | 不支持(需专业版) |
| 多渠道推送 | 不支持(需专业版) |
| 历史趋势分析 | 不支持(需专业版) |
| 国内/国际分类 | 支持(基础) |
| JSON输出 | 支持 |
| 全文内容 | 不支持(仅标题与摘要) |
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | 央视新闻抓取(免费版)处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
import subprocess
import json
from datetime import datetime, timedelta
# ...
class CCTVNewsFetcher:
"""央视新闻抓取器(免费版)"""
# ...
def __init__(self, script_path="(请参考skill目录中的脚本文件)"):
self.script_path = script_path
self.runtime = self._detect_runtime()
# ...
def _detect_runtime(self):
"""检测可用的JS运行时"""
for runtime in ["bun", "node"]:
result = subprocess.run(["which", runtime], capture_output=True)
if result.returncode == 0:
return runtime
return "node" # 默认使用node
def parse_date(self, date_input):
"""解析日期输入"""
if date_input in ["today", "今天"]:
return datetime.now().strftime("%Y%m%d")
elif date_input in ["yesterday", "昨天"]:
return (datetime.now() - timedelta(days=1)).strftime("%Y%m%d")
elif date_input in ["tomorrow", "明天"]:
now() + timedelta(days=1)).strftime("%Y%m%d")
else:
# 标准化日期格式
date_str = date_input.replace("-", "").replace("/", "").replace(".", "")
if len(date_str) == 8:
return date_str
raise ValueError(f"无效日期格式:{date_input}")
# ...
def fetch(self, date_input):
"""抓取指定日期的新闻"""
date_str = self.parse_date(date_input)
print(f"正在抓取 {date_str} 的新闻联播内容...")
# ...
try:
cmd = [self.runtime, self.script_path, date_str]
cmd, capture_output=True, text=True, timeout=60, encoding="utf-8"
)
# ...
return {"success": False, "error": result.stderr}
# ...
# 解析JSON输出
news_data = json.loads(result.stdout)
return {"success": True, "data": news_data, "date": date_str}
# ...
except subprocess.TimeoutExpired:
return {"success": False, "error": "抓取超时,请稍后重试"}
except json.JSONDecodeError:
return {"success": False, "error": "解析失败,输出格式异常"}
except Exception as e:
return {"success": False, "error": str(e)}
# ...
# 示例
fetcher = CCTVNewsFetcher()
result = fetcher.fetch("20250210")
if result.get("success"):
print(f"成功获取 {result['date']} 的新闻")
else:
print(f"失败:{result.get('error')}")
处理: 解析按日期抓取新闻联播的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回按日期抓取新闻联播的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作class NewsCategorizer:
"""新闻分类器(免费版)"""
# ...
DOMESTIC_KEYWORDS = [
"主席", "总理", "国务院", "全国", "国内", "我国",
"中央", "党委", "政府", "人大", "政协", "两会",
"省委", "市委", "县委", "改革", "发展"
]
# ...
INTERNATIONAL_KEYWORDS = [
"美国", "俄罗斯", "日本", "韩国", "朝鲜", "英国", "法国", "德国",
"联合国", "国际", "外交", "访问", "会谈", "峰会",
"欧盟", "北约", "亚太", "中东", "非洲", "拉美"
]
# ...
def categorize(self, news_list):
"""分类新闻列表"""
categorized = {"domestic": [], "international": [], "other": []}
# ...
for news in news_list:
title = news.get("title", "")
content = news.get("content", "") or news.get("summary", "")
# ...
if self._is_domestic(title, content):
categorized["domestic"].append(news)
elif self._is_international(title, content):
categorized["international"].append(news)
else:
categorized["other"].append(news)
# ...
return categorized
# ...
def _is_domestic(self, title, content):
text = title + content
return any(kw in text for kw in self.DOMESTIC_KEYWORDS)
# ...
def _is_international(self, title, content):
text = title + content
INTERNATIONAL_KEYWORDS)
# ...
# 使用示例
categorizer = NewsCategorizer()
news_list = [
{"title": "国家主席会见外宾", "content": "..."},
{"title": "美国总统访华", "content": "..."},
{"title": "全国两会胜利召开", "content": "..."},
]
categorized = categorizer.categorize(news_list)
print(f"国内:{len(categorized['domestic'])} 条")
print(f"国际:{len(categorized['international'])} 条")
print(f"其他:{len(categorized['other'])} 条")
处理: 解析国内/国际新闻分类的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回国内/国际新闻分类的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作class NewsBriefGenerator:
"""新闻简报生成器(免费版)"""
# ...
def generate(self, date_str, categorized_news):
"""生成新闻简报"""
lines = []
lines.append("=" * 50)
lines.append(f" 新闻联播简报 | {self._format_date(date_str)}")
lines.append("=" * 50)
lines.append("")
# ...
# 国内新闻
domestic = categorized_news.get("domestic", [])
if domestic:
lines.append("【国内新闻】")
lines.append("-" * 40)
for i, news in enumerate(domestic[:10], 1):
lines.append(f"{i}. {title}")
lines.append("")
# ...
# 国际新闻
international = categorized_news.get("international", [])
if international:
lines.append("【国际新闻】")
lines.append("-" * 40)
for i, news in enumerate(international[:10], 1):
append(f"{i}. {title}")
lines.append("")
# ...
# 其他
other = categorized_news.get("other", [])
if other:
lines.append("【其他要闻】")
lines.append("-" * 40)
for i, news in enumerate(other[:5], 1):
append(f"{i}. {title}")
lines.append("")
# ...
lines.append("=" * 50)
lines.append(f" 共 {sum(len(v) for v in categorized_news.values())} 条新闻")
lines.append("=" * 50)
# ...
return "\n".join(lines)
# ...
def _format_date(self, date_str):
"""格式化日期显示"""
if len(date_str) == 8:
return f"{date_str[:4]}年{date_str[4:6]}月{date_str[6:8]}日"
return date_str
# ...
# 使用示例
generator = NewsBriefGenerator()
brief = generator.generate("20250210", categorized)
print(brief)
处理: 解析基础简报生成的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回基础简报生成的响应数据,包含状态码、结果和日志. 能力覆盖范围:本skill的核心能力覆盖以下场景关键词:央视新闻联播抓取、支持按日期获取新、闻标题与摘要、生成基础简报、央视新闻抓取助手、免费版是面向个人、用户的轻量新闻联、播内容抓取工具、抓取标题、生成简报、三步流程、快速获取新闻联播、Use、when、需要生成营销文案、写作内容、标题优化、内容创作时使用、不适用于纯技术文、档撰写、适用于独立开发者、企业团队和自动化、工作流场景等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持.
input_params参数,支持创建/查询/导出操作场景描述:每天晚上查看当天新闻联播要点.
fetcher = CCTVNewsFetcher()
categorizer = NewsCategorizer()
generator = NewsBriefGenerator()
# ...
# 抓取今天的新闻
result = fetcher.fetch("today")
if result.get("success"):
news_list = result["data"].get("news", [])
# 分类
categorize(news_list)
# 生成简报
brief = generator.generate(result["date"], categorized)
print(brief)
else:
print(f"获取失败:{result.get('error')}")
场景描述:查询某历史日期的新闻联播内容.
# 查询特定日期
result = fetcher.fetch("2025-01-01")
if result.get("success"):
print(f"2025年元旦新闻联播共 {len(news_list)} 条")
for i, news in enumerate(news_list, 1):
print(f"{i}. {news.get('title')}")
场景描述:自媒体创作者获取新闻素材用于内容创作.
# 获取最近一周的新闻标题作为创作参考
import datetime
# ...
for days_ago in range(7):
date = (datetime.datetime.now() - datetime.timedelta(days=days_ago)).strftime("%Y%m%d")
result = fetcher.fetch(date)
if result.get("success"):
print(f"\n=== {date} ===")
for news in news_list[:5]:
print(f" - {news.get('title')}")
# 使用bun运行(推荐,速度更快)
bun (请参考skill目录中的脚本文件) 20250210
# ...
# 或使用node运行
node (请参考skill目录中的脚本文件) 20250210
# ...
# 使用相对日期
node (请参考skill目录中的脚本文件) yesterday
node (请参考skill目录中的脚本文件) today
```bash
# 在此执行相关操作
echo "操作完成"
```bash
# 依赖说明
npm install node-html-parser
# 或
bun add node-html-parser
# ...
# 2. 验证运行时
which bun || which node
# ...
# 3. 执行抓取
node (请参考skill目录中的脚本文件) 20250210 > news_20250210.json
# ...
# 4. 解析输出
cat news_20250210.json | python3 -m json.tool | head -50
```bash
# 在此执行相关操作
echo "操作完成"
```python
import os
# ...
class CCTVConfig:
"""央视新闻抓取配置(免费版)"""
SCRIPT_PATH = os.getenv("CCTV_SCRIPT_PATH", "(请参考skill目录中的脚本文件)")
RUNTIME = os.getenv("CCTV_RUNTIME", "node") # node 或 bun
OUTPUT_FORMAT = os.getenv("CCTV_OUTPUT", "json") # json 或 text
TIMEOUT = int(os.getenv("CCTV_TIMEOUT", "60"))
MAX_NEWS = int(os.getenv("CCTV_MAX_NEWS", "30"))
# ...
@classmethod
def show(cls):
print("=== 央视新闻抓取配置 ===")
print(f"脚本路径:{cls.SCRIPT_PATH}")
print(f"运行时:{cls.RUNTIME}")
print(f"输出格式:{cls.OUTPUT_FORMAT}")
print(f"超时时间:{cls.TIMEOUT}s")
print(f"最大新闻数:{cls.MAX_NEWS}")
# ...
CCTVConfig.show()
```bash
# 在此执行相关操作
echo "操作完成"
```json
{
"date": "20250210",
"news": [
{
"title": "国家主席会见外国领导人",
"content": "新闻联播内容摘要...",
"category": "domestic",
"order": 1
},
{
"title": "国际组织发布重要报告",
"category": "international",
"order": 2
}
],
"total": 15,
"fetch_time": "2025-02-10T20:00:00"
}
def safe_fetch_with_retry(date_input, max_retries=2):
"""带重试的安全抓取"""
fetcher = CCTVNewsFetcher()
for attempt in range(max_retries):
if result.get("success"):
return result
print(f"第{attempt+1}次失败:{result.get('error')}")
if attempt < max_retries - 1:
import time
time.sleep(3)
return {"success": False, "error": "重试次数已用完"}
```bash
# 在此执行相关操作
echo "操作完成"
```python
def get_recent_dates(days=7):
"""获取最近N天的日期列表"""
from datetime import datetime, timedelta
today = datetime.now()
return [(today - timedelta(days=i)).strftime("%Y%m%d") for i in range(days)]
# ...
# 批量查询(注意频率,建议间隔2-3秒)
dates = get_recent_dates(7)
for date in dates:
print(f"查询 {date}...")
# result = fetcher.fetch(date)
# time.sleep(2)
```bash
# 在此执行相关操作
echo "操作完成"
```python
import os
import json
# ...
def fetch_with_cache(date_input, cache_dir="./cache"):
"""带缓存的抓取"""
os.makedirs(cache_dir, exist_ok=True)
fetcher = CCTVNewsFetcher()
date_str = fetcher.parse_date(date_input)
cache_file = os.path.join(cache_dir, f"news_{date_str}.json")
# ...
# 检查缓存
if os.path.exists(cache_file):
with open(cache_file, "r", encoding="utf-8") as f:
return json.load(f)
# ...
# 抓取并缓存
if result.get("success"):
with open(cache_file, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
# ...
return result
检查error_code并按照处理方式进行排查.
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Node.js 16+ | 运行时 | 二选一 | 官网下载安装 |
| Bun 1.0+ | 运行时 | 二选一 | curl -fsSL https://bun.sh/install | bash |
| node-html-parser | npm包 | 必需 | npm install node-html-parser 或 bun add node-html-parser |
| Python 3.8+ | 运行时 | 可选 | 辅助脚本使用 |
| LLM API | API | 必需 | 由Agent平台内置LLM提供 |
详细的输入输出格式请参考下方章节说明。
本免费体验版限制以下高级功能(需升级至专业版解锁):
解锁全部高级能力请使用专业版:cctv-news-tool-pro
输出:返回执行结果,包含操作状态和输出数据
用户: 执行核心功能
Skill: 正在执行核心功能...
Skill: 执行完成,结果如下: 操作成功