From c53b35f933436c4810111a0bc3378c1d3883a532 Mon Sep 17 00:00:00 2001 From: arch3rPro Date: Sat, 20 Dec 2025 01:00:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(trendradar):=20=E6=B7=BB=E5=8A=A0=20TrendR?= =?UTF-8?q?adar=20=E5=BA=94=E7=94=A8=E5=8F=8A=E7=9B=B8=E5=85=B3=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++ apps/trendradar/4.0.2/config/config.yaml | 187 ++++++++++++++++++ .../4.0.2/config/frequency_words.txt | 113 +++++++++++ apps/trendradar/4.0.2/data.yml | 78 ++++++++ apps/trendradar/4.0.2/docker-compose.yml | 37 ++++ apps/trendradar/README.md | 69 +++++++ apps/trendradar/README_en.md | 69 +++++++ apps/trendradar/data.yml | 30 +++ apps/trendradar/latest/config/config.yaml | 187 ++++++++++++++++++ .../latest/config/frequency_words.txt | 113 +++++++++++ apps/trendradar/latest/data.yml | 78 ++++++++ apps/trendradar/latest/docker-compose.yml | 37 ++++ apps/trendradar/logo.png | Bin 0 -> 57746 bytes 13 files changed, 1010 insertions(+) create mode 100644 apps/trendradar/4.0.2/config/config.yaml create mode 100644 apps/trendradar/4.0.2/config/frequency_words.txt create mode 100644 apps/trendradar/4.0.2/data.yml create mode 100644 apps/trendradar/4.0.2/docker-compose.yml create mode 100644 apps/trendradar/README.md create mode 100644 apps/trendradar/README_en.md create mode 100644 apps/trendradar/data.yml create mode 100644 apps/trendradar/latest/config/config.yaml create mode 100644 apps/trendradar/latest/config/frequency_words.txt create mode 100644 apps/trendradar/latest/data.yml create mode 100644 apps/trendradar/latest/docker-compose.yml create mode 100644 apps/trendradar/logo.png diff --git a/README.md b/README.md index 527fcc2..2543e92 100644 --- a/README.md +++ b/README.md @@ -693,6 +693,18 @@ AI驱动的开源代码知识库与文档协作平台,支持多模型、多数 1.2.4 • [官网链接](https://www.open-notebook.ai/) + + + + +TrendRadar +
TrendRadar +
+ +📊 轻量级多平台趋势监控工具,AI驱动的热点话题分析 + +4.0.2 • [官网链接](https://github.com/sansan0/TrendRadar) + diff --git a/apps/trendradar/4.0.2/config/config.yaml b/apps/trendradar/4.0.2/config/config.yaml new file mode 100644 index 0000000..72a61f3 --- /dev/null +++ b/apps/trendradar/4.0.2/config/config.yaml @@ -0,0 +1,187 @@ +app: + version_check_url: "https://raw.githubusercontent.com/sansan0/TrendRadar/refs/heads/master/version" + show_version_update: true # 控制显示版本更新提示,如果 false,则不接受新版本提示 + # 时区配置(影响所有时间显示、推送窗口判断、数据存储) + # 常用时区: + # - Asia/Shanghai (北京时间 UTC+8) + # - America/New_York (美东时间 UTC-5/-4) + # - Europe/London (伦敦时间 UTC+0/+1) + # 完整时区列表: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + timezone: "Asia/Shanghai" + +# 存储配置 +storage: + # 存储后端选择: local / remote / auto + # - local: 本地 SQLite + TXT/HTML 文件 + # - remote: 远程云存储(S3 兼容协议,支持 R2/OSS/COS 等) + # - auto: 自动选择(GitHub Actions 环境且配置了远程存储则用 remote,否则用 local) + backend: "auto" + + # 数据格式选项 + formats: + sqlite: true # 主存储(必须启用) + txt: false # 是否生成 TXT 快照 + html: false # 是否生成 HTML 报告(⚠️ 邮件推送必须设为 true,否则会报错) + + # 本地存储配置 + local: + data_dir: "output" # 数据目录 + retention_days: 0 # 本地数据保留天数(0 = 不清理) + + # 远程存储配置(S3 兼容协议) + # 支持: Cloudflare R2, 阿里云 OSS, 腾讯云 COS, AWS S3, MinIO 等 + # 建议将敏感信息配置在 GitHub Secrets 或环境变量中 + remote: + # 数据保留天数(0 = 不清理远程数据) + retention_days: 0 + # S3 兼容配置 + endpoint_url: "" # 服务端点(或环境变量 S3_ENDPOINT_URL) + # Cloudflare R2: https://.r2.cloudflarestorage.com + # 阿里云 OSS: https://oss-cn-hangzhou.aliyuncs.com + # 腾讯云 COS: https://cos.ap-guangzhou.myqcloud.com + bucket_name: "" # 存储桶名称(或环境变量 S3_BUCKET_NAME) + access_key_id: "" # 访问密钥 ID(或环境变量 S3_ACCESS_KEY_ID) + secret_access_key: "" # 访问密钥(或环境变量 S3_SECRET_ACCESS_KEY) + region: "" # 区域(可选,部分服务商需要,或环境变量 S3_REGION) + + # 数据拉取配置(从远程同步到本地) + # 用于 MCP Server 等场景:爬虫存到远程,MCP 拉取到本地分析 + pull: + enabled: false # 是否启用启动时自动拉取 + days: 7 # 拉取最近 N 天的数据(0 = 不拉取) + +crawler: + request_interval: 1000 # 请求间隔(毫秒) + enable_crawler: true # 是否启用爬取新闻功能,如果 false,则直接停止程序 + use_proxy: false # 是否启用代理,false 时为关闭 + default_proxy: "http://127.0.0.1:10801" + +# 🔸 daily(当日汇总模式) +# • 推送时机:按时推送(默认每小时推送一次) +# • 显示内容:当日所有匹配新闻 + 新增新闻区域 +# • 适用场景:日报总结、全面了解当日热点趋势 +# +# 🔸 current(当前榜单模式) +# • 推送时机:按时推送(默认每小时推送一次) +# • 显示内容:当前榜单匹配新闻 + 新增新闻区域 +# • 适用场景:实时热点追踪、了解当前最火的内容 +# +# 🔸 incremental(增量监控模式) +# • 推送时机:有新增才推送 +# • 显示内容:新出现的匹配频率词新闻 +# • 适用场景:避免重复信息干扰 + +# 推送模式选择 +report: + mode: "daily" # 可选: "daily"|"incremental"|"current" + rank_threshold: 5 # 排名高亮阈值 + sort_by_position_first: false # 排序优先级:true=先按配置位置排序,false=先按热点条数排序 + max_news_per_keyword: 0 # 每个关键词最大显示数量,0=不限制 + reverse_content_order: false # 内容顺序:false=热点词汇统计在前,true=新增热点新闻在前 + +notification: + enable_notification: true # 是否启用通知功能,如果 false,则不发送手机通知 + message_batch_size: 4000 # 消息分批大小(字节)(这个配置别动) + dingtalk_batch_size: 20000 # 钉钉消息分批大小(字节)(这个配置也别动) + feishu_batch_size: 30000 # 飞书消息分批大小(字节) + bark_batch_size: 4000 # Bark消息分批大小(字节) + slack_batch_size: 4000 # Slack消息分批大小(字节) + batch_send_interval: 3 # 批次发送间隔(秒) + feishu_message_separator: "━━━━━━━━━━━━━━━━━━━" # feishu 消息分割线 + max_accounts_per_channel: 3 # 每个渠道最大账号数量,建议不超过 3 + + # 🕐 推送时间窗口控制(可选功能) + # 用途:限制推送的时间范围,避免非工作时间打扰 + # 适用场景: + # - 只想在工作日白天接收推送(如 09:00-18:00) + # - 希望在晚上固定时间收到汇总(如 20:00-22:00) + push_window: + enabled: false # 是否启用推送时间窗口控制,默认关闭 + # 注意:GitHub Actions 执行时间不稳定,时间范围建议至少留足 2 小时 + # 如果想要精准的定时推送,建议使用 Docker 部署在个人服务器上 + time_range: + start: "20:00" # 推送时间窗口开始(北京时间) + end: "22:00" # 推送时间窗口结束(北京时间) + once_per_day: true # 每天在时间窗口内只推送一次,如果 false,则窗口内每次执行都推送 + + # ⚠️⚠️⚠️ 重要安全警告 / IMPORTANT SECURITY WARNING ⚠️⚠️⚠️ + # + # 🔴 请务必妥善保管好 webhooks,不要公开!!! + # 🔴 如果你以 fork 的方式将本项目部署在 GitHub 上,请勿在下面填写任何 webhooks + # 🔴 而是将 webhooks 填入 GitHub Secret(Settings → Secrets and variables → Actions) + # 🔴 否则: + # - 轻则:手机上收到大量垃圾广告推送 + # - 重则:webhook 被滥用造成严重安全隐患(如恶意消息轰炸、钓鱼链接等) + # + # 🔴 NEVER expose webhooks publicly!!! + # 🔴 If deploying via GitHub fork, DO NOT fill webhooks below + # 🔴 Instead, add them to GitHub Secrets (Settings → Secrets and variables → Actions) + # 🔴 Consequences of exposure: + # - Minor: Spam notifications flooding your devices + # - Severe: Webhook abuse leading to security incidents (malicious messages, phishing links, etc.) + # + # ⚠️⚠️⚠️ 多账号推送说明 / MULTI-ACCOUNT PUSH NOTICE ⚠️⚠️⚠️ + # + # 🔸 多账号支持: + # • 请使用分号(;)分隔多个账号,如:"url1;url2;url3" + # • 示例:telegram_bot_token: "token1;token2" 对应 telegram_chat_id: "id1;id2" + # • 对于需要配对的配置(如 Telegram 的 token 和 chat_id),数量必须一致 + # • 每个渠道最多支持 max_accounts_per_channel 个账号(见上方配置) + # • 邮箱已支持多收件人(逗号分隔),保持不变 + # + # 🔸 Multi-Account Support: + # • Use semicolon(;) to separate multiple accounts, e.g., "url1;url2;url3" + # • Example: telegram_bot_token: "token1;token2" with telegram_chat_id: "id1;id2" + # • For paired configs (e.g., Telegram token and chat_id), quantities must match + # • Each channel supports up to max_accounts_per_channel accounts (see above config) + # • Email already supports multiple recipients (comma-separated), unchanged + # + webhooks: + feishu_url: "" # 飞书机器人的 webhook URL(多账号用 ; 分隔) + dingtalk_url: "" # 钉钉机器人的 webhook URL(多账号用 ; 分隔) + wework_url: "" # 企业微信机器人的 webhook URL(多账号用 ; 分隔) + wework_msg_type: "markdown" # 企业微信消息类型:markdown(群机器人) 或 text(个人微信应用) + telegram_bot_token: "" # Telegram Bot Token(多账号用 ; 分隔,需与 chat_id 数量一致) + telegram_chat_id: "" # Telegram Chat ID(多账号用 ; 分隔,需与 bot_token 数量一致) + email_from: "" # 发件人邮箱地址 + email_password: "" # 发件人邮箱密码或授权码 + email_to: "" # 收件人邮箱地址,多个收件人用逗号分隔 + email_smtp_server: "" # SMTP服务器地址(可选,留空自动识别) + email_smtp_port: "" # SMTP端口(可选,留空自动识别) + ntfy_server_url: "https://ntfy.sh" # ntfy服务器地址,默认使用公共服务,可改为自托管地址 + ntfy_topic: "" # ntfy主题名称(多账号用 ; 分隔) + ntfy_token: "" # ntfy访问令牌(可选,用于私有主题,多账号用 ; 分隔) + bark_url: "" # Bark推送URL(多账号用 ; 分隔,格式:https://api.day.app/your_device_key 或自建服务器地址) + slack_webhook_url: "" # Slack Incoming Webhook URL(多账号用 ; 分隔) + +# 用于让关注度更高的新闻在更前面显示,即用算法重新组合不同平台的热搜排序形成你侧重的热搜,合起来是 1 就行 +weight: + rank_weight: 0.6 # 排名权重 + frequency_weight: 0.3 # 频次权重 + hotness_weight: 0.1 # 热度权重 + +# name 可以定义任意名称,只具有显示作用,即使项目运行了几天后,忽然改掉 name 也不会影响代码的正常运行 +# references: https://github.com/sansan0/TrendRadar/issues/95 +platforms: + - id: "toutiao" + name: "今日头条" + - id: "baidu" + name: "百度热搜" + - id: "wallstreetcn-hot" + name: "华尔街见闻" + - id: "thepaper" + name: "澎湃新闻" + - id: "bilibili-hot-search" + name: "bilibili 热搜" + - id: "cls-hot" + name: "财联社热门" + - id: "ifeng" + name: "凤凰网" + - id: "tieba" + name: "贴吧" + - id: "weibo" + name: "微博" + - id: "douyin" + name: "抖音" + - id: "zhihu" + name: "知乎" \ No newline at end of file diff --git a/apps/trendradar/4.0.2/config/frequency_words.txt b/apps/trendradar/4.0.2/config/frequency_words.txt new file mode 100644 index 0000000..9e19f69 --- /dev/null +++ b/apps/trendradar/4.0.2/config/frequency_words.txt @@ -0,0 +1,113 @@ +胖东来 +于东来 + +DeepSeek +梁文锋 + +华为 +鸿蒙 +HarmonyOS +任正非 + +比亚迪 +王传福 + +大疆 +DJI + +宇树 +王兴兴 + +智元 +灵犀 +稚晖君 +彭志辉 + +黑神话 +冯骥 + +影之刃零 +梁其伟 + +哪吒 +饺子 +杨宇 +!车 +!餐 + +三体 +流浪地球 +刘慈欣 +郭帆 + +申奥 + +京东 +刘强东 + +字节 +bytedance +张一鸣 + +特斯拉 +马斯克 + +微软 +Microsoft + +英伟达 +NVIDIA +黄仁勋 + +AMD + +谷歌 +google +gemini +deepmind + +chatgpt +openai +sora + +claude +Anthropic + +iphone +ipad +mac +ios + +ai +!gai +人工智能 + +自动驾驶 + +机器人 + +国产 +中国 + +美国 +日本 +韩国 + +芯片 +光刻机 + +科技 + +核能 + +水电站 +雅鲁藏布江 + +新质生产力 + +月球 +登月 +火星 +宇宙 +飞船 +航空 \ No newline at end of file diff --git a/apps/trendradar/4.0.2/data.yml b/apps/trendradar/4.0.2/data.yml new file mode 100644 index 0000000..ce0754b --- /dev/null +++ b/apps/trendradar/4.0.2/data.yml @@ -0,0 +1,78 @@ +additionalProperties: + formFields:additionalProperties: + formFields: + - default: 8080 + envKey: PANEL_APP_PORT_HTTP + labelZh: HTTP 端口 + labelEn: HTTP Port + label: + zh: HTTP 端口 + en: HTTP Port + description: + zh: "HTTP 端口" + en: "HTTP Port" + required: true + type: number + edit: true + rule: paramPort + - default: ./data + envKey: DATA_PATH + labelZh: 输出路径 + labelEn: Output Path + label: + zh: 输出路径 + en: Output Path + description: + zh: 生成的报告和数据保存位置 + en: Generated reports and data storage location + required: false + type: text + edit: true + - default: "*/30 * * * *" + envKey: CRON_SCHEDULE + labelZh: 定时任务表达式 + labelEn: Cron Expression + label: + zh: 定时任务表达式 + en: Cron Expression + required: false + type: text + edit: true + - default: cron + envKey: RUN_MODE + labelZh: 运行模式 + labelEn: Run Mode + label: + zh: 运行模式 + en: Run Mode + required: false + type: select + values: + - label: Cron + value: cron + - label: Once + value: once + edit: true + - default: "false" + envKey: IMMEDIATE_RUN + labelZh: 启动时立即执行一次 + labelEn: Execute immediately upon startup + label: + zh: 启动时立即执行一次 + en: Execute immediately upon startup + required: false + type: select + values: + - label: "True" + value: "true" + - label: "False" + value: "false" + edit: true + - default: "3333" + envKey: MCP_PORT + required: true + type: number + labelEn: MCP_Port + labelZh: MCP端口 + edit: true + rule: paramPort diff --git a/apps/trendradar/4.0.2/docker-compose.yml b/apps/trendradar/4.0.2/docker-compose.yml new file mode 100644 index 0000000..2e04a06 --- /dev/null +++ b/apps/trendradar/4.0.2/docker-compose.yml @@ -0,0 +1,37 @@ +services: + trend-radar: + image: wantcat/trendradar:4.0.2 + container_name: ${CONTAINER_NAME} + restart: always + ports: + - ${PANEL_APP_PORT_HTTP}:8080 + volumes: + - ../config:/app/config:ro + - ${DATA_PATH}:/app/output + environment: + - TZ=Asia/Shanghai + - CRON_SCHEDULE=${CRON_SCHEDULE} + - RUN_MODE=${RUN_MODE} + - IMMEDIATE_RUN=${IMMEDIATE_RUN} + networks: + - 1panel-network + labels: + createdBy: Apps + trend-radar-mcp: + image: wantcat/trendradar-mcp:1.1.0 + container_name: ${CONTAINER_NAME}-trend-radar-mcp + restart: always + ports: + - ${MCP_PORT}:3333 + volumes: + - ../config:/app/config:ro + - ${DATA_PATH}:/app/output + environment: + - TZ=Asia/Shanghai + networks: + - 1panel-network + labels: + createdBy: Apps +networks: + 1panel-network: + external: true diff --git a/apps/trendradar/README.md b/apps/trendradar/README.md new file mode 100644 index 0000000..69c06a9 --- /dev/null +++ b/apps/trendradar/README.md @@ -0,0 +1,69 @@ +# TrendRadar - 趋势雷达 + +一个轻量级的多平台趋势监控工具,帮助您实时跟踪各类热点话题和趋势变化。 + +## 🚀 核心功能 + +### 📊 多平台数据聚合 +- 集成 newsnow 项目 API,支持多个主流平台数据获取 +- 实时聚合热门话题和趋势数据 +- 智能数据清洗、去重和质量优化 +- 支持微博、知乎、百度等中文平台热点追踪 + +### 🤖 AI 智能分析 +- 基于人工智能的趋势分析引擎 +- 自动识别和分类热点话题 +- 趋势预测和发展评估 +- 智能关键词提取和主题归纳 +- 热度评分和趋势强度分析 + +### 📈 数据可视化 +- 直观的趋势图表和热力图展示 +- 多维度数据分析和交叉对比 +- 历史趋势回溯和预测展示 +- 交互式数据探索界面 +- 支持图表导出和分享 + +### 🔍 实时监控 +- 7×24小时持续监控和数据采集 +- 实时推送重要趋势变化通知 +- 自定义监控规则和关键词过滤 +- 异常波动检测和告警机制 +- 批量监控任务管理 + +### 💾 灵活存储架构 +- **本地存储**:SQLite数据库,完全自主可控 +- **云端存储**:支持S3兼容协议(Cloudflare R2、阿里云OSS、腾讯云COS等) +- **数据备份**:自动备份和恢复机制 +- **存储优化**:数据压缩和归档策略 + +### 🔌 多种部署方式 +- **Docker部署**:一键容器化部署,最稳定简单 +- **GitHub Actions部署**:云端自动化运行 +- **MCP客户端支持**:集成Model Context Protocol + +## 🎯 应用场景 + +- **市场研究**:跟踪行业趋势和竞争动态 +- **内容创作**:发现热门话题和创作灵感 +- **投资分析**:监控市场情绪和热点板块 +- **舆情监控**:实时了解品牌和行业动态 + +## ⚡ 核心特点 + +- **轻量部署**:最小化资源占用 +- **易用性强**:简洁直观的操作界面 +- **高可靠性**:稳定的数据获取和分析 +- **可扩展性**:支持多种部署方式 + +## 🛠️ 技术栈 + +- Python 后端开发 +- SQLite/云存储数据管理 +- AI 分析引擎 +- RESTful API 接口 +- Docker 容器化支持 + +--- + +**TrendRadar** - 让趋势洞察变得简单高效 \ No newline at end of file diff --git a/apps/trendradar/README_en.md b/apps/trendradar/README_en.md new file mode 100644 index 0000000..9777158 --- /dev/null +++ b/apps/trendradar/README_en.md @@ -0,0 +1,69 @@ +# TrendRadar - Trend Radar + +A lightweight multi-platform trend monitoring tool that helps you track various trending topics and trend changes in real-time. + +## 🚀 Core Features + +### 📊 Multi-Platform Data Aggregation +- Integrated with newsnow project API for multiple mainstream platforms +- Real-time aggregation of trending topics and data +- Intelligent data cleaning, deduplication, and quality optimization +- Support for Chinese platforms like Weibo, Zhihu, Baidu hot trends tracking + +### 🤖 AI-Powered Analysis +- AI-driven trend analysis engine +- Automatic identification and categorization of trending topics +- Trend prediction and development assessment +- Intelligent keyword extraction and topic summarization +- Heat score analysis and trend strength evaluation + +### 📈 Data Visualization +- Intuitive trend charts and heatmap displays +- Multi-dimensional data analysis and cross-comparison +- Historical trend retrospection and prediction display +- Interactive data exploration interface +- Support for chart export and sharing + +### 🔍 Real-Time Monitoring +- 7×24 continuous monitoring and data collection +- Real-time push notifications for important trend changes +- Customizable monitoring rules and keyword filtering +- Anomaly detection and alert mechanisms +- Batch monitoring task management + +### 💾 Flexible Storage Architecture +- **Local Storage**: SQLite database, fully autonomous and controllable +- **Cloud Storage**: S3-compatible protocol support (Cloudflare R2, Alibaba Cloud OSS, Tencent Cloud COS, etc.) +- **Data Backup**: Automatic backup and recovery mechanisms +- **Storage Optimization**: Data compression and archival strategies + +### 🔌 Multiple Deployment Options +- **Docker Deployment**: One-click containerized deployment, most stable and simple +- **GitHub Actions Deployment**: Cloud-based automated operation +- **MCP Client Support**: Integrated with Model Context Protocol + +## 🎯 Use Cases + +- **Market Research**: Track industry trends and competitive dynamics +- **Content Creation**: Discover trending topics and creative inspiration +- **Investment Analysis**: Monitor market sentiment and hot sectors +- **Reputation Monitoring**: Stay updated on brand and industry dynamics + +## ⚡ Core Features + +- **Lightweight Deployment**: Minimal resource footprint +- **High Usability**: Simple and intuitive interface +- **High Reliability**: Stable data acquisition and analysis +- **Scalability**: Multiple deployment options supported + +## 🛠️ Tech Stack + +- Python backend development +- SQLite/Cloud storage data management +- AI analysis engine +- RESTful API interface +- Docker containerization support + +--- + +**TrendRadar** - Making trend insights simple and efficient \ No newline at end of file diff --git a/apps/trendradar/data.yml b/apps/trendradar/data.yml new file mode 100644 index 0000000..19259fa --- /dev/null +++ b/apps/trendradar/data.yml @@ -0,0 +1,30 @@ +name: TrendRadar +tags: + - 实用工具 +title: 多平台热点推送 +description: 多平台热点推送 +additionalProperties: + key: trendradar + name: TrendRadar + tags: + - Tool + shortDescZh: 多平台热点推送 + shortDescEn: Multi-platform Hot Content Push + description: + en: Multi-platform Hot Content Push + zh: 多平台热点推送 + zh-Hant: 多平台熱點推送 + ja: マルチプラットフォームホットコンテンツプッシュ + ms: Tolakan Kandungan Panas Pelbagai Platform + pt-br: Push de Conteúdo Quente Multiplataforma + ru: Мультиплатформенная пуш-рассылка горячего контента + ko: 멀티 플랫폼 핫 콘텐츠 푸시 + type: tool + crossVersionUpdate: true + limit: 0 + website: https://github.com/sansan0/TrendRadar + github: https://github.com/sansan0/TrendRadar + document: https://github.com/sansan0/TrendRadar + architectures: + - amd64 + - arm64 diff --git a/apps/trendradar/latest/config/config.yaml b/apps/trendradar/latest/config/config.yaml new file mode 100644 index 0000000..72a61f3 --- /dev/null +++ b/apps/trendradar/latest/config/config.yaml @@ -0,0 +1,187 @@ +app: + version_check_url: "https://raw.githubusercontent.com/sansan0/TrendRadar/refs/heads/master/version" + show_version_update: true # 控制显示版本更新提示,如果 false,则不接受新版本提示 + # 时区配置(影响所有时间显示、推送窗口判断、数据存储) + # 常用时区: + # - Asia/Shanghai (北京时间 UTC+8) + # - America/New_York (美东时间 UTC-5/-4) + # - Europe/London (伦敦时间 UTC+0/+1) + # 完整时区列表: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + timezone: "Asia/Shanghai" + +# 存储配置 +storage: + # 存储后端选择: local / remote / auto + # - local: 本地 SQLite + TXT/HTML 文件 + # - remote: 远程云存储(S3 兼容协议,支持 R2/OSS/COS 等) + # - auto: 自动选择(GitHub Actions 环境且配置了远程存储则用 remote,否则用 local) + backend: "auto" + + # 数据格式选项 + formats: + sqlite: true # 主存储(必须启用) + txt: false # 是否生成 TXT 快照 + html: false # 是否生成 HTML 报告(⚠️ 邮件推送必须设为 true,否则会报错) + + # 本地存储配置 + local: + data_dir: "output" # 数据目录 + retention_days: 0 # 本地数据保留天数(0 = 不清理) + + # 远程存储配置(S3 兼容协议) + # 支持: Cloudflare R2, 阿里云 OSS, 腾讯云 COS, AWS S3, MinIO 等 + # 建议将敏感信息配置在 GitHub Secrets 或环境变量中 + remote: + # 数据保留天数(0 = 不清理远程数据) + retention_days: 0 + # S3 兼容配置 + endpoint_url: "" # 服务端点(或环境变量 S3_ENDPOINT_URL) + # Cloudflare R2: https://.r2.cloudflarestorage.com + # 阿里云 OSS: https://oss-cn-hangzhou.aliyuncs.com + # 腾讯云 COS: https://cos.ap-guangzhou.myqcloud.com + bucket_name: "" # 存储桶名称(或环境变量 S3_BUCKET_NAME) + access_key_id: "" # 访问密钥 ID(或环境变量 S3_ACCESS_KEY_ID) + secret_access_key: "" # 访问密钥(或环境变量 S3_SECRET_ACCESS_KEY) + region: "" # 区域(可选,部分服务商需要,或环境变量 S3_REGION) + + # 数据拉取配置(从远程同步到本地) + # 用于 MCP Server 等场景:爬虫存到远程,MCP 拉取到本地分析 + pull: + enabled: false # 是否启用启动时自动拉取 + days: 7 # 拉取最近 N 天的数据(0 = 不拉取) + +crawler: + request_interval: 1000 # 请求间隔(毫秒) + enable_crawler: true # 是否启用爬取新闻功能,如果 false,则直接停止程序 + use_proxy: false # 是否启用代理,false 时为关闭 + default_proxy: "http://127.0.0.1:10801" + +# 🔸 daily(当日汇总模式) +# • 推送时机:按时推送(默认每小时推送一次) +# • 显示内容:当日所有匹配新闻 + 新增新闻区域 +# • 适用场景:日报总结、全面了解当日热点趋势 +# +# 🔸 current(当前榜单模式) +# • 推送时机:按时推送(默认每小时推送一次) +# • 显示内容:当前榜单匹配新闻 + 新增新闻区域 +# • 适用场景:实时热点追踪、了解当前最火的内容 +# +# 🔸 incremental(增量监控模式) +# • 推送时机:有新增才推送 +# • 显示内容:新出现的匹配频率词新闻 +# • 适用场景:避免重复信息干扰 + +# 推送模式选择 +report: + mode: "daily" # 可选: "daily"|"incremental"|"current" + rank_threshold: 5 # 排名高亮阈值 + sort_by_position_first: false # 排序优先级:true=先按配置位置排序,false=先按热点条数排序 + max_news_per_keyword: 0 # 每个关键词最大显示数量,0=不限制 + reverse_content_order: false # 内容顺序:false=热点词汇统计在前,true=新增热点新闻在前 + +notification: + enable_notification: true # 是否启用通知功能,如果 false,则不发送手机通知 + message_batch_size: 4000 # 消息分批大小(字节)(这个配置别动) + dingtalk_batch_size: 20000 # 钉钉消息分批大小(字节)(这个配置也别动) + feishu_batch_size: 30000 # 飞书消息分批大小(字节) + bark_batch_size: 4000 # Bark消息分批大小(字节) + slack_batch_size: 4000 # Slack消息分批大小(字节) + batch_send_interval: 3 # 批次发送间隔(秒) + feishu_message_separator: "━━━━━━━━━━━━━━━━━━━" # feishu 消息分割线 + max_accounts_per_channel: 3 # 每个渠道最大账号数量,建议不超过 3 + + # 🕐 推送时间窗口控制(可选功能) + # 用途:限制推送的时间范围,避免非工作时间打扰 + # 适用场景: + # - 只想在工作日白天接收推送(如 09:00-18:00) + # - 希望在晚上固定时间收到汇总(如 20:00-22:00) + push_window: + enabled: false # 是否启用推送时间窗口控制,默认关闭 + # 注意:GitHub Actions 执行时间不稳定,时间范围建议至少留足 2 小时 + # 如果想要精准的定时推送,建议使用 Docker 部署在个人服务器上 + time_range: + start: "20:00" # 推送时间窗口开始(北京时间) + end: "22:00" # 推送时间窗口结束(北京时间) + once_per_day: true # 每天在时间窗口内只推送一次,如果 false,则窗口内每次执行都推送 + + # ⚠️⚠️⚠️ 重要安全警告 / IMPORTANT SECURITY WARNING ⚠️⚠️⚠️ + # + # 🔴 请务必妥善保管好 webhooks,不要公开!!! + # 🔴 如果你以 fork 的方式将本项目部署在 GitHub 上,请勿在下面填写任何 webhooks + # 🔴 而是将 webhooks 填入 GitHub Secret(Settings → Secrets and variables → Actions) + # 🔴 否则: + # - 轻则:手机上收到大量垃圾广告推送 + # - 重则:webhook 被滥用造成严重安全隐患(如恶意消息轰炸、钓鱼链接等) + # + # 🔴 NEVER expose webhooks publicly!!! + # 🔴 If deploying via GitHub fork, DO NOT fill webhooks below + # 🔴 Instead, add them to GitHub Secrets (Settings → Secrets and variables → Actions) + # 🔴 Consequences of exposure: + # - Minor: Spam notifications flooding your devices + # - Severe: Webhook abuse leading to security incidents (malicious messages, phishing links, etc.) + # + # ⚠️⚠️⚠️ 多账号推送说明 / MULTI-ACCOUNT PUSH NOTICE ⚠️⚠️⚠️ + # + # 🔸 多账号支持: + # • 请使用分号(;)分隔多个账号,如:"url1;url2;url3" + # • 示例:telegram_bot_token: "token1;token2" 对应 telegram_chat_id: "id1;id2" + # • 对于需要配对的配置(如 Telegram 的 token 和 chat_id),数量必须一致 + # • 每个渠道最多支持 max_accounts_per_channel 个账号(见上方配置) + # • 邮箱已支持多收件人(逗号分隔),保持不变 + # + # 🔸 Multi-Account Support: + # • Use semicolon(;) to separate multiple accounts, e.g., "url1;url2;url3" + # • Example: telegram_bot_token: "token1;token2" with telegram_chat_id: "id1;id2" + # • For paired configs (e.g., Telegram token and chat_id), quantities must match + # • Each channel supports up to max_accounts_per_channel accounts (see above config) + # • Email already supports multiple recipients (comma-separated), unchanged + # + webhooks: + feishu_url: "" # 飞书机器人的 webhook URL(多账号用 ; 分隔) + dingtalk_url: "" # 钉钉机器人的 webhook URL(多账号用 ; 分隔) + wework_url: "" # 企业微信机器人的 webhook URL(多账号用 ; 分隔) + wework_msg_type: "markdown" # 企业微信消息类型:markdown(群机器人) 或 text(个人微信应用) + telegram_bot_token: "" # Telegram Bot Token(多账号用 ; 分隔,需与 chat_id 数量一致) + telegram_chat_id: "" # Telegram Chat ID(多账号用 ; 分隔,需与 bot_token 数量一致) + email_from: "" # 发件人邮箱地址 + email_password: "" # 发件人邮箱密码或授权码 + email_to: "" # 收件人邮箱地址,多个收件人用逗号分隔 + email_smtp_server: "" # SMTP服务器地址(可选,留空自动识别) + email_smtp_port: "" # SMTP端口(可选,留空自动识别) + ntfy_server_url: "https://ntfy.sh" # ntfy服务器地址,默认使用公共服务,可改为自托管地址 + ntfy_topic: "" # ntfy主题名称(多账号用 ; 分隔) + ntfy_token: "" # ntfy访问令牌(可选,用于私有主题,多账号用 ; 分隔) + bark_url: "" # Bark推送URL(多账号用 ; 分隔,格式:https://api.day.app/your_device_key 或自建服务器地址) + slack_webhook_url: "" # Slack Incoming Webhook URL(多账号用 ; 分隔) + +# 用于让关注度更高的新闻在更前面显示,即用算法重新组合不同平台的热搜排序形成你侧重的热搜,合起来是 1 就行 +weight: + rank_weight: 0.6 # 排名权重 + frequency_weight: 0.3 # 频次权重 + hotness_weight: 0.1 # 热度权重 + +# name 可以定义任意名称,只具有显示作用,即使项目运行了几天后,忽然改掉 name 也不会影响代码的正常运行 +# references: https://github.com/sansan0/TrendRadar/issues/95 +platforms: + - id: "toutiao" + name: "今日头条" + - id: "baidu" + name: "百度热搜" + - id: "wallstreetcn-hot" + name: "华尔街见闻" + - id: "thepaper" + name: "澎湃新闻" + - id: "bilibili-hot-search" + name: "bilibili 热搜" + - id: "cls-hot" + name: "财联社热门" + - id: "ifeng" + name: "凤凰网" + - id: "tieba" + name: "贴吧" + - id: "weibo" + name: "微博" + - id: "douyin" + name: "抖音" + - id: "zhihu" + name: "知乎" \ No newline at end of file diff --git a/apps/trendradar/latest/config/frequency_words.txt b/apps/trendradar/latest/config/frequency_words.txt new file mode 100644 index 0000000..9e19f69 --- /dev/null +++ b/apps/trendradar/latest/config/frequency_words.txt @@ -0,0 +1,113 @@ +胖东来 +于东来 + +DeepSeek +梁文锋 + +华为 +鸿蒙 +HarmonyOS +任正非 + +比亚迪 +王传福 + +大疆 +DJI + +宇树 +王兴兴 + +智元 +灵犀 +稚晖君 +彭志辉 + +黑神话 +冯骥 + +影之刃零 +梁其伟 + +哪吒 +饺子 +杨宇 +!车 +!餐 + +三体 +流浪地球 +刘慈欣 +郭帆 + +申奥 + +京东 +刘强东 + +字节 +bytedance +张一鸣 + +特斯拉 +马斯克 + +微软 +Microsoft + +英伟达 +NVIDIA +黄仁勋 + +AMD + +谷歌 +google +gemini +deepmind + +chatgpt +openai +sora + +claude +Anthropic + +iphone +ipad +mac +ios + +ai +!gai +人工智能 + +自动驾驶 + +机器人 + +国产 +中国 + +美国 +日本 +韩国 + +芯片 +光刻机 + +科技 + +核能 + +水电站 +雅鲁藏布江 + +新质生产力 + +月球 +登月 +火星 +宇宙 +飞船 +航空 \ No newline at end of file diff --git a/apps/trendradar/latest/data.yml b/apps/trendradar/latest/data.yml new file mode 100644 index 0000000..ce0754b --- /dev/null +++ b/apps/trendradar/latest/data.yml @@ -0,0 +1,78 @@ +additionalProperties: + formFields:additionalProperties: + formFields: + - default: 8080 + envKey: PANEL_APP_PORT_HTTP + labelZh: HTTP 端口 + labelEn: HTTP Port + label: + zh: HTTP 端口 + en: HTTP Port + description: + zh: "HTTP 端口" + en: "HTTP Port" + required: true + type: number + edit: true + rule: paramPort + - default: ./data + envKey: DATA_PATH + labelZh: 输出路径 + labelEn: Output Path + label: + zh: 输出路径 + en: Output Path + description: + zh: 生成的报告和数据保存位置 + en: Generated reports and data storage location + required: false + type: text + edit: true + - default: "*/30 * * * *" + envKey: CRON_SCHEDULE + labelZh: 定时任务表达式 + labelEn: Cron Expression + label: + zh: 定时任务表达式 + en: Cron Expression + required: false + type: text + edit: true + - default: cron + envKey: RUN_MODE + labelZh: 运行模式 + labelEn: Run Mode + label: + zh: 运行模式 + en: Run Mode + required: false + type: select + values: + - label: Cron + value: cron + - label: Once + value: once + edit: true + - default: "false" + envKey: IMMEDIATE_RUN + labelZh: 启动时立即执行一次 + labelEn: Execute immediately upon startup + label: + zh: 启动时立即执行一次 + en: Execute immediately upon startup + required: false + type: select + values: + - label: "True" + value: "true" + - label: "False" + value: "false" + edit: true + - default: "3333" + envKey: MCP_PORT + required: true + type: number + labelEn: MCP_Port + labelZh: MCP端口 + edit: true + rule: paramPort diff --git a/apps/trendradar/latest/docker-compose.yml b/apps/trendradar/latest/docker-compose.yml new file mode 100644 index 0000000..0bc9d76 --- /dev/null +++ b/apps/trendradar/latest/docker-compose.yml @@ -0,0 +1,37 @@ +services: + trend-radar: + image: wantcat/trendradar:latest + container_name: ${CONTAINER_NAME} + restart: always + ports: + - ${PANEL_APP_PORT_HTTP}:8080 + volumes: + - ../config:/app/config:ro + - ${DATA_PATH}:/app/output + environment: + - TZ=Asia/Shanghai + - CRON_SCHEDULE=${CRON_SCHEDULE} + - RUN_MODE=${RUN_MODE} + - IMMEDIATE_RUN=${IMMEDIATE_RUN} + networks: + - 1panel-network + labels: + createdBy: Apps + trend-radar-mcp: + image: wantcat/trendradar-mcp:latest + container_name: ${CONTAINER_NAME}-trend-radar-mcp + restart: always + ports: + - ${MCP_PORT}:3333 + volumes: + - ../config:/app/config:ro + - ${DATA_PATH}:/app/output + environment: + - TZ=Asia/Shanghai + networks: + - 1panel-network + labels: + createdBy: Apps +networks: + 1panel-network: + external: true diff --git a/apps/trendradar/logo.png b/apps/trendradar/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b18cae35981a684bfdd8343e09478e6ecf4fddd3 GIT binary patch literal 57746 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 literal 0 HcmV?d00001