Content
> ## ⚠️ Important Announcement (December 2025)
>
> Due to the surge in the number of Forks, GitHub has contacted me, indicating that the current operation mode is putting pressure on the server. **This project and all Forks may experience access difficulties.**
>
> - ✅ **Recommended**: [Docker Deployment](#6-docker-部署) (data stored locally, no restrictions)
> - ❌ **Suspended**: Fork Deployment, GitHub Actions, GitHub Pages
>
> <details>
> <summary>👉 Click to see details</summary>
>
> **Issue Description:**
> - The original design used GitHub Actions to periodically fetch news and save it to the repository, effectively treating GitHub as a "cloud database."
> - With a large number of Forks running simultaneously, the server cannot handle the load, and the GitHub engineering team is working on a fix.
>
> **Future Plans:**
> - Explore new solutions: retain Actions for fetching and pushing, but no longer save data to the repository, instead using external storage.
>
> Thank you for your understanding! For feedback on issues: [Issues](https://github.com/sansan0/TrendRadar/issues) or WeChat public account.
>
> </details>
>
<div align="center" id="trendradar">
<a href="https://github.com/sansan0/TrendRadar" title="TrendRadar">
<img src="/_image/banner.webp" alt="TrendRadar Banner" width="80%">
</a>
🚀 The hottest assistant that can be deployed in as little as <strong>30 seconds</strong> — Say goodbye to ineffective scrolling and only see the news you truly care about.
<a href="https://trendshift.io/repositories/14726" target="_blank"><img src="https://trendshift.io/api/badge/repositories/14726" alt="sansan0%2FTrendRadar | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
<a href="https://share.302.ai/mEOUzG" target="_blank" title="One-stop AI model and API platform"><img src="_image/302ai.png" alt="302.AI logo" height="50"/></a>
<a href="https://shandianshuo.cn" target="_blank" title="AI voice input, 4 times faster than typing ⚡"><img src="_image/shandianshuo.png" alt="闪电说 logo" height="51"/></a>
[](https://github.com/sansan0/TrendRadar/stargazers)
[](https://github.com/sansan0/TrendRadar/network/members)
[](LICENSE)
[](https://github.com/sansan0/TrendRadar)
[](https://github.com/sansan0/TrendRadar)
[](https://work.weixin.qq.com/)
[](https://weixin.qq.com/)
[](https://telegram.org/)
[](#)
[](https://www.feishu.cn/)
[](#)
[](https://github.com/binwiederhier/ntfy)
[](https://github.com/Finb/Bark)
[](https://slack.com/)
[](https://github.com/sansan0/TrendRadar)
[](https://sansan0.github.io/TrendRadar)
[](https://hub.docker.com/r/wantcat/trendradar)
[](https://modelcontextprotocol.io/)
</div>
<div align="center">
**中文** | **[English](README-EN.md)**
</div>
> This project aims for lightweight and easy deployment.
<details>
<summary>⚠️ Click to expand: <strong>Fork Guidelines: Document Updates, Resource Limitations, and Deployment Suggestions</strong></summary>
<br>
**📄 Document Version Note:**
If you are using this project via **Fork**, you may be seeing an outdated version of the document. This is because the document version is copied at the time of Forking, but the original project may have been updated.
**👉 [Click here to view the latest official documentation](https://github.com/sansan0/TrendRadar?tab=readme-ov-file)**
**How to tell?** Check the repository address at the top of the page:
- `github.com/your_username/TrendRadar` ← the version you forked
- `github.com/sansan0/TrendRadar` ← the latest official version
---
**🛡️ Resource Limitations and Security Tips:**
GitHub provides limited Actions resources for each account. To avoid being flagged for abuse and facing the risk of account suspension, please note:
- **Number of Monitoring Platforms**: It is recommended to keep it around **10**, as too many platforms will consume more resources.
- **Execution Frequency**: The shortest interval is recommended to be **30 minutes**, as more frequent execution is not meaningful.
- **Reasonable Use**: GitHub Actions is suitable for lightweight scheduled tasks, rather than high-frequency crawlers.
💡 **Want to use it more freely?** We recommend [🐳 Docker Deployment](#6-docker-部署) to run it on your own server.
## 📑 Quick Navigation
<div align="center">
| [🚀 Quick Start](#-quick-start) | [🤖 AI Intelligent Analysis](#-ai-intelligent-analysis) | [⚙️ Configuration Details](#configuration-details) | [📝 Changelog](#-changelog) | [❓ Q&A and Communication](#q-a-and-communication) |
|:---:|:---:|:---:|:---:|:---:|
| [🐳 Docker Deployment](#6-docker-deployment) | [🔌 MCP Client](#-mcp-client) | [📚 Project Related](#-project-related) | [🪄 Sponsors](#-sponsors) | |
</div>
- Thanks to the contributors for their **patient bug feedback**; every piece of feedback makes the project better 😉;
- Thanks to the audience who **starred the project**; **fork** as you wish, **star** as you wish, having both is the best support for the open-source spirit 😍;
- Thanks to the readers who **followed the [public account](#q-a-and-communication)**; your comments, likes, shares, and recommendations make the content more engaging 😎.
<details>
<summary>👉 Click to expand: <strong>Acknowledgment List</strong> (Currently <strong>🔥73🔥</strong> people)</summary>
### Infrastructure Support
Thanks to the infrastructure provided for free by **GitHub**, this project can be conveniently run with a **one-click fork**.
### Data Support
This project uses the API of the [newsnow](https://github.com/ourongxing/newsnow) project to obtain multi-platform data. Special thanks to the author for providing this service.
After contacting the author, he stated that there is no need to worry about server pressure, but this is based on his goodwill and trust. Please everyone:
- **Go to the [newsnow project](https://github.com/ourongxing/newsnow) and give it a star to show your support**
- When deploying with Docker, please control the push frequency reasonably and do not over-exploit the resources.
### Promotion Support
> Thanks to the following platforms and individuals for their recommendations (in chronological order)
- [Small Software](https://mp.weixin.qq.com/s/fvutkJ_NPUelSW9OGK39aA) - Open source software recommendation platform
- [LinuxDo Community](https://linux.do/) - A gathering place for tech enthusiasts
- [Ruan Yifeng Weekly](https://github.com/ruanyf/weekly) - An influential weekly in the tech circle
### Audience Support
> Thanks to the friends who **provided financial support**, your generosity has transformed into snacks and drinks by the keyboard, accompanying every iteration of the project.
>
> **"One Yuan Like" has been paused**. If you still wish to support the author, you can go to the bottom of the [public account](#问题答疑与交流) article and click "Like the Author".
>
> To the friend with the cute cat avatar, I don't know which corner you found my payment code from, but I received your 1.8 in three consecutive donations. Thank you for your kindness!
| Liker | Amount | Date | Remarks |
| :-------------------------: | :----: | :------: | :-----------------------: |
| D*5 | 1.8 * 3 | 2025.11.24 | |
| *鬼 | 1 | 2025.11.17 | |
| *超 | 10 | 2025.11.17 | |
| R*w | 10 | 2025.11.17 | This agent is amazing, bro |
| J*o | 1 | 2025.11.17 | Thanks for the open source, wish you success |
| *晨 | 8.88 | 2025.11.16 | The project is good, studying it |
| *海 | 1 | 2025.11.15 | |
| *德 | 1.99 | 2025.11.15 | |
| *疏 | 8.8 | 2025.11.14 | Thanks for the open source, the project is great, supporting it |
| M*e | 10 | 2025.11.14 | Open source is not easy, thank you for your hard work |
| **柯 | 1 | 2025.11.14 | |
| *云 | 88 | 2025.11.13 | Good project, thanks for the open source |
| *W | 6 | 2025.11.13 | |
| *凯 | 1 | 2025.11.13 | |
| 对*. | 1 | 2025.11.13 | Thanks for your TrendRadar |
| s*y | 1 | 2025.11.13 | |
| **翔 | 10 | 2025.11.13 | Good project, wish I had found it sooner, thanks for the open source! |
| *韦 | 9.9 | 2025.11.13 | TrendRadar is awesome, treat the teacher to coffee~ |
| h*p | 5 | 2025.11.12 | Support Chinese open source, keep it up! |
| c*r | 6 | 2025.11.12 | |
| a*n | 5 | 2025.11.12 | |
| 。*c | 1 | 2025.11.12 | Thanks for the open source sharing |
| *记 | 1 | 2025.11.11 | |
| *主 | 1 | 2025.11.10 | |
| *了 | 10 | 2025.11.09 | |
| *杰 | 5 | 2025.11.08 | |
| *点 | 8.80 | 2025.11.07 | Development is not easy, supporting it. |
| Q*Q | 6.66 | 2025.11.07 | Thanks for the open source! |
| C*e | 1 | 2025.11.05 | |
| Peter Fan | 20 | 2025.10.29 | |
| M*n | 1 | 2025.10.27 | Thanks for the open source |
| *许 | 8.88 | 2025.10.23 | Teacher, I'm a newbie, I've been trying for a few days but still can't get it working, seeking advice |
| Eason | 1 | 2025.10.22 | Still haven't figured it out, but you're doing a good thing |
| P*n | 1 | 2025.10.20 | |
| *杰 | 1 | 2025.10.19 | |
| *徐 | 1 | 2025.10.18 | |
| *志 | 1 | 2025.10.17 | |
| *😀 | 10 | 2025.10.16 | Like |
| **杰 | 10 | 2025.10.16 | |
| *啸 | 10 | 2025.10.16 | |
| *纪 | 5 | 2025.10.14 | TrendRadar |
| J*d | 1 | 2025.10.14 | Thanks for your tool, it's fun... |
| *H | 1 | 2025.10.14 | |
| 那*O | 10 | 2025.10.13 | |
| *圆 | 1 | 2025.10.13 | |
| P*g | 6 | 2025.10.13 | |
| Ocean | 20 | 2025.10.12 | ...it's really amazing!!! Even a newbie can use it directly... |
| **培 | 5.2 | 2025.10.2 | github-yzyf1312: Long live open source |
| *椿 | 3 | 2025.9.23 | Keep it up, very good |
| *🍍 | 10 | 2025.9.21 | |
| E*f | 1 | 2025.9.20 | |
| *记 | 1 | 2025.9.20 | |
| z*u | 2 | 2025.9.19 | |
| **昊 | 5 | 2025.9.17 | |
| *号 | 1 | 2025.9.15 | |
| T*T | 2 | 2025.9.15 | Like |
| *家 | 10 | 2025.9.10 | |
| *X | 1.11 | 2025.9.3 | |
| *飙 | 20 | 2025.8.31 | Thanks from the old friend |
| *下 | 1 | 2025.8.30 | |
| 2*D | 88 | 2025.8.13 PM | |
| 2*D | 1 | 2025.8.13 AM | |
| S*o | 1 | 2025.8.05 | Support |
| *侠 | 10 | 2025.8.04 | |
| x*x | 2 | 2025.8.03 | trendRadar good project, like |
| *远 | 1 | 2025.8.01 | |
| *邪 | 5 | 2025.8.01 | |
| *梦 | 0.1 | 2025.7.30 | |
| **龙 | 10 | 2025.7.29 | Support |
</details>
<br>
## ✨ Core Features
### **Global Hotspot Aggregation**
- Zhihu
- Douyin
- bilibili Hot Search
- Wall Street News
- Tieba
- Baidu Hot Search
- Caixin Hot Topics
- The Paper
- Phoenix Network
- Toutiao
- Weibo
By default, 11 mainstream platforms are monitored, and additional platforms can be added as needed.
> 💡 For detailed configuration instructions, see [Configuration Details - Platform Configuration](#1-平台配置)
### **Smart Push Strategy**
**Three Push Modes**:
| Mode | Applicable Scenarios | Push Features |
|------|---------------------|---------------|
| **Daily Summary** (当日汇总) | Enterprise managers/regular users | Pushes all matching news of the day on time (will include previously pushed news) |
| **Current List** (当前榜单) | Self-media individuals/content creators | Pushes current list matching news on time (appears every time it remains on the list) |
| **Incremental Monitoring** (增量监控) | Investors/traders | Only pushes new content, zero duplicates |
> 💡 **Quick Selection Guide:**
> - 🔄 Don't want to see duplicate news → Use `incremental` (增量监控)
> - 📊 Want to see the complete list trend → Use `current` (当前榜单)
> - 📝 Need a daily summary report → Use `daily` (当日汇总)
>
> For detailed comparisons and configuration tutorials, see [Configuration Details - Push Mode Explanation](#3-推送模式详解)
**Additional Features** (optional):
| Feature | Description | Default |
|---------|-------------|---------|
| **Push Time Window Control** (推送时间窗口控制) | Set the push time range (e.g., 09:00-18:00) to avoid disturbances during non-working hours | Off |
| **Content Order Configuration** (内容顺序配置) | Adjust the display order of "Hot Keyword Statistics" and "New Hot News" (added in v3.5.0) | Statistics first |
> 💡 For detailed configuration tutorials, see [Configuration Details - Report Configuration](#7-报告配置) and [Configuration Details - Push Time Window](#8-推送时间窗口配置)
### **Precise Content Filtering**
Set personal keywords (e.g., AI, BYD, education policy) to only push relevant hot topics and filter out unrelated information.
**Basic Syntax** (5 types):
- Ordinary words: Basic matching
- Must-have words `+`: Limit the scope
- Exclusion words `!`: Filter out distractions
- Quantity limit `@`: Control the display quantity (added in v3.2.0)
- Global filter `[GLOBAL_FILTER]`: Globally exclude specified content (added in v3.5.0)
**Advanced Features** (added in v3.2.0):
- 🔢 **Keyword Sorting Control**: Prioritize by popularity or configured order
- 📊 **Precise Display Quantity Limitation**: Global configuration + individual configuration, flexibly control the length of pushes
**Phrase Management**:
- Separate with blank lines to independently count hot topics of different themes
> 💡 **Basic Configuration Tutorial**: [Keyword Configuration - Basic Syntax](#关键词基础语法)
>
> 💡 **Advanced Configuration Tutorial**: [Keyword Configuration - Advanced Configuration](#关键词高级配置)
>
> 💡 You can also choose not to filter and push all hot topics completely (leave frequency_words.txt empty)
### **Hot Trend Analysis**
Real-time tracking of news popularity changes allows you to not only know "what is trending," but also understand "how trends evolve."
- **Timeline Tracking**: Records the complete time span from the first appearance to the last appearance of each news item.
- **Popularity Changes**: Statistics on the ranking changes and frequency of news appearances over different time periods.
- **New Detection**: Real-time identification of newly emerging hot topics, marked with 🆕 for immediate alerts.
- **Sustainability Analysis**: Distinguishes between one-time hot topics and in-depth news that continues to ferment.
- **Cross-Platform Comparison**: Analyzes the ranking performance of the same news across different platforms to reveal differences in media attention.
> 💡 For push format details, see [Configuration Details - Push Format Reference](#5-推送格式参考)
### **Personalized Hotspot Algorithm**
No longer swayed by the algorithms of various platforms, TrendRadar will reorganize the trending searches across the internet:
- **Emphasizing high-ranking news** (60%): News from the top few rankings on each platform is prioritized
- **Focusing on recurring topics** (30%): News that appears repeatedly is considered more important
- **Considering ranking quality** (10%): Not only does it appear multiple times, but it also often ranks at the top
> 💡 These three proportions can be adjusted. For details, see [Configuration Details - Hotspot Weight Adjustment](#4-热点权重调整)
### **Multi-Channel Real-Time Push**
Supports **WeChat Work** (+ WeChat push solution), **Feishu**, **DingTalk**, **Telegram**, **Email**, **ntfy**, **Bark**, **Slack**, delivering messages directly to mobile phones and email.
**📌 Multi-Account Push Instructions (New in v3.5.0):**
- ✅ **Supports Multi-Account Configuration**: All push channels (Feishu, DingTalk, WeChat Work, Telegram, ntfy, Bark, Slack) support configuring multiple accounts.
- ✅ **Configuration Method**: Separate multiple account values using English semicolon `;`.
- ✅ **Example**: For `FEISHU_WEBHOOK_URL`, the Secret value should be filled in as `https://webhook1;https://webhook2`.
- ⚠️ **Pairing Configuration**: Telegram and ntfy need to ensure that the number of paired parameters is consistent (e.g., both token and chat_id must be 2).
- ⚠️ **Quantity Limit**: By default, each channel supports a maximum of 3 accounts; exceeding this limit will result in truncation.
### **Multi-Platform Adaptation**
- **GitHub Pages**: Automatically generates beautiful web reports, compatible with PC/mobile devices
- **Docker Deployment**: Supports multi-architecture containerized operation
- **Data Persistence**: Saves historical records in multiple formats including HTML/TXT
### **AI Intelligent Analysis (New in v3.0.0)**
An AI dialogue analysis system based on the MCP (Model Context Protocol) protocol, allowing you to deeply mine news data using natural language.
- **Conversational Queries**: Ask questions in natural language, such as "Query yesterday's trending topics on Zhihu" or "Analyze the recent popularity trend of Bitcoin."
- **13 Analysis Tools**: Covering basic queries, intelligent retrieval, trend analysis, data insights, sentiment analysis, and more.
- **Multi-client Support**: Cherry Studio (GUI configuration), Claude Desktop, Cursor, Cline, etc.
- **Deep Analysis Capabilities**:
- Topic trend tracking (popularity changes, lifecycle, viral detection, trend prediction)
- Cross-platform data comparison (activity statistics, keyword co-occurrence)
- Intelligent summary generation, similar news search, historical association retrieval
> **💡 Usage Tip**: AI features require local news data support.
> - The project comes with **November 1-15** test data for immediate experience.
> - It is recommended to deploy and run the project yourself to obtain more real-time data.
>
> See [AI Intelligent Analysis](#-ai-智能分析) for more details.
### **Zero Technical Barrier Deployment**
You can use it with a one-click Fork on GitHub, no programming background required.
> 30-second deployment: GitHub Pages (web browsing) supports one-click saving as an image, ready to share with others at any time.
>
> 1-minute deployment: WeChat Work (mobile notifications)
**💡 Tip:** Want a web version with **real-time updates**? After forking, go to your repository Settings → Pages, and enable GitHub Pages. [Preview](https://sansan0.github.io/TrendRadar/).
### **Reduce APP Dependency**
From "being kidnapped by algorithm recommendations" to "actively obtaining the information you want"
**Target Audience:** Investors, self-media individuals, corporate public relations, ordinary users concerned about current events
**Typical Scenarios:** Stock market investment monitoring, brand public opinion tracking, industry trend observation, acquiring life information
| Github Pages Effect (mobile adaptation, email push effect) | Feishu Push Effect |
|:---:|:---:|
|  |  |
<br>
## 📝 Changelog
>**Upgrade Instructions**:
- **📌 View Latest Updates**: **[Original Repository Changelog](https://github.com/sansan0/TrendRadar?tab=readme-ov-file#-changelog)**
- **Note**: Do not update this project via **Sync fork**, it is recommended to check the 【Historical Updates】 for specific 【Upgrade Methods】 and 【Feature Content】.
- **Minor Version Update**: To upgrade from v2.x to v2.y, replace the corresponding file in your forked repository with the `main.py` code from this project.
- **Major Version Upgrade**: To upgrade from v1.x to v2.y, it is recommended to delete the existing fork and re-fork, as this is more efficient and avoids configuration conflicts.
### 2025/12/03 - v3.5.0
**🎉 Core Feature Enhancements**
1. **Multi-account Push Support**
- All push channels (Feishu, DingTalk, WeChat Work, Telegram, ntfy, Bark, Slack) support multi-account configuration
- Use a semicolon `;` to separate multiple accounts, for example: `FEISHU_WEBHOOK_URL=url1;url2`
- Automatically verify the consistency of paired configurations (such as Telegram's token and chat_id) in quantity
2. **Configurable Push Content Order**
- Added `reverse_content_order` configuration item
- Supports custom display order for hot word statistics and newly added hot news
3. **Global Filter Keywords**
- Added `[GLOBAL_FILTER]` area marker, supporting global filtering of unwanted content
- Applicable scenarios: filtering advertisements, marketing, low-quality content, etc.
**🐳 Docker Dual-path HTML Generation Optimization**
- **Bug Fixes**: Resolved the issue of `index.html` not syncing to the host machine in the Docker environment
- **Dual-path Generation**: Daily summary HTML is generated in two locations simultaneously
- `index.html` (project root directory): for GitHub Pages access
- `output/index.html`: accessible directly from the host machine via Docker Volume mount
- **Compatibility**: Ensures that Docker, GitHub Actions, and local running environments can all access the web version of the report normally
**🐳 Docker MCP Image Support**
- Added a standalone MCP service image `wantcat/trendradar-mcp`
- Supports Docker deployment of AI analysis features, providing services through HTTP interface (port 3333)
- Dual-container architecture: news push service and MCP service run independently, allowing for separate scaling and restarting
- See [Docker Deployment - MCP Service](#6-docker-部署) for details
**🌐 Web Server Support**
- Added a built-in web server, supporting access to generated reports via a browser
- Control start/stop through the `manage.py` command: `docker exec -it trend-radar python manage.py start_webserver`
- Access address: `http://localhost:8080` (port configurable)
- Security features: static file service, directory restrictions, local access
- Supports both automatic startup and manual control modes
**📖 Documentation Optimization**
- Added [Report Configuration](#7-报告配置) section: detailed explanation of report-related parameters
- Added [Push Time Window Configuration](#8-推送时间窗口配置) section: push_window configuration tutorial
- Added [Execution Frequency Configuration](#9-执行频率配置) section: explanation of Cron expressions and common examples
- Added [Multi-account Push Configuration](#10-多账号推送配置) section: detailed explanation of multi-account push configuration
- Optimized each configuration section: unified addition of "configuration location" explanations
- Simplified quick start configuration instructions: three core files are clear at a glance
- Optimized [Docker Deployment](#6-docker-部署) section: added image description, recommended git clone deployment, reorganized deployment methods
**🔧 Upgrade Notes**:
- **GitHub Fork Users**: Update `main.py`, `config/config.yaml` (new multi-account push support, no need to modify existing configurations)
- **Multi-account Push**: New feature, disabled by default, existing single-account configurations remain unaffected
### 2025/11/26 - mcp-v1.0.3
**MCP Module Updates:**
- Added date parsing tool resolve_date_range to address inconsistencies in date calculations by the AI model
- Supports parsing of natural language date expressions (this week, last 7 days, last month, etc.)
- Total number of tools increased from 13 to 14
<details>
<summary>👉 Click to expand: <strong>Historical Updates</strong></summary>
### 2025/11/28 - v3.4.1
**🔧 Format Optimization**
1. **Bark Push Enhancement**
- Bark now supports Markdown rendering
- Enables native Markdown format: bold, links, lists, code blocks, etc.
- Removed plain text conversion to fully utilize Bark's native rendering capabilities
2. **Slack Format Precision**
- Uses dedicated mrkdwn format to handle batched content
- Improves byte size estimation accuracy (avoids message overflow)
- Optimizes link format: `<url|text>` and bold syntax: `*text*`
3. **Performance Improvement**
- Format conversion is completed during the batching process to avoid secondary processing
- Accurately estimates message size, reducing the failure rate of sending
**🔧 Upgrade Instructions**:
- **GitHub Fork Users**: Update `main.py`, `config.yaml`
### 2025/11/25 - v3.4.0
**🎉 New Slack Push Support**
1. **Team Collaboration Push Channel**
- Supports Slack Incoming Webhooks (a globally popular team collaboration tool)
- Centralized message management, suitable for team sharing of hot news
- Supports mrkdwn format (bold, links, etc.)
2. **Multiple Deployment Methods**
- GitHub Actions: Configure `SLACK_WEBHOOK_URL` Secret
- Docker: Environment variable `SLACK_WEBHOOK_URL`
- Local Run: `config/config.yaml` configuration file
> 📖 **Detailed Configuration Tutorial**: [Quick Start - Slack Push](#-quick-start)
- Optimized the one-click installation experience of MCP with setup-windows.bat and setup-windows-en.bat
**🔧 Upgrade Notes**:
- **GitHub Fork Users**: Update `main.py`, `config/config.yaml`, `.github/workflows/crawler.yml`
### 2025/11/24 - v3.3.0
**🎉 New Bark Push Support**
1. **iOS Exclusive Push Channel**
- Supports Bark push (based on APNs, iOS platform)
- Free and open-source, simple and efficient, no ad interference
- Supports both official server and self-hosted server options
2. **Multiple Deployment Methods**
- GitHub Actions: Configure `BARK_URL` Secret
- Docker: Environment variable `BARK_URL`
- Local Run: `config/config.yaml` configuration file
> 📖 **Detailed Configuration Tutorial**: [Quick Start - Bark Push](#-quick-start)
**🐛 Bug Fixes**
- Fixed the issue where `ntfy_server_url` configuration in `config.yaml` was not effective ([#345](https://github.com/sansan0/TrendRadar/issues/345))
**🔧 Upgrade Instructions**:
- **GitHub Fork Users**: Update `main.py`, `config/config.yaml`, `.github/workflows/crawler.yml`
### 2025/11/23 - v3.2.0
**🎯 New Advanced Customization Features**
1. **Keyword Sorting Priority Configuration**
- Supports two sorting strategies: Hotness Priority vs Configuration Order Priority
- Meets different usage scenarios: Hotspot Tracking or Personalized Attention
2. **Precise Control of Display Quantity**
- Global Configuration: Uniformly limit the display quantity of all keywords
- Individual Configuration: Use `@number` syntax to set limits for specific keywords
- Effectively control push length, highlighting key content
> 📖 **Detailed Configuration Tutorial**: [Keyword Configuration - Advanced Configuration](#关键词高级配置)
**🔧 Upgrade Notes**:
- **GitHub Fork Users**: Update `main.py`, `config/config.yaml`
### 2025/11/18 - mcp-v1.0.2
**MCP Module Updates:**
- Optimized the situation where querying today's news might incorrectly return past dates.
### 2025/11/22 - v3.1.1
- **Fixed crash issue caused by data anomalies**: Resolved the `'float' object has no attribute 'lower'` error encountered by some users in the GitHub Actions environment.
- Added dual protection mechanism: Filter out invalid titles (None, float, empty strings) during the data retrieval phase, and added type checks at function call sites.
- Improved system stability to ensure normal operation even when the data source returns an abnormal format.
**Upgrade Instructions** (for GitHub Fork users):
- Mandatory update: `main.py`
- It is recommended to use a minor version upgrade method: copy and replace the above file.
### 2025/11/20 - v3.1.0
- **New support for personal WeChat push**: Corporate WeChat applications can push to personal WeChat without the need to install the Corporate WeChat APP.
- Supports two message formats: `markdown` (Corporate WeChat group bot) and `text` (personal WeChat application).
- Added `WEWORK_MSG_TYPE` environment variable configuration, supporting various deployment methods such as GitHub Actions, Docker, docker-compose, etc.
- The `text` mode automatically removes Markdown syntax, providing a pure text push effect.
- For details, see the configuration instructions for "Personal WeChat Push" in the Quick Start section.
**Upgrade Instructions** (for GitHub Fork users):
- Mandatory updates: `main.py`, `config/config.yaml`
- Optional updates: `.github/workflows/crawler.yml` (if using GitHub Actions for deployment)
- It is recommended to use a minor version upgrade method: copy and replace the above files.
### 2025/11/12 - v3.0.5
- Fixed the logical error in the SSL/TLS port configuration for email sending
- Optimized the default use of port 465 (SSL) for email service providers (QQ/163/126)
- **Added support for Docker environment variables**: Core configuration items (`enable_crawler`, `report_mode`, `push_window`, etc.) can now be overridden by environment variables, resolving the issue where NAS users' modifications to the configuration file do not take effect (see [🐳 Docker Deployment](#-docker-部署) section)
### 2025/10/26 - mcp-v1.0.1
**MCP Module Updates:**
- Fixed the error in passing date query parameters
- Unified the time parameter format across all tools
### 2025/10/31 - v3.0.4
- Fixed the error caused by Feishu (Lark) due to overly long push content, implementing batch push.
### 2025/10/23 - v3.0.3
- Expanded the display range of ntfy error messages
### 2025/10/21 - v3.0.2
- Fix ntfy push encoding issue
### 2025/10/20 - v3.0.0
**Major Update - AI Analysis Feature Launched** 🤖
- **Core Features**:
- Added AI analysis server based on MCP (Model Context Protocol)
- Supports 13 intelligent analysis tools: Basic Query, Intelligent Retrieval, Advanced Analysis, System Management
- Natural language interaction: Query and analyze news data through conversational methods
- Multi-client support: Claude Desktop, Cherry Studio, Cursor, Cline, etc.
- **Analysis Capabilities**:
- Topic trend analysis (popularity tracking, lifecycle, viral detection, trend prediction)
- Data insights (platform comparison, activity statistics, keyword co-occurrence)
- Sentiment analysis, similar news finding, intelligent summary generation
- Historical news retrieval, multi-modal search
- **Update Notes**:
- This is a standalone AI analysis feature that does not affect existing push functionalities
- Optional use, no need to upgrade existing deployments
### 2025/10/15 - v2.4.4
- **Update Content**:
- Fix ntfy push encoding issue + 1
- Fix push time window judgment issue
- **Update Reminder**:
- Recommended for [minor version upgrade]
### 2025/10/10 - v2.4.3
> Thanks to [nidaye996](https://github.com/sansan0/TrendRadar/issues/98) for identifying the experience issue.
- **Update Content**:
- Refactored "静默推送模式" (Silent Push Mode) to "推送时间窗口控制" (Push Time Window Control) to enhance functionality understanding.
- Clarified that the push time window is an optional additional feature that can be used in conjunction with three push modes.
- Improved comments and documentation descriptions for clearer functionality positioning.
- **Update Notice**:
- This is merely a refactor, and upgrading is not necessary.
### 2025/10/8 - v2.4.2
- **Update Content**:
- Fixed ntfy push encoding issue
- Fixed missing configuration file issue
- Optimized ntfy push effect
- Added segmented image export feature for GitHub Pages
- **Update Reminder**:
- It is recommended to use [Major Version Update]
### 2025/10/2 - v2.4.0
**New ntfy Push Notifications**
- **Core Features**:
- Supports ntfy.sh public service and self-hosted servers
- **Use Cases**:
- Suitable for privacy-conscious users (supports self-hosting)
- Cross-platform push (iOS, Android, Desktop, Web)
- No account registration required (public servers)
- Open source and free (MIT License)
- **Update Notice**:
- It is recommended to use the [Major Version Update]
### 2025/09/26 - v2.3.2
- Fixed the issue where email notification configuration checks were overlooked ([#88](https://github.com/sansan0/TrendRadar/issues/88))
**Fix Description**:
- Resolved the problem where the system still prompted "No webhook configured" even when email notifications were correctly configured.
### 2025/09/22 - v2.3.1
- **New Email Push Feature**: Supports sending hot news reports to your email
- **Intelligent SMTP Recognition**: Automatically recognizes configurations for over 10 email service providers, including Gmail, QQ Mail, Outlook, and NetEase Mail
- **Beautiful HTML Format**: Email content uses the same HTML format as the web version, with exquisite layout and mobile adaptation
- **Batch Sending Support**: Supports multiple recipients, simply separate them with commas to send to multiple people at once
- **Custom SMTP**: Allows customization of SMTP server and port
- Fixed Docker build network connection issues
**Usage Instructions**:
- Applicable Scenarios: Suitable for users who need email archiving, team sharing, and scheduled reports
- Supported Email Providers: Gmail, QQ Mail, Outlook/Hotmail, 163/126 Mail, Sina Mail, Sohu Mail, etc.
**Update Reminder**:
- This update includes a lot of content; if you wish to upgrade, it is recommended to use the 【Major Version Upgrade】.
### 2025/09/17 - v2.2.0
- Added a one-click save news image feature, allowing you to easily share trending topics you care about.
**Usage Instructions**:
- Applicable Scenarios: After you have enabled the web version feature following the tutorial (GitHub Pages)
- How to Use: Open the webpage link on your phone or computer, and click the "Save as Image" button at the top of the page
- Actual Effect: The system will automatically create a beautiful image of the current news report and save it to your phone's photo album or your computer's desktop
- Sharing Convenience: You can directly send this image to friends, post it on your social circle, or share it in work groups, allowing others to see the important information you discovered.
### 2025/09/13 - v2.1.2
- Fixed the issue of news push failure caused by DingTalk's (钉钉) push capacity limit (using batch push)
### 2025/09/04 - v2.1.1
- Fixed the issue where Docker could not run properly on certain architectures
- Officially released the official Docker image wantcat/trendradar, supporting multiple architectures
- Optimized the Docker deployment process for quick usage without local builds
### 2025/08/30 - v2.1.0
**Core Improvements**:
- **Push Logic Optimization**: Changed from "push every execution" to "controllable push within a time window"
- **Time Window Control**: Allows setting a push time range to avoid disturbances during non-working hours
- **Selectable Push Frequency**: Supports single or multiple pushes within the time period
**Update Notes**:
- This feature is disabled by default and needs to be manually enabled in config.yaml for time window control
- Upgrading requires updating both main.py and config.yaml files
### 2025/08/27 - v2.0.4
- This version is not a feature fix, but an important reminder.
- Please make sure to keep your webhooks secure; do not expose them, do not expose them, do not expose them.
- If you have deployed this project on GitHub via forking, please enter the webhooks into GitHub Secrets, not config.yaml.
- If you have already exposed your webhooks or entered them into config.yaml, it is recommended to delete them and regenerate.
### 2025/08/06 - v2.0.3
- Optimized the web version of the github page for better usability on mobile devices.
### 2025/07/28 - v2.0.2
- Refactored the code
- Resolved the issue of version number being easily overlooked for modification
### 2025/07/27 - v2.0.1
**Bug Fixes**:
1. Fixed an execution issue caused by CRLF line endings in the Docker shell script.
2. Fixed a logic issue where the news sent was empty when frequency_words.txt was empty.
- After the fix, when you select frequency_words.txt as empty, it will **push all news**, but due to message push size limitations, please make the following adjustments:
- Option 1: Disable mobile push and only select GitHub Pages deployment (this is the option that provides the most complete information, as it will reorder the hot topics across all platforms according to your **custom hot search algorithm**).
- Option 2: Reduce the push platforms, prioritizing **WeChat Work** or **Telegram**. I have implemented batch push functionality for these two platforms (because batch pushing affects the push experience, and these two platforms only allow a limited amount of push capacity, batch pushing was necessary, but it at least ensures the completeness of the information received).
- Option 3: This can be combined with Option 2, where selecting the current or incremental mode can effectively reduce the content pushed at one time.
### 2025/07/17 - v2.0.0
**Major Refactor**:
- Configuration management refactor: All configurations are now managed through the `config/config.yaml` file (I haven't split main.py for your convenience in copying upgrades)
- Runtime mode upgrade: Supports three modes - `daily` (daily summary), `current` (current leaderboard), `incremental` (incremental monitoring)
- Docker support: Complete Docker deployment solution, supporting containerized operation
**Configuration File Description**:
- `config/config.yaml` - Main configuration file (application settings, crawler configuration, notification configuration, platform configuration, etc.)
- `config/frequency_words.txt` - Keyword configuration (monitoring vocabulary settings)
### 2025/07/09 - v1.4.1
**New Features**: Added incremental push (configure FOCUS_NEW_ONLY at the top of main.py), this switch only cares about new topics rather than ongoing popularity, and will only send notifications when there is new content.
**Bug Fixes**: Fixed occasional layout issues caused by special characters in the news itself in certain cases.
### 2025/06/23 - v1.3.0
There are length limits for push messages in 企业微信 (WeChat Work) and Telegram, so I adopted a method of splitting the messages for pushing. For detailed development documentation, please refer to [企业微信](https://developer.work.weixin.qq.com/document/path/91770) and [Telegram](https://core.telegram.org/bots/api).
### 2025/06/21 - v1.2.1
In the previous versions before this one, not only does main.py need to be copied and replaced, but crawler.yml also needs to be copied and replaced.
https://github.com/sansan0/TrendRadar/blob/master/.github/workflows/crawler.yml
### 2025/06/19 - v1.2.0
> Thanks to the API organized by claude research across various platforms, I was able to quickly complete the adaptation for each platform (although the code has become more redundant~)
1. Support for Telegram, WeChat Work, and DingTalk push channels, with support for multi-channel configuration and simultaneous pushing.
### 2025/06/18 - v1.1.0
> **200 star⭐** achieved, let's keep the excitement going~ Recently, under my "encouragement," quite a few people have liked, shared, and recommended my public account, and I've seen the encouraging data from specific accounts in the backend. Many have become loyal fans since the angel round (I've only been running the public account for a little over a month, although I registered it seven or eight years ago, haha, so I got on early but started late). However, since you haven't left comments or messaged me, I can't respond and thank each of you individually, so I want to express my gratitude here!
1. Important update: I've added weighting, so the news you see now is the hottest and most followed, appearing at the top.
2. Updated documentation usage: Many features have been updated recently, and the previous usage documentation was written a bit too simply (see the complete tutorial for ⚙️ frequency_words.txt configuration below).
### 2025/06/16 - v1.0.0
1. Added a new version update prompt for the project, which is enabled by default. To disable it, you can change "FEISHU_SHOW_VERSION_UPDATE": True to False in main.py.
### 2025/06/13+14
1. Removed compatibility code. Students who forked earlier may experience anomalies when directly copying the code on that day (it will return to normal the next day).
2. Added a new news display at the bottom of feishu and html.
### 2025/06/09
**100 stars⭐** achieved, let's add a small feature to cheer everyone up.
The frequency_words.txt file has added a "must-have words" feature, using the + sign.
1. The must-have word syntax is as follows:
Both 唐僧 (Tang Seng) and 猪八戒 (Zhu Bajie) must appear in the title to be included in the push news.
```
+唐僧
+猪八戒
```
2. The priority of filter words is higher:
If a filter word matches 唐僧念经 (Tang Seng reciting scriptures) in the title, then even if 唐僧 is in the must-have words, it will not be displayed.
```
+唐僧
!唐僧念经
```
### 2025/06/02
1. **Webpage** and **Feishu message** support direct mobile jump to detailed news
2. Optimized display effect + 1
### 2025/05/26
1. Feishu message display effect optimization
<table>
<tr>
<td align="center">
Before Optimization<br>
<img src="_image/before.jpg" alt="Feishu message interface - Before Optimization" width="400"/>
</td>
<td align="center">
After Optimization<br>
<img src="_image/after.jpg" alt="Feishu message interface - After Optimization" width="400"/>
</td>
</tr>
</table>
</details>
<br>
## 🚀 Quick Start
> **📖 Reminder**: Fork users are advised to **[check the latest official documentation](https://github.com/sansan0/TrendRadar?tab=readme-ov-file)** to ensure the configuration steps are up to date.
1. **Fork this project** to your GitHub account
- Click the "Fork" button at the top right corner of this page
2. **Set up GitHub Secrets (choose the platform you need)**:
In your forked repository, go to `Settings` > `Secrets and variables` > `Actions` > `New repository secret`
**📌 Important Notes (please read carefully):**
- ✅ **One Name corresponds to one Secret**: For each configuration item added, click the "New repository secret" button once, and fill in a pair of "Name" and "Secret"
- ✅ **It's normal not to see the value after saving**: For security reasons, when you edit after saving, you can only see the Name, not the content of the Secret
- ⚠️ **Do not create your own names**: The Name of the Secret must **strictly use** the names listed below (such as `WEWORK_WEBHOOK_URL`, `FEISHU_WEBHOOK_URL`, etc.), and cannot be modified or created arbitrarily; otherwise, the system will not recognize it
- 💡 **You can configure multiple platforms simultaneously**: The system will send notifications to all configured platforms
**📌 Multi-account Push Instructions (new in v3.5.0):**
- ✅ **Supports multi-account configuration**: All push channels (Feishu, DingTalk, WeChat Work, Telegram, ntfy, Bark, Slack) support configuring multiple accounts
- ✅ **Configuration method**: Separate multiple account values with a semicolon `;`
- ✅ **Example**: The Secret value for `FEISHU_WEBHOOK_URL` should be `https://webhook1;https://webhook2`
- ⚠️ **Pairing configuration**: Telegram and ntfy need to ensure that the number of paired parameters is consistent (e.g., both token and chat_id are 2)
- ⚠️ **Quantity limit**: By default, a maximum of 3 accounts per channel is allowed; excess will be truncated
**Multi-account Configuration Example**:
| Name | Secret Example |
|-------------|-----------------|
| `FEISHU_WEBHOOK_URL` | `https://webhook1;https://webhook2;https://webhook3` |
| `TELEGRAM_BOT_TOKEN` | `token1;token2` |
| `TELEGRAM_CHAT_ID` | `chatid1;chatid2` |
| `NTFY_TOPIC` | `topic1;topic2` |
| `NTFY_TOKEN` | `;token2` (leave empty for the first one without a token) |
**Configuration Example:**
<img src="_image/secrets.png" alt="GitHub Secrets Configuration Example"/>
As shown in the image above, each row is a configuration item:
- **Name**: Must use the fixed names listed in the expanded content below (e.g., `WEWORK_WEBHOOK_URL`)
- **Secret**: Fill in the actual content you obtained from the corresponding platform (e.g., Webhook address, Token, etc.)
<br>
<details>
<summary>👉 Click to expand: <strong>WeChat Work Bot</strong> (easiest and quickest configuration)</summary>
<br>
**GitHub Secret Configuration (⚠️ Name must be strictly consistent):**
- **Name**: `WEWORK_WEBHOOK_URL` (please copy and paste this name, do not type it manually to avoid errors)
- **Secret**: Your WeChat Work bot Webhook address
<br>
**Bot Setup Steps:**
#### Mobile Setup:
1. Open the WeChat Work App → Enter the target internal group chat
2. Click the "…" button in the top right corner → Select "Message Push"
3. Click "Add" → Enter the name "TrendRadar"
4. Copy the Webhook address, click save, and configure the copied content into the GitHub Secret above
#### PC setup process is similar
</details>
<details>
<summary>👉 Click to expand: <strong>Personal WeChat Push</strong> (based on WeChat Work application, pushes to personal WeChat)</summary>
<br>
> Since this solution is based on the plugin mechanism of WeChat Work, the push style is plain text (no markdown format), but it can be directly pushed to personal WeChat without installing the WeChat Work App.
**GitHub Secret Configuration (⚠️ Name must be strictly consistent):**
- **Name**: `WEWORK_WEBHOOK_URL` (please copy and paste this name, do not type it manually)
- **Secret**: Your WeChat Work application Webhook address
- **Name**: `WEWORK_MSG_TYPE` (please copy and paste this name, do not type it manually)
- **Secret**: `text`
<br>
**Setup Steps:**
1. Complete the WeChat Work bot Webhook setup above
2. Add `WEWORK_MSG_TYPE` Secret, set the value to `text`
3. Follow the image below to link to personal WeChat
4. After configuration, the WeChat Work App on your phone can be deleted
<img src="_image/wework.png" title="Personal WeChat Push Configuration"/>
**Notes**:
- Use the same Webhook address as the WeChat Work bot
- The difference is in the message format: `text` is plain text, `markdown` is rich text (default)
- The plain text format will automatically remove all markdown syntax (bold, links, etc.)
</details>
<details>
<summary>👉 Click to expand: <strong>Feishu Bot</strong> (most friendly message display)</summary>
<br>
**GitHub Secret Configuration (⚠️ Name must be strictly consistent):**
- **Name**: `FEISHU_WEBHOOK_URL` (please copy and paste this name, do not type it manually)
- **Secret**: Your Feishu bot Webhook address (the link starts with something like https://www.feishu.cn/flow/api/trigger-webhook/********)
<br>
There are two solutions, **Solution 1** is simple to configure, **Solution 2** is complex (but stable push)
In Solution 1, discovered and suggested by **ziventian**, thanks to him, the default is personal push, but group push can also be configured [#97](https://github.com/sansan0/TrendRadar/issues/97).
**Solution 1:**
> For some people, there are additional operations required, otherwise it will report "system error". You need to search for the bot on the mobile side and then enable the Feishu bot application (this suggestion comes from a user, you can refer to it).
1. Open https://botbuilder.feishu.cn/home/my-command in your computer browser
2. Click "Create New Bot Command"
3. Click "Select Trigger", scroll down, and click "Webhook Trigger"
4. At this point, you will see the "Webhook Address", copy this link to a local notepad for temporary storage, and continue with the next steps
5. Place the following content in the "Parameters" section, then click "Finish"
```json
{
"message_type": "text",
"content": {
"total_titles": "{{内容}}",
"timestamp": "{{内容}}",
"report_type": "{{内容}}",
"text": "{{内容}}"
}
}
```
6. Click "Select Action" > "Send Message via Official Bot"
7. Fill in the message title as "TrendRadar Hotspot Monitoring"
8. The most critical part comes, click the + button, select "Webhook Trigger", and arrange it according to the image below

9. After configuration is complete, configure the Webhook address copied in step 4 into the `FEISHU_WEBHOOK_URL` in GitHub Secrets
<br>
**Solution 2:**
1. Open https://botbuilder.feishu.cn/home/my-app in your computer browser
2. Click "Create New Bot Application"
3. After entering the created application, click on "Processes Involved" > "Create Process" > "Select Trigger"
4. Scroll down and click on "Webhook Trigger"
5. At this point, you will see the "Webhook Address". Copy this link to a local notepad for temporary storage and continue with the next steps.
6. Place the following content in the "Parameters" section, then click "Finish"
```json
{
"message_type": "text",
"content": {
"total_titles": "{{内容}}",
"timestamp": "{{内容}}",
"report_type": "{{内容}}",
"text": "{{内容}}"
}
}
```
7. Click on "Select Action" > "Send Feishu Message", check "Group Message", then click on the input box below, and select "My Managed Groups" (if you don't have a group, you can create one in the Feishu app)
8. Fill in the message title as "TrendRadar Hotspot Monitoring"
9. The most critical part comes now. Click the + button, select "Webhook Trigger", and arrange it according to the image below.

10. After configuration is complete, set the Webhook address copied in step 5 to `FEISHU_WEBHOOK_URL` in GitHub Secrets.
</details>
<details>
<summary>👉 Click to expand: <strong>DingTalk Bot</strong></summary>
<br>
**GitHub Secret Configuration (⚠️ Name must match exactly):**
- **Name**: `DINGTALK_WEBHOOK_URL` (please copy and paste this name, do not type it manually)
- **Secret**: Your DingTalk Bot Webhook address
<br>
**Bot Setup Steps:**
1. **Create Bot (PC only)**:
- Open the DingTalk PC client and enter the target group chat
- Click the group settings icon (⚙️) → Scroll down to find "Bot" and click it
- Select "Add Bot" → "Custom"
2. **Configure Bot**:
- Set the bot name
- **Security Settings**:
- **Custom Keywords**: Set "Hotspot"
3. **Complete Setup**:
- Check the service terms agreement → Click "Finish"
- Copy the obtained Webhook URL
- Set the URL to `DINGTALK_WEBHOOK_URL` in GitHub Secrets
**Note**: The mobile version can only receive messages and cannot create new bots.
</details>
<details>
<summary>👉 Click to expand: <strong>Telegram Bot</strong></summary>
<br>
**GitHub Secret Configuration (⚠️ Name must match exactly):**
- **Name**: `TELEGRAM_BOT_TOKEN` (please copy and paste this name, do not type it manually)
- **Secret**: Your Telegram Bot Token
- **Name**: `TELEGRAM_CHAT_ID` (please copy and paste this name, do not type it manually)
- **Secret**: Your Telegram Chat ID
**Note**: Telegram requires configuring **two** Secrets, please click the "New repository secret" button twice to add them separately.
<br>
**Bot Setup Steps:**
1. **Create Bot**:
- Search for `@BotFather` in Telegram (pay attention to case, it should have a blue badge and show something like 37849827 monthly users; this is the official one, be cautious of similar unofficial accounts)
- Send the `/newbot` command to create a new bot
- Set the bot name (must end with "bot", and be creative as names may be duplicated)
- Obtain the Bot Token (format: `123456789:AAHfiqksKZ8WmR2zSjiQ7_v4TMAKdiHm9T0`)
2. **Get Chat ID**:
**Method 1: Get via Official API**
- First, send a message to your bot
- Access: `https://api.telegram.org/bot<Your Bot Token>/getUpdates`
- Find the number in the returned JSON under `"chat":{"id":number}`
**Method 2: Use Third-Party Tool**
- Search for `@userinfobot` and send `/start`
- Get your user ID as Chat ID
3. **Configure to GitHub**:
- `TELEGRAM_BOT_TOKEN`: Fill in the Bot Token obtained in step 1
- `TELEGRAM_CHAT_ID`: Fill in the Chat ID obtained in step 2
</details>
<details>
<summary>👉 Click to expand: <strong>Email Push</strong> (supports all major email providers)</summary>
<br>
- Notes: To prevent abuse of the email mass sending feature, currently all recipients can see each other's email addresses.
- If you have no prior experience configuring email sending like this, it is not recommended to try.
<br>
**GitHub Secret Configuration (⚠️ Name must match exactly):**
- **Name**: `EMAIL_FROM` (please copy and paste this name, do not type it manually)
- **Secret**: Sender's email address
- **Name**: `EMAIL_PASSWORD` (please copy and paste this name, do not type it manually)
- **Secret**: Email password or authorization code
- **Name**: `EMAIL_TO` (please copy and paste this name, do not type it manually)
- **Secret**: Recipient's email address (multiple recipients can be separated by commas, or you can send it to yourself as well)
- **Name**: `EMAIL_SMTP_SERVER` (optional configuration, please copy and paste this name)
- **Secret**: SMTP server address (can be left blank, the system will automatically recognize it)
- **Name**: `EMAIL_SMTP_PORT` (optional configuration, please copy and paste this name)
- **Secret**: SMTP port (can be left blank, the system will automatically recognize it)
**Note**: Email push requires configuring at least **3 mandatory** Secrets (EMAIL_FROM, EMAIL_PASSWORD, EMAIL_TO), while the last two are optional configurations.
<br>
**Supported Email Service Providers** (automatically recognizes SMTP configuration):
| Email Provider | Domain | SMTP Server | Port | Encryption |
|----------------|--------|-------------|------|------------|
| **Gmail** | gmail.com | smtp.gmail.com | 587 | TLS |
| **QQ Mail** | qq.com | smtp.qq.com | 465 | SSL |
| **Outlook** | outlook.com | smtp-mail.outlook.com | 587 | TLS |
| **Hotmail** | hotmail.com | smtp-mail.outlook.com | 587 | TLS |
| **Live** | live.com | smtp-mail.outlook.com | 587 | TLS |
| **163 Mail** | 163.com | smtp.163.com | 465 | SSL |
| **126 Mail** | 126.com | smtp.126.com | 465 | SSL |
| **Sina Mail** | sina.com | smtp.sina.com | 465 | SSL |
| **Sohu Mail** | sohu.com | smtp.sohu.com | 465 | SSL |
| **Tianyi Mail**| 189.cn | smtp.189.cn | 465 | SSL |
| **Aliyun Mail**| aliyun.com | smtp.aliyun.com | 465 | TLS |
> **Automatic Identification**: When using the above email, there is no need to manually configure `EMAIL_SMTP_SERVER` and `EMAIL_SMTP_PORT`, as the system will automatically identify them.
>
> **Feedback Instructions**:
> - If you successfully test with **other emails**, feel free to open an [Issues](https://github.com/sansan0/TrendRadar/issues) to let me know, and I will add it to the supported list.
> - If the above email configuration is incorrect or unusable, please also open an [Issues](https://github.com/sansan0/TrendRadar/issues) to provide feedback, helping to improve the project.
>
> **Special Thanks**:
> - Thanks to [@DYZYD](https://github.com/DYZYD) for contributing the configuration for Tianyi Email (189.cn) and completing the spontaneous testing ([#291](https://github.com/sansan0/TrendRadar/issues/291)).
> - Thanks to [@longzhenren](https://github.com/longzhenren) for contributing the configuration for Alibaba Cloud Email (aliyun.com) and completing the testing ([#344](https://github.com/sansan0/TrendRadar/issues/344)).
**Common Email Settings:**
#### QQ Email:
1. Log in to the QQ Email web version → Settings → Account
2. Enable POP3/SMTP service
3. Generate an authorization code (16-character letters)
4. Fill in `EMAIL_PASSWORD` with the authorization code, not the QQ password.
#### Gmail:
1. Enable two-step verification
2. Generate an app-specific password
3. Fill in `EMAIL_PASSWORD` with the app-specific password.
#### 163/126 Email:
1. Log in to the web version → Settings → POP3/SMTP/IMAP
2. Enable SMTP service
3. Set the client authorization code
4. Fill in `EMAIL_PASSWORD` with the authorization code.
<br>
**Advanced Configuration**:
If automatic identification fails, you can manually configure SMTP:
- `EMAIL_SMTP_SERVER`: e.g., smtp.gmail.com
- `EMAIL_SMTP_PORT`: e.g., 587 (TLS) or 465 (SSL)
<br>
**If there are multiple recipients (note that they should be separated by commas)**:
- EMAIL_TO="user1@example.com,user2@example.com,user3@example.com"
</details>
<details>
<summary>👉 Click to expand: <strong>ntfy Push</strong> (Open source and free, supports self-hosting)</summary>
<br>
**Two Usage Methods:**
### Method 1: Free Use (Recommended for Beginners) 🆓
**Features**:
- ✅ No account registration required, use immediately
- ✅ 250 messages per day (sufficient for 90% of users)
- ✅ Topic name is the "password" (choose a name that is hard to guess)
- ⚠️ Messages are not encrypted, not suitable for sensitive information, but suitable for non-sensitive information in our project.
**Quick Start**:
1. **Download the ntfy app**:
- Android: [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) / [F-Droid](https://f-droid.org/en/packages/io.heckel.ntfy/)
- iOS: [App Store](https://apps.apple.com/us/app/ntfy/id1625396347)
- Desktop: Visit [ntfy.sh](https://ntfy.sh)
2. **Subscribe to a topic** (choose a hard-to-guess name):
```
Suggested format: trendradar-{your initials}-{random number}
Cannot use Chinese characters
✅ Good example: trendradar-zs-8492
❌ Bad example: news, alerts (too easy to guess)
```
3. **Configure GitHub Secret (⚠️ Name must match exactly)**:
- **Name**: `NTFY_TOPIC` (please copy and paste this name, do not type it manually)
- **Secret**: Fill in the topic name you just subscribed to.
- **Name**: `NTFY_SERVER_URL` (optional configuration, please copy and paste this name)
- **Secret**: Leave it blank (default uses ntfy.sh).
- **Name**: `NTFY_TOKEN` (optional configuration, please copy and paste this name)
- **Secret**: Leave it blank.
**Note**: ntfy requires at least 1 mandatory Secret (NTFY_TOPIC), the latter two are optional configurations.
4. **Test**:
```bash
curl -d "Test message" ntfy.sh/your_topic_name
```
---
### Method 2: Self-hosting (Complete Privacy Control) 🔒
**Suitable for**: Users with servers, seeking complete privacy, and have strong technical skills.
**Advantages**:
- ✅ Fully open source (Apache 2.0 + GPLv2)
- ✅ Complete control over data
- ✅ No restrictions
- ✅ Zero cost
**One-click Docker Deployment**:
```bash
docker run -d \
--name ntfy \
-p 80:80 \
-v /var/cache/ntfy:/var/cache/ntfy \
binwiederhier/ntfy \
serve --cache-file /var/cache/ntfy/cache.db
```
**Configure TrendRadar**:
```yaml
NTFY_SERVER_URL: https://ntfy.yourdomain.com
NTFY_TOPIC: trendradar-alerts # Simple name can be used for self-hosting
NTFY_TOKEN: tk_your_token # Optional: Enable access control
```
**Subscribe in the app**:
- Click "Use another server"
- Enter your server address
- Enter the topic name
- (Optional) Enter login credentials
---
**Frequently Asked Questions**:
<details>
<summary><strong>Q1: Is the free version sufficient?</strong></summary>
250 messages per day is sufficient for most users. Calculating with a fetch every 30 minutes, there are about 48 pushes per day, which is completely adequate.
</details>
<details>
<summary><strong>Q2: Is the Topic name really secure?</strong></summary>
If you choose a random, sufficiently long name (e.g., `trendradar-zs-8492-news`), brute-forcing is nearly impossible:
- ntfy has strict rate limits (1 request per second)
- 64 character choices (A-Z, a-z, 0-9, _, -)
- A 10-character random string has 64^10 possibilities (it would take years to crack).
</details>
---
**Recommended Choices**:
| User Type | Recommended Plan | Reason |
|-------------|------------------|-----------------------------|
| Regular User| Method 1 (Free) | Simple and quick, sufficient |
| Technical User| Method 2 (Self-hosting) | Complete control, no restrictions |
| High-frequency User| Method 3 (Paid) | Check the official website for details |
**Related Links**:
- [ntfy Official Documentation](https://docs.ntfy.sh/)
- [Self-hosting Tutorial](https://docs.ntfy.sh/install/)
- [GitHub Repository](https://github.com/binwiederhier/ntfy)
</details>
<details>
<summary>👉 Click to expand: <strong>Bark Push</strong> (iOS exclusive, simple and efficient)</summary>
<br>
**GitHub Secret Configuration (⚠️ Name must match exactly)**:
- **Name**: `BARK_URL` (please copy and paste this name, do not type it manually)
- **Secret**: Your Bark push URL
<br>
**Introduction to Bark**:
Bark is a free and open-source push tool for the iOS platform, characterized by its simplicity, speed, and ad-free experience.
**Usage:**
### Method 1: Use the Official Server (Recommended for Beginners) 🆓
1. **Download Bark App**:
- iOS: [App Store](https://apps.apple.com/cn/app/bark-给你的手机发推送/id1403753865)
2. **Obtain Push URL**:
- Open the Bark App
- Copy the push URL displayed on the homepage (format: `https://api.day.app/your_device_key`)
- Configure the URL in GitHub Secrets under `BARK_URL`
### Method 2: Self-Hosted Server (Complete Privacy Control) 🔒
**Target Audience**: Those with a server, seeking complete privacy, and have strong technical skills
**One-Click Docker Deployment**:
```bash
docker run -d \
--name bark-server \
-p 8080:8080 \
finab/bark-server
```
**Configure TrendRadar**:
```yaml
BARK_URL: http://your-server-ip:8080/your_device_key
```
---
**Notes:**
- ✅ Bark uses APNs for push notifications, with a maximum message size of 4KB
- ✅ Supports automatic batch pushing, no need to worry about overly long messages
- ✅ The push format is plain text (automatically removes Markdown syntax)
- ⚠️ Only supports iOS platform
**Related Links:**
- [Bark Official Website](https://bark.day.app/)
- [Bark GitHub Repository](https://github.com/Finb/Bark)
- [Bark Server Self-Hosting Tutorial](https://github.com/Finb/bark-server)
</details>
<details>
<summary>👉 Click to Expand: <strong>Slack Push Notifications</strong></summary>
<br>
**GitHub Secret Configuration (⚠️ Name must match exactly):**
- **Name**: `SLACK_WEBHOOK_URL` (please copy and paste this name, do not type it manually)
- **Secret**: Your Slack Incoming Webhook URL
<br>
**Introduction to Slack:**
Slack is a team collaboration tool, and Incoming Webhooks can push messages to Slack channels.
**Setup Steps:**
### Step 1: Create a Slack App
1. **Visit the Slack API Page**:
- Open https://api.slack.com/apps?new_app=1
- If not logged in, log into your Slack workspace first
2. **Choose Creation Method**:
- Click **"From scratch"**
3. **Fill in App Information**:
- **App Name**: Enter the application name (e.g., `TrendRadar` or `Hot News Monitoring`)
- **Workspace**: Select your workspace from the dropdown list
- Click the **"Create App"** button
### Step 2: Enable Incoming Webhooks
1. **Navigate to Incoming Webhooks**:
- Find and click **"Incoming Webhooks"** in the left menu
2. **Enable the Feature**:
- Find the **"Activate Incoming Webhooks"** toggle
- Switch the toggle from `OFF` to `ON`
- The page will automatically refresh to show new configuration options
### Step 3: Generate Webhook URL
1. **Add a New Webhook**:
- Scroll to the bottom of the page
- Click the **"Add New Webhook to Workspace"** button
2. **Select Target Channel**:
- The system will pop up an authorization page
- Select the channel to receive messages from the dropdown list (e.g., `#Hot News`)
- ⚠️ If you want to select a private channel, you must join that channel first
3. **Authorize the App**:
- Click the **"Allow"** button to complete authorization
- The system will automatically redirect back to the configuration page
### Step 4: Copy and Save Webhook URL
1. **View the Generated URL**:
- In the "Webhook URLs for Your Workspace" area
- You will see the newly generated Webhook URL
- Format: `https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX`
2. **Copy the URL**:
- Click the **"Copy"** button to the right of the URL
- Or manually select the URL and copy it
3. **Configure in TrendRadar**:
- **GitHub Actions**: Add the URL to GitHub Secrets under `SLACK_WEBHOOK_URL`
- **Local Testing**: Fill in the `slack_webhook_url` field in `config/config.yaml` with the URL
- **Docker Deployment**: Add the URL to the `SLACK_WEBHOOK_URL` variable in the `docker/.env` file
---
**Notes:**
- ✅ Supports Markdown format (automatically converted to Slack mrkdwn)
- ✅ Supports automatic batch pushing (4KB per batch)
- ✅ Suitable for team collaboration, centralized message management
- ⚠️ The Webhook URL contains a key, do not expose it
**Message Format Preview:**
```
*[Batch 1/2]*
📊 *Hot Vocabulary Statistics*
🔥 *[1/3] AI ChatGPT* : 2 messages
1. [Baidu Hot Search] 🆕 ChatGPT-5 officially released *[1]* - 09:15 (1 time)
2. [Today's Headlines] AI chip concept stocks surge *[3]* - [08:30 ~ 10:45] (3 times)
```
**Related Links:**
- [Slack Incoming Webhooks Official Documentation](https://api.slack.com/messaging/webhooks)
- [Slack API App Management](https://api.slack.com/apps)
</details>
3. **Manual Testing of News Push**:
> 💡 **After completing Steps 1-2, please test immediately!** Adjust configurations as needed after successful testing (Step 4).
>
> ⚠️ **Important Reminder: Please enter your own forked project, not this project!**
**How to Find Your Actions Page**:
- **Method 1**: Open the homepage of your forked project and click the **Actions** tab at the top
- **Method 2**: Directly visit `https://github.com/your_username/TrendRadar/actions`
**Example Comparison**:
- ❌ Author's project: `https://github.com/sansan0/TrendRadar/actions`
- ✅ Your project: `https://github.com/your_username/TrendRadar/actions`
**Testing Steps**:
1. Go to your project's Actions page
2. Find **"Hot News Crawler"** and click on it
- If you do not see this text, refer to [#109](https://github.com/sansan0/TrendRadar/issues/109) for a solution
3. Click the **"Run workflow"** button on the right to run it
4. Wait about 1 minute, and the message will be pushed to the platform you configured
> ⏱️ **Testing Tips**:
> - Do not test too frequently to avoid triggering GitHub Actions limits
> - After clicking Run workflow, you need to **refresh the browser page** to see the new run records
4. **Configuration Explanation (Optional)**:
> 💡 **The default configuration is already functional**, if you need personalized adjustments, understanding the following three files is sufficient
| File | Purpose |
|------|------|
| `config/config.yaml` | Main configuration file: push mode, time window, platform list, hot topic weights, etc. |
| `config/frequency_words.txt` | Keyword file: set the vocabulary you care about to filter push content |
| `.github/workflows/crawler.yml` | Execution frequency: control how often it runs (⚠️ Modify with caution) |
👉 **Detailed configuration tutorial**: [Configuration Details](#配置详解)
5. **🎉 Deployment Successful! Share Your Experience**
Congratulations on completing the configuration of TrendRadar! You can now start tracking hot news.
💬 **Many friends are sharing their experiences on the public account, looking forward to your contribution~**
- Want to learn more tricks and advanced techniques?
- Encountering issues and need quick answers?
- Have good ideas to discuss?
👉 **Feel free to follow the public account "Silicon-based Tea Room"**, your likes and comments are the motivation for the project's continuous updates.
For detailed communication methods, please check → [Q&A and Communication](#问题答疑与交流)
6. **Want Smarter Analysis? Try AI Enhanced Features** (Optional)
The basic configuration is sufficient for daily use, but if you want to:
- 📊 Let AI automatically analyze hot trends and data insights
- 🔍 Search and query news through natural language
- 💡 Obtain in-depth analysis such as sentiment analysis and topic prediction
- ⚡ Directly call data in AI tools like Claude, Cursor, etc.
👉 **Learn more**: [AI Intelligent Analysis](#-ai-智能分析) — Unlock the hidden capabilities of the project for more efficient hot tracking!
<br>
<a name="配置详解"></a>
## ⚙️ Configuration Details
> **📖 Reminder**: This section provides detailed configuration instructions. It is recommended to complete the basic configuration in [Quick Start](#-快速开始) first, and then return to check the detailed options as needed.
### 1. Platform Configuration
<details id="自定义监控平台">
<summary>👉 Click to expand: <strong>Custom Monitoring Platforms</strong></summary>
<br>
**Configuration Location:** The `platforms` section of `config/config.yaml`
The information data for this project comes from [newsnow](https://github.com/ourongxing/newsnow). You can click the [website](https://newsnow.busiyi.world/), click [More], and check if there are any platforms you want.
For specific additions, you can visit the [project source code](https://github.com/ourongxing/newsnow/tree/main/server/sources) and modify the `platforms` configuration in the `config/config.yaml` file based on the file names inside:
```yaml
platforms:
- id: "toutiao"
name: "今日头条"
- id: "baidu"
name: "百度热搜"
- id: "wallstreetcn-hot"
name: "华尔街见闻"
# Add more platforms...
```
> 💡 **Shortcut**: If you are not familiar with reading source code, you can copy the [platform configuration summary](https://github.com/sansan0/TrendRadar/issues/95) organized by others.
> ⚠️ **Note**: More platforms are not necessarily better. It is recommended to choose 10-15 core platforms. Too many platforms can lead to information overload, which may reduce the user experience.
</details>
### 2. Keyword Configuration
Configure the monitored keywords in the `frequency_words.txt` file, supporting five types of syntax, regional tags, and phrase functionality.
| Syntax Type | Symbol | Purpose | Example | Matching Logic |
|-------------|--------|---------|---------|----------------|
| **Normal Word** | None | Basic matching | `华为` | Contains any one of them |
| **Must Word** | `+` | Limit range | `+手机` | Must contain all |
| **Filter Word** | `!` | Exclude interference | `!广告` | Excluded if included |
| **Quantity Limit** | `@` | Control display quantity | `@10` | Display a maximum of 10 news articles (added in v3.2.0) |
| **Global Filter** | `[GLOBAL_FILTER]` | Globally exclude specified content | See example below | Filtered under any circumstances (added in v3.5.0) |
#### 2.1 Basic Syntax
<a name="Keyword Basic Syntax"></a>
<details>
<summary>👉 Click to expand: <strong>Basic Syntax Tutorial</strong></summary>
<br>
**Configuration Location:** `config/frequency_words.txt`
##### 1. **Common Keywords** - Basic Matching
```txt
Huawei
OPPO
Apple
```
**Function:** News titles containing **any one of these words** will be captured.
##### 2. **Must Words** `+Vocabulary` - Scope Limitation
```txt
Huawei
OPPO
+Mobile
```
**Function:** Must contain both common words **and** must words to be captured.
##### 3. **Filter Words** `!Vocabulary` - Exclude Interference
```txt
Apple
Huawei
!Fruit
!Price
```
**Function:** News containing filter words will be **directly excluded**, even if they contain keywords.
##### 4. **Quantity Limit** `@number` - Control the display quantity (added in v3.2.0)
```txt
Tesla
Musk
@5
```
**Function:** Limits the maximum number of news items displayed for this keyword group.
**Configuration Priority:** `@number` > Global Configuration > No Limit
##### 5. **Global Filter** `[GLOBAL_FILTER]` - Globally exclude specified content (added in v3.5.0)
```txt
[GLOBAL_FILTER]
advertisement
promotion
marketing
shocking
clickbait
[WORD_GROUPS]
technology
AI
Huawei
HarmonyOS
!car
```
**Function:** Filters news containing specified words under any circumstances, **highest priority**
**Use Cases:**
- Filter low-quality content: shocking, clickbait, leaks, etc.
- Filter marketing content: advertisement, promotion, sponsorship, etc.
- Filter specific topics: entertainment, gossip (as needed)
**Filtering Priority:** Global filter > Group filter (`!`) > Group match
**Area Description:**
- `[GLOBAL_FILTER]`: Global filtering area, words included will be filtered under any circumstances
- `[WORD_GROUPS]`: Group area, maintain existing syntax (`!`, `+`, `@`)
- If area markers are not used, all will be treated as groups by default (backward compatible)
**Matching Examples:**
```txt
[GLOBAL_FILTER]
advertisement
[WORD_GROUPS]
technology
AI
```
- ❌ "Advertisement: Latest technology product launch" ← Contains global filter word "advertisement", directly rejected
- ✅ "Technology company launches new AI product" ← Does not contain global filter word, matches "technology" group
- ✅ "AI technology breakthrough attracts attention" ← Does not contain global filter word, matches "AI" in the "technology" group
**Notes:**
- Global filter words should be used with caution to avoid excessive filtering that leads to missing valuable content
- It is recommended to keep global filter words within 5-15
- For filtering specific groups, prioritize using group filter words (with `!` prefix)
#### 🔗 Phrase Function - The Important Role of Empty Lines
**Core Rule:** Use **empty lines** to separate different phrases, with each phrase being counted independently.
##### Example Configuration:
```txt
iPhone
Huawei
OPPO
+Release
A-shares
Shanghai Stock Exchange
Shenzhen Stock Exchange
+Price Change
!Prediction
World Cup
European Championship
Asian Cup
+Match
```
##### Phrase Explanation and Matching Effect:
**Group 1 - Mobile New Products:**
- Keywords: iPhone, Huawei, OPPO
- Must-have word: release
- Effect: Must include the mobile brand name and also include "release"
**Matching Examples:**
- ✅ "iPhone 15正式发布售价公布" ← Contains "iPhone" + "release"
- ✅ "华为Mate60系列发布会直播" ← Contains "Huawei" + "release"
- ✅ "OPPO Find X7发布时间确定" ← Contains "OPPO" + "release"
- ❌ "iPhone销量创新高" ← Contains "iPhone" but lacks "release"
**Group 2 - Stock Market Trends:**
- Keywords: A-shares, Shanghai Composite, Shenzhen Composite
- Must-have word: fluctuation
- Filter word: forecast
- Effect: Focus on the actual fluctuations of the stock market, excluding forecast content
**Matching Examples:**
- ✅ "A股今日大幅涨跌分析" ← Contains "A-shares" + "fluctuation"
- ✅ "上证指数涨跌幅创新高" ← Contains "Shanghai Composite" + "fluctuation"
- ❌ "专家预测A股涨跌趋势" ← Contains "A-shares" + "fluctuation" but includes "forecast"
**Group 3 - Football Events:**
- Keywords: World Cup, European Championship, Asian Cup
- Must-have word: match
- Effect: Only focus on news related to matches
#### 📝 Configuration Tips
##### 1. **From Broad to Strict**
```txt
# Step 1: Test with Broad Keywords First
Artificial Intelligence
AI
ChatGPT
# Step 2: After discovering mismatches, add necessary word restrictions
Artificial Intelligence
AI
ChatGPT
+Technology
# Step 3: After discovering the interfering content, add filtering words
Artificial Intelligence
AI
ChatGPT
+Technology
!Advertisement
!Training
```
##### 2. **Avoid Over-Complexity**
❌ **Not Recommended:** A phrase contains too many words
```txt
Huawei
OPPO
Apple
Samsung
vivo
OnePlus
Meizu
+mobile
+release
+sales
!counterfeit
!repair
!second-hand
```
✅ **Recommended:** Split into multiple precise phrases
```txt
Huawei
OPPO
+new products
Apple
Samsung
+release
mobile
sales
+market
```
#### 2.2 Advanced Configuration (New in v3.2.0)
<a name="关键词高级配置"></a>
<details>
<summary>👉 Click to expand: <strong>Advanced Configuration Tutorial</strong></summary>
<br>
##### Keyword Sorting Priority
**Configuration Location:** `config/config.yaml`
```yaml
report:
sort_by_position_first: false # Sorting priority configuration
```
| Configuration Value | Sorting Rule | Applicable Scenarios |
|---------------------|--------------|----------------------|
| `false` (default) | Hotspot Count ↓ → Configuration Position ↑ | Focus on popularity trends |
| `true` | Configuration Position ↑ → Hotspot Count ↓ | Focus on personal priority |
**Example:** Configuration order A, B, C, Hotspot counts A(3), B(10), C(5)
- `false`: B(10) → C(5) → A(3)
- `true`: A(3) → B(10) → C(5)
##### Global Display Quantity Limit
```yaml
report:
max_news_per_keyword: 10 # Maximum 10 entries displayed per keyword (0=no limit)
```
**Docker Environment Variables:**
```bash
SORT_BY_POSITION_FIRST=true
MAX_NEWS_PER_KEYWORD=10
```
**Comprehensive Example:**
```yaml
# config.yaml
report:
sort_by_position_first: true # Sort by configuration order first
max_news_per_keyword: 10 # Global default of up to 10 news items per keyword
```
# frequency_words.txt
Tesla
Musk
@20 # Focus on, display 20 entries (covers global configuration)
Huawei # Use global configuration, display 10 entries
BYD
@5 # Limit to 5 entries
```
**Final effect:** Display in configuration order Tesla (20 entries) → Huawei (10 entries) → BYD (5 entries)
</details>
### 3. Detailed Explanation of Push Modes
<details>
<summary>👉 Click to expand: <strong>Detailed Comparison of Three Push Modes</strong></summary>
<br>
**Configuration Location:** `report.mode` in `config/config.yaml`
```yaml
report:
mode: "daily" # Options: "daily" | "incremental" | "current"
```
**Docker Environment Variable:** `REPORT_MODE=incremental`
#### Detailed Comparison Table
| Mode | Target Audience | Push Timing | Display Content | Typical Use Cases |
|------|----------------|-------------|------------------|-------------------|
| **Daily Summary**<br/>`daily` | 📋 Business Managers/General Users | Scheduled Push (default once every hour) | All matching news of the day<br/>+ New news section | **Example**: Check all important news of the day at 6 PM every day<br/>**Feature**: View the complete trend of the day without missing any hot topics<br/>**Reminder**: Will include news that has been pushed before |
| **Current Rankings**<br/>`current` | 📰 Self-Media People/Content Creators | Scheduled Push (default once every hour) | Current ranking matching news<br/>+ New news section | **Example**: Track "which topics are trending now" every hour<br/>**Feature**: Real-time understanding of current ranking changes<br/>**Reminder**: News that remains on the list will appear each time |
| **Incremental Monitoring**<br/>`incremental` | 📈 Investors/Traders | Push only when there is new content | Newly appeared matching frequency word news | **Example**: Monitor "Tesla", notify only when there is new information<br/>**Feature**: No duplicates, only view news that appears for the first time<br/>**Suitable for**: High-frequency monitoring, avoiding information disturbance |
#### Example of Actual Push Effects
Assuming you are monitoring the keyword "Apple" and executing once every hour:
| Time | daily Mode Push | current Mode Push | incremental Mode Push |
|-------|----------------------|-----------------------|-------------------------|
| 10:00 | News A, News B | News A, News B | News A, News B |
| 11:00 | News A, News B, News C | News B, News C, News D | **Only** News C |
| 12:00 | News A, News B, News C | News C, News D, News E | **Only** News D, News E |
**Note**:
- `daily`: Accumulates and displays all news of the day (A, B, C are all retained)
- `current`: Displays the current ranking news (ranking changes, News D enters the list, News A drops out)
- `incremental`: **Only pushes newly appeared news** (avoids duplicate interference)
#### Frequently Asked Questions
> **💡 Encountering this issue?** 👉 "Executed once every hour, the news output from the first execution still appears in the next hour's execution"
> - **Reason**: You may have selected the `daily` (daily summary) or `current` (current ranking) mode
> - **Solution**: Switch to the `incremental` (incremental monitoring) mode, which only pushes new content
#### ⚠️ Important Notes on Incremental Mode
> **Users who have selected the `incremental` mode please note:**
>
> 📌 **The incremental mode will only push notifications when there are new matching news articles**
>
> **If you haven't received any notifications for a long time, it may be due to:**
> 1. No new trending topics matching your keywords have appeared in the current period
> 2. The keyword configuration is too strict or too broad
> 3. The number of monitoring platforms is limited
>
> **Solutions:**
> - Solution 1: 👉 [Optimize Keyword Configuration](#2-关键词配置) - Adjust the precision of keywords, add or modify monitored terms
> - Solution 2: Switch Push Mode - Change to `current` or `daily` mode to receive notifications at scheduled times
> - Solution 3: 👉 [Add Monitoring Platforms](#1-平台配置) - Add more news platforms to expand information sources
</details>
### 4. Hotspot Weight Adjustment
<details>
<summary>👉 Click to expand: <strong>Hotspot Weight Adjustment</strong></summary>
<br>
**Configuration Location:** The `weight` section of `config/config.yaml`
```yaml
weight:
rank_weight: 0.6 # Ranking weight
frequency_weight: 0.3 # Frequency weight
hotness_weight: 0.1 # Hotness weight
```
The current default configuration is a balanced configuration.
#### Two Core Scenarios
**Real-time Hotspot Pursuit**:
```yaml
weight:
rank_weight: 0.8 # Mainly focused on ranking
frequency_weight: 0.1 # Less concerned about continuity
hotness_weight: 0.1
```
**Target Audience**: Self-media bloggers, marketers, users who want to quickly understand the hottest topics at the moment
**In-depth Topic Pursuit**:
```yaml
weight:
rank_weight: 0.4 # Moderately focused on ranking
frequency_weight: 0.5 # Values the sustained popularity within the day
hotness_weight: 0.1
```
**Target Audience**: Investors, researchers, journalists, users who need in-depth analysis of trends
#### Adjustment Methods
1. **The sum of the three numbers must equal 1.0**
2. **Increase the weight of the more important factor**: If ranking is a priority, increase rank_weight; if consistency is a priority, increase frequency_weight.
3. **It is recommended to adjust by only 0.1-0.2 each time** and observe the effects.
Core idea: Users who prioritize speed and timeliness should increase ranking weight, while users who prioritize depth and stability should increase frequency weight.
### 5. Push Format Reference
<details>
<summary>👉 Click to expand: <strong>Push Format Description</strong></summary>
<br>
#### Push Example
📊 Hot Keyword Statistics
🔥 [1/3] AI ChatGPT: 2 items
1. [Baidu Hot Search] 🆕 ChatGPT-5 officially released [**1**] - 09:15 (1 time)
2. [Today's Headlines] AI chip concept stocks surge [**3**] - [08:30 ~ 10:45] (3 times)
━━━━━━━━━━━━━━━━━━━
📈 [2/3] BYD Tesla: 2 items
1. [Weibo] 🆕 BYD monthly sales break record [**2**] - 10:20 (1 time)
2. [Douyin] Tesla price reduction promotion [**4**] - [07:45 ~ 09:15] (2 times)
━━━━━━━━━━━━━━━━━━━
📌 [3/3] A-shares Stock Market: 1 item
1. [Wall Street News] A-shares midday commentary analysis [**5**] - [11:30 ~ 12:00] (2 times)
🆕 Newly added hot news (total 2 items)
**Baidu Hot Search** (1 item):
1. ChatGPT-5 officially released [**1**]
**Weibo** (1 item):
1. BYD monthly sales break record [**2**]
Last updated: 2025-01-15 12:30:15
#### Message Format Description
| Format Element | Example | Meaning | Description |
| ---------------- | --------------------------- | ------------- | ----------------------------------------- |
| 🔥📈📌 | 🔥 [1/3] AI ChatGPT | Popularity Level | 🔥 High popularity (≥10 items) 📈 Medium popularity (5-9 items) 📌 Normal popularity (<5 items) |
| [Index/Total] | [1/3] | Ranking Position | The ranking of the current phrase among all matched phrases |
| Frequency Phrase | AI ChatGPT | Keyword Group | Phrases in the configuration file, the title must contain these words |
| : N Items | : 2 Items | Match Count | The total number of news items matched by this phrase |
| [Platform Name] | [Baidu Hot Search] | Source Platform | The name of the platform to which the news belongs |
| 🆕 | 🆕 ChatGPT-5 Official Release | New Tag | Hot topics that appear for the first time in this round of scraping |
| [**Number**] | [**1**] | High Ranking | Hot searches with ranking ≤ threshold, displayed in red bold |
| [Number] | [7] | Normal Ranking | Hot searches with ranking > threshold, displayed normally |
| - Time | - 09:15 | First Time | The time when the news was first discovered |
| [Time~Time] | [08:30 ~ 10:45] | Duration | The time range from the first appearance to the last appearance |
| (N times) | (3 times) | Occurrence Frequency | The total number of occurrences during the monitoring period |
| **New Area** | 🆕 **New Hot News This Time** | New Topic Summary | A separate display of newly emerged hot topics in this round |
### 6. Docker Deployment
<details>
<summary>👉 Click to expand: <strong>Complete Guide to Docker Deployment</strong></summary>
<br>
**Image Description:**
TrendRadar provides two separate Docker images that can be deployed based on your needs:
| Image Name | Purpose | Description |
|------------|---------|-------------|
| `wantcat/trendradar` | News Push Service | Regularly fetches news and sends notifications (required) |
| `wantcat/trendradar-mcp` | AI Analysis Service | MCP protocol support, AI dialogue analysis (optional) |
> 💡 **Recommendation**:
> - If you only need the push functionality: Deploy only the `wantcat/trendradar` image
> - If you need AI analysis functionality: Deploy both images simultaneously
---
#### Method 1: Using docker-compose (Recommended)
1. **Create Project Directory and Configuration**:
**Method 1-A: Using git clone (Recommended, Easiest)**
```bash
# Clone the project to local
git clone https://github.com/sansan0/TrendRadar.git
cd TrendRadar
```
**Method 1-B: Using wget to download configuration files**
```bash
# Create directory structure
mkdir -p trendradar/{config,docker}
cd trendradar
# Download configuration file templates
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/config.yaml -P config/
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/frequency_words.txt -P config/
# Download docker-compose configuration
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/docker/.env -P docker/
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/docker/docker-compose.yml -P docker/
```
> 💡 **Note**: The key directory structure required for Docker deployment is as follows:
```
current_directory/
├── config/
│ ├── config.yaml
│ └── frequency_words.txt
└── docker/
├── .env
└── docker-compose.yml
```
2. **Configuration File Description**:
- `config/config.yaml` - Main application configuration (report mode, push settings, etc.)
- `config/frequency_words.txt` - Keyword configuration (set the hot topics you care about)
- `.env` - Environment variable configuration (webhook URLs and scheduled tasks)
**⚙️ Environment Variable Override Mechanism (v3.0.5+)**
If you encounter the issue of **configuration not taking effect after modifying `config.yaml`** in a NAS or other Docker environment, you can directly override the configuration using environment variables:
| Environment Variable | Corresponding Configuration | Example Value | Description |
|----------------------|-----------------------------|---------------|-------------|
| `ENABLE_CRAWLER` | `crawler.enable_crawler` | `true` / `false` | Whether to enable the crawler |
| `ENABLE_NOTIFICATION` | `notification.enable_notification` | `true` / `false` | Whether to enable notifications |
| `REPORT_MODE` | `report.mode` | `daily` / `incremental` / `current`| Report mode |
| `MAX_ACCOUNTS_PER_CHANNEL` | `notification.max_accounts_per_channel` | `3` | Maximum number of accounts per channel |
| `PUSH_WINDOW_ENABLED` | `notification.push_window.enabled` | `true` / `false` | Push time window switch |
| `PUSH_WINDOW_START` | `notification.push_window.time_range.start` | `08:00` | Push start time |
| `PUSH_WINDOW_END` | `notification.push_window.time_range.end` | `22:00` | Push end time |
| `ENABLE_WEBSERVER` | - | `true` / `false` | Whether to automatically start the web server |
| `WEBSERVER_PORT` | - | `8080` | Web server port (default 8080) |
| `FEISHU_WEBHOOK_URL` | `notification.webhooks.feishu_url` | `https://...` | Feishu Webhook (supports multiple accounts, separated by `;`) |
**Configuration Priority**: Environment Variables > config.yaml
**Usage**:
- Modify the `.env` file, uncomment and fill in the required configurations
- Or directly add in the "Environment Variables" section of the NAS/Synology Docker management interface
- Take effect after restarting the container: `docker-compose up -d`
3. **Start Services**:
**Option A: Start all services (Push + AI Analysis)**
```bash
# Pull the latest images
docker-compose pull
# Start all services (trend-radar + trend-radar-mcp)
docker-compose up -d
```
**Option B: Start only the news push service**
```bash
# Start only trend-radar (scheduled scraping and pushing)
docker-compose pull trend-radar
docker-compose up -d trend-radar
```
**Option C: Start only the MCP AI analysis service**
```bash
# Start only trend-radar-mcp (provides AI analysis interface)
docker-compose pull trend-radar-mcp
docker-compose up -d trend-radar-mcp
```
> 💡 **Tip**:
> - Most users only need to start `trend-radar` to achieve news push functionality
> - Only start `trend-radar-mcp` when you need to use Claude/ChatGPT for AI dialogue analysis
> - The two services are independent and can be flexibly combined based on needs
4. **Check Running Status**:
```bash
# View logs for the news push service
docker logs -f trend-radar
# View logs for the MCP AI analysis service
docker logs -f trend-radar-mcp
# View status of all containers
docker ps | grep trend-radar
# Stop specific services
docker-compose stop trend-radar # Stop push service
docker-compose stop trend-radar-mcp # Stop MCP service
```
#### Method 2: Local Build (Developer Option)
If you need to customize the code or build your own image:
```bash
# Clone the Project
git clone https://github.com/sansan0/TrendRadar.git
cd TrendRadar
# Modify Configuration Files
vim config/config.yaml
vim config/frequency_words.txt
# Using the Build Version of docker-compose
cd docker
cp docker-compose-build.yml docker-compose.yml
```
**Build and Start the Services**:
```bash
# Option A: Build and Start All Services
docker-compose build
docker-compose up -d
# Option B: Build and Start the News Push Service Only
docker-compose build trend-radar
docker-compose up -d trend-radar
# Option C: Build and Start the MCP AI Analysis Service Only
```bash
docker-compose build trend-radar-mcp
docker-compose up -d trend-radar-mcp
```
> 💡 **Architecture Parameter Description**:
> - By default, builds the `amd64` architecture image (suitable for most x86_64 servers)
> - To build the `arm64` architecture (Apple Silicon, Raspberry Pi, etc.), set the environment variable:
> ```bash
> export DOCKER_ARCH=arm64
> docker-compose build
> ```
#### Image Update
```bash
# Method 1: Manual Update (Crawler + MCP Image)
docker pull wantcat/trendradar:latest
docker pull wantcat/trendradar-mcp:latest
docker-compose down
docker-compose up -d
# Method 2: Update using docker-compose
```bash
docker-compose pull
docker-compose up -d
```
**Available Images**:
| Image Name | Purpose | Description |
|------------|---------|-------------|
| `wantcat/trendradar` | News Push Service | Regularly fetch news and push notifications |
| `wantcat/trendradar-mcp` | MCP Service | AI analysis functionality (optional) |
#### Service Management Commands
```bash
# View Running Status
docker exec -it trend-radar python manage.py status
# Manually Execute the Crawler
docker exec -it trend-radar python manage.py run
# View Real-time Logs
docker exec -it trend-radar python manage.py logs
# Display Current Configuration
docker exec -it trend-radar python manage.py config
# Display Output File
docker exec -it trend-radar python manage.py files
# Web Server Management (for Browser Access to Generated Reports)
docker exec -it trend-radar python manage.py start_webserver # Start Web Server
docker exec -it trend-radar python manage.py stop_webserver # Stop Web Server
docker exec -it trend-radar python manage.py webserver_status # Check Web Server Status
# View Help Information
docker exec -it trend-radar python manage.py help
# Restart the Container
docker restart trend-radar
# Stop Container
docker stop trend-radar
# Remove Container (Keep Data)
docker rm trend-radar
```
> 💡 **Web Server Instructions**:
> - After starting, you can access the latest report via the browser at `http://localhost:8080`
> - Access historical reports through directory navigation (e.g., `http://localhost:8080/2025年xx月xx日/`)
> - The port can be configured in the `.env` file with the `WEBSERVER_PORT` parameter
> - Auto-start: Set `ENABLE_WEBSERVER=true` in the `.env`
> - Security Note: Only static file access is provided, restricted to the output directory, and bound to local access only
#### Data Persistence
The generated reports and data are saved by default in the `./output` directory, and the data will be retained even if the container is restarted or deleted.
**📊 Web Report Access Paths**:
The daily summary HTML report generated by TrendRadar will be saved in two locations simultaneously:
| File Location | Access Method | Applicable Scenarios |
|---------------|---------------|----------------------|
| `output/index.html` | Direct access from the host | **Docker Deployment** (visible to the host via Volume mount) |
| `index.html` | Access from the root directory | **GitHub Pages** (repository root, automatically recognized by Pages) |
| `output/YYYY年MM月DD日/html/当日汇总.html` | Access to historical reports | All environments (archived by date) |
**Local Access Example**:
```bash
# Method 1: Access via Web Server (Recommended, Docker Environment)
# 1. Start the Web Server
docker exec -it trend-radar python manage.py start_webserver
# 2. Accessing in the Browser
http://localhost:8080 # Access the latest report (default index.html)
http://localhost:8080/2025年xx月xx日/ # Access the report for a specific date
http://localhost:8080/2025年xx月xx日/html/ # Browse all HTML files for that date
# Method 2: Open the file directly (Local Environment)
open ./output/index.html # macOS
start ./output/index.html # Windows
xdg-open ./output/index.html # Linux
# Method 3: Access Historical Archive
open ./output/2025年xx月xx日/html/当日汇总.html
```
**Why are there two index.html files?**
- `output/index.html`: Docker Volume mounted to the host machine, can be opened directly locally
- `index.html`: Pushed to the repository by GitHub Actions, automatically deployed by GitHub Pages
> 💡 **Tip**: The contents of both files are exactly the same, you can access either one.
#### Troubleshooting
```bash
```
# Check Container Status
docker inspect trend-radar
# View Container Logs
docker logs --tail 100 trend-radar
# Entering Container for Debugging
docker exec -it trend-radar /bin/bash
# Verify Configuration File
docker exec -it trend-radar ls -la /app/config/
```
#### MCP Service Deployment (AI Analysis Function)
If you need to use the AI analysis function, you can deploy a standalone MCP service container.
**Architecture Description**:
```mermaid
flowchart TB
subgraph trend-radar["trend-radar"]
A1[Scheduled News Fetching]
A2[Push Notifications]
end
subgraph trend-radar-mcp["trend-radar-mcp"]
B1[127.0.0.1:3333]
B2[AI Analysis API]
end
subgraph shared["Shared Volume"]
C1["config/ (ro)"]
C2["output/ (ro)"]
end
trend-radar --> shared
trend-radar-mcp --> shared
```
**Quick Start**:
Use docker-compose to start both the news push and MCP services simultaneously:
```bash
# Download the latest docker-compose.yml (which includes MCP service configuration)
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/docker/docker-compose.yml
# Start All Services
docker-compose up -d
# View Running Status
docker ps | grep trend-radar
```
**Start MCP Service Separately**:
```bash
docker run -d --name trend-radar-mcp \
-p 127.0.0.1:3333:3333 \
-v ./config:/app/config:ro \
-v ./output:/app/output:ro \
-e TZ=Asia/Shanghai \
wantcat/trendradar-mcp:latest
```
**Verify Service**:
```bash
# Check if the MCP Service is Running Properly
curl http://127.0.0.1:3333/mcp
# View MCP Service Logs
docker logs -f trend-radar-mcp
```
**Configure in AI Client**:
After the MCP service starts, configure in clients such as Claude Desktop, Cherry Studio, Cursor, etc.:
```json
{
"mcpServers": {
"trendradar": {
"url": "http://127.0.0.1:3333/mcp",
"description": "TrendRadar News Hotspot Analysis"
}
}
}
```
> 💡 **Tip**: The MCP service only listens on the local port (127.0.0.1) for security reasons. If remote access is needed, please configure a reverse proxy and authentication yourself.
</details>
### 7. Report Configuration
<details>
<summary>👉 Click to expand: <strong>Report Related Parameter Configuration</strong></summary>
<br>
**Configuration Location:** The `report` section of `config/config.yaml`
```yaml
report:
mode: "daily" # Push mode
rank_threshold: 5 # Ranking highlight threshold
sort_by_position_first: false # Sorting priority
max_news_per_keyword: 0 # Maximum display quantity per keyword
reverse_content_order: false # Content order configuration
```
</details>
#### Configuration Item Details
| Configuration Item | Type | Default Value | Description |
|---------------------|--------|---------------|-------------|
| `mode` | string | `daily` | Push mode, options are `daily`/`incremental`/`current`, see [Push Mode Details](#3-推送模式详解) for more information |
| `rank_threshold` | int | `5` | Ranking highlight threshold, news with a ranking ≤ this value will be displayed in bold |
| `sort_by_position_first` | bool | `false` | Sorting priority: `false` = sort by the number of hot topics, `true` = sort by configured position |
| `max_news_per_keyword` | int | `0` | Maximum display quantity per keyword, `0` = no limit |
| `reverse_content_order` | bool | `false` | Content order: `false` = hot vocabulary statistics first, `true` = new hot news first |
#### Content Order Configuration (Added in v3.5.0)
Controls the display order of two parts of content in push messages and HTML reports:
| Configuration Value | Display Order |
|---------------------|---------------|
| `false` (default) | ① Hot Keywords Statistics → ② New Hot News |
| `true` | ① New Hot News → ② Hot Keywords Statistics |
**Applicable Scenarios:**
- `false` (default): Suitable for users who focus on keyword matching results, viewing category statistics first.
- `true`: Suitable for users who focus on the latest updates, prioritizing new hot news.
**Docker Environment Variable:**
```bash
REVERSE_CONTENT_ORDER=true
```
#### Sorting Priority Configuration
**Example Scenario:** Configuration order A, B, C, Hotspot count A(3 items), B(10 items), C(5 items)
| Configuration Value | Display Order | Applicable Scenario |
|---------------------|---------------|---------------------|
| `false` (default) | B(10 items) → C(5 items) → A(3 items) | Focus on popularity trends |
| `true` | A(3 items) → B(10 items) → C(5 items) | Focus on personal priority |
**Docker Environment Variables:**
```bash
SORT_BY_POSITION_FIRST=true
MAX_NEWS_PER_KEYWORD=10
```
### 8. Push Time Window Configuration
<details>
<summary>👉 Click to expand: <strong>Detailed Explanation of Push Time Window Control</strong></summary>
<br>
**Configuration Location:** The `notification.push_window` section in `config/config.yaml`
```yaml
notification:
push_window:
enabled: false # Whether to enable
time_range:
start: "20:00" # Start time (Beijing Time)
end: "22:00" # End time (Beijing Time)
once_per_day: true # Push only once per day
push_record_retention_days: 7 # Number of days to retain push records
```
#### Configuration Item Details
| Configuration Item | Type | Default Value | Description |
|---------------------|------|---------------|-------------|
| `enabled` | bool | `false` | Whether to enable push time window control |
| `time_range.start` | string | `"20:00"` | Push time window start time (Beijing Time, HH:MM format) |
| `time_range.end` | string | `"22:00"` | Push time window end time (Beijing Time, HH:MM format) |
| `once_per_day` | bool | `true` | `true`=push only once within the window each day, `false`=push every time executed within the window |
| `push_record_retention_days` | int | `7` | Number of days to retain push records (used to determine if it has been pushed) |
#### Usage Scenarios
| Scenario | Configuration Example |
|----------|-----------------------|
| **Work Time Push** | `start: "09:00"`, `end: "18:00"`, `once_per_day: false` |
| **Evening Summary Push** | `start: "20:00"`, `end: "22:00"`, `once_per_day: true` |
| **Lunch Break Push** | `start: "12:00"`, `end: "13:00"`, `once_per_day: true` |
#### Important Notice
> ⚠️ **Attention GitHub Actions Users:**
> - The execution time of GitHub Actions is unstable and may vary by ±15 minutes.
> - It is recommended to allow at least **2 hours** for the time range.
> - If you want precise scheduled pushes, it is recommended to use **Docker deployment** on a personal server.
#### Docker Environment Variables
```bash
PUSH_WINDOW_ENABLED=true
PUSH_WINDOW_START=09:00
PUSH_WINDOW_END=18:00
PUSH_WINDOW_ONCE_PER_DAY=false
PUSH_WINDOW_RETENTION_DAYS=7
```
#### Complete Configuration Example
**Scenario: Push summary once every day between 8 PM and 10 PM**
```yaml
notification:
push_window:
enabled: true
time_range:
start: "20:00"
end: "22:00"
once_per_day: true
push_record_retention_days: 7
```
**Scenario: Push every hour during working hours**
```yaml
notification:
push_window:
enabled: true
time_range:
start: "09:00"
end: "18:00"
once_per_day: false
push_record_retention_days: 7
```
### 9. Execution Frequency Configuration
<details>
<summary>👉 Click to expand: <strong>Automatic Run Frequency Settings</strong></summary>
<br>
**Configuration Location:** The `schedule` section of `.github/workflows/crawler.yml`
```yaml
on:
schedule:
- cron: "0 * * * *" # Runs once every hour
```
#### What is a Cron Expression?
Cron is a format for scheduled tasks, consisting of 5 parts: `Minute Hour Day Month Week`
```
┌───────────── Minute (0-59)
│ ┌───────────── Hour (0-23)
│ │ ┌───────────── Day (1-31)
│ │ │ ┌───────────── Month (1-12)
│ │ │ │ ┌───────────── Week (0-6, 0=Sunday)
│ │ │ │ │
* * * * *
```
#### Common Configuration Examples
| Desired Effect | Cron Expression | Description |
|----------------|------------------|-------------|
| Run every hour | `0 * * * *` | Runs at the 0th minute of every hour (default) |
| Run every 30 minutes | `*/30 * * * *` | Runs once every 30 minutes |
| Run at 8 AM every day | `0 0 * * *` | UTC 0:00 = Beijing time 8:00 |
| Run during working hours | `*/30 0-14 * * *` | Beijing 8:00-22:00, every 30 minutes |
| Run 3 times a day | `0 0,6,12 * * *` | Beijing 8:00, 14:00, 20:00 |
#### Important Notes
> ⚠️ **Time Zone Notice**: GitHub Actions uses **UTC time**, Beijing time needs to be **subtract 8 hours**
> - To run at 8:00 Beijing time → set to UTC 0:00
> - To run at 20:00 Beijing time → set to UTC 12:00
> ⚠️ **Rate Limiting**: GitHub has limits on the number of Actions runs per account
> - **Recommendation**: Do not set intervals shorter than 30 minutes
> - **Reason**: Running too frequently may be considered abuse, risking account suspension
> - **Actual Situation**: GitHub Actions execution time itself has deviations, so setting it too precisely is not very meaningful
#### Modification Method
1. Open your forked repository
2. Locate the `.github/workflows/crawler.yml` file
3. Click on edit (pencil icon)
4. Modify the expression in `cron: "0 * * * *"`
5. Click "Commit changes" to save
</details>
### 10. Multi-Account Push Configuration
<details>
<summary>👉 Click to expand: <strong>Detailed Explanation of Multi-Account Push Configuration</strong></summary>
> ### ⚠️ **Security Warning**
> **GitHub Fork users should not configure push information in `config.yaml`!**
>
> - **Risk Explanation**: `config.yaml` will be committed to a public Git repository, and configuring push information (Webhook URL, Token, etc.) will expose sensitive data.
> - **Recommended Methods**:
> - **GitHub Actions users** → Use GitHub Secrets environment variables.
> - **Docker users** → Use [`.env` file configuration](#6-docker-deployment) (the `.env` file is already in `.gitignore` and will not be committed).
> - **Local development users**: You can configure in `config.yaml` (ensure it will not be pushed to a public repository).
#### Supported Channels
| Channel | Configuration Item | Pairing Required | Description |
|---------|--------------------|------------------|-------------|
| **Feishu** | `feishu_url` | No | Multiple webhook URLs |
| **DingTalk** | `dingtalk_url` | No | Multiple webhook URLs |
| **WeChat Work** | `wework_url` | No | Multiple webhook URLs |
| **Telegram** | `telegram_bot_token` + `telegram_chat_id` | ✅ Yes | The number of token and chat_id must be the same |
| **ntfy** | `ntfy_topic` + `ntfy_token` | ✅ Yes | The number of topic and token must be the same (token is optional) |
| **Bark** | `bark_url` | No | Multiple push URLs |
| **Slack** | `slack_webhook_url` | No | Multiple webhook URLs |
| **Email** | `email_to` | - | Supports multiple recipients (comma-separated), no modification needed |
#### Recommended Configuration Method 1: GitHub Actions Environment Variables
**Configuration Location**: GitHub Repo → Settings → Secrets and variables → Actions → Repository secrets
**Basic Configuration Example**:
```bash
# Multi-Account Limit
MAX_ACCOUNTS_PER_CHANNEL=3
# Feishu Multiple Accounts (3 Groups)
FEISHU_WEBHOOK_URL=https://hook1.feishu.cn/xxx;https://hook2.feishu.cn/yyy;https://hook3.feishu.cn/zzz
# Dingtalk Multiple Accounts (2 Groups)
DINGTALK_WEBHOOK_URL=https://oapi.dingtalk.com/xxx;https://oapi.dingtalk.com/yyy
# WeChat Work Multiple Accounts (2 Groups)
WEWORK_WEBHOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx;https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=yyy
# Bark Multiple Accounts (2 Devices)
BARK_URL=https://api.day.app/key1;https://api.day.app/key2
# Slack Multiple Accounts (2 Channels)
SLACK_WEBHOOK_URL=https://hooks.slack.com/xxx;https://hooks.slack.com/yyy
```
**Pairing Configuration Example (Telegram and ntfy)**:
<details>
<summary><strong>Telegram Pairing Configuration</strong></summary>
```bash
# ✅ Correct Configuration: 2 tokens corresponding to 2 chat_ids
TELEGRAM_BOT_TOKEN=123456:AAA-BBB;789012:CCC-DDD
TELEGRAM_CHAT_ID=-100111;-100222
# ❌ Incorrect Configuration: Inconsistent Quantity, Push Will Be Skipped
TELEGRAM_BOT_TOKEN=token1;token2;token3
TELEGRAM_CHAT_ID=id1;id2
```
**Note**: The number of `token` and `chat_id` must be exactly the same; otherwise, the push for this channel will be skipped.
</details>
<details>
<summary><strong>ntfy Pair Configuration</strong></summary>
```bash
# ✅ Correct Configuration: 3 topics, only the 2nd one requires a token
NTFY_TOPIC=topic1;topic2;topic3
NTFY_TOKEN=;token_for_topic2;
# ✅ Correct Configuration: Both topics require tokens
NTFY_TOPIC=topic1;topic2
NTFY_TOKEN=token1;token2
# ❌ Incorrect Configuration: Mismatch between topic and token Count
NTFY_TOPIC=topic1;topic2
NTFY_TOKEN=token1;token2;token3
```
**Note**:
- If a topic does not require a token, leave the corresponding position empty (between the two semicolons)
- The number of `topic` and `token` must be the same
</details>
---
#### Recommended Configuration Method 2: Docker Environment Variables (.env)
**Configuration Location**: Project root directory `docker/.env` file
**Basic Configuration Example**:
```bash
# Multi-Account Limit
MAX_ACCOUNTS_PER_CHANNEL=3
# Feishu Multiple Accounts (3 Groups)
FEISHU_WEBHOOK_URL=https://hook1.feishu.cn/xxx;https://hook2.feishu.cn/yyy;https://hook3.feishu.cn/zzz
# DingTalk Multiple Accounts (2 Groups)
DINGTALK_WEBHOOK_URL=https://oapi.dingtalk.com/xxx;https://oapi.dingtalk.com/yyy
# WeChat Work Multiple Accounts (2 Groups)
WEWORK_WEBHOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx;https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=yyy
# Bark Multiple Accounts (2 Devices)
BARK_URL=https://api.day.app/key1;https://api.day.app/key2
# Slack Multiple Accounts (2 Channels)
SLACK_WEBHOOK_URL=https://hooks.slack.com/xxx;https://hooks.slack.com/yyy
```
**Pairing Configuration Example (Telegram and ntfy)**:
<details>
<summary><strong>Telegram Pairing Configuration</strong></summary>
```bash
# ✅ Correct Configuration: 2 tokens corresponding to 2 chat_ids
TELEGRAM_BOT_TOKEN=123456:AAA-BBB;789012:CCC-DDD
TELEGRAM_CHAT_ID=-100111;-100222
# ❌ Incorrect Configuration: Inconsistent Quantity, Push Will Be Skipped
TELEGRAM_BOT_TOKEN=token1;token2;token3
TELEGRAM_CHAT_ID=id1;id2
```
**Note**: The number of `token` and `chat_id` must be exactly the same; otherwise, the push for this channel will be skipped.
</details>
<details>
<summary><strong>ntfy Pair Configuration</strong></summary>
```bash
# ✅ Correct Configuration: 3 topics, only the 2nd requires a token
NTFY_TOPIC=topic1;topic2;topic3
NTFY_TOKEN=;token_for_topic2;
# ✅ Correct Configuration: Both topics require tokens
NTFY_TOPIC=topic1;topic2
NTFY_TOKEN=token1;token2
# ❌ Incorrect Configuration: The number of topics and tokens do not match
NTFY_TOPIC=topic1;topic2
NTFY_TOKEN=token1;token2;token3
```
**Note**:
- If a topic does not require a token, leave the corresponding position empty (between the two semicolons)
- The number of `topic` and `token` must be the same
</details>
---
#### Push Behavior Description
1. **Independent Push**: Each account sends independently; a failure does not affect other accounts.
2. **Partial Success Determination**: As long as one account sends successfully, the overall result is considered successful.
3. **Log Differentiation**: When multiple accounts are used, the logs will display labels such as "Account 1", "Account 2", etc.
4. **Batch Interval**: Multiple accounts will increase the total sending time (the batch interval is calculated independently for each account).
#### Frequently Asked Questions
<details>
<summary><strong>Q1: What happens if there are more than 3 accounts?</strong></summary>
<br>
The system will automatically truncate to the configured maximum number and output a warning log. You can adjust the limit through `max_accounts_per_channel`.
**⚠️ Attention GitHub Actions users**:
- **It is not recommended to configure too many accounts** (suggested not to exceed 3), as it may lead to:
- **Triggering GitHub Actions rate limits**: Frequent network requests may be recognized as abnormal behavior
- **Potential account risks**: Excessive use of GitHub Actions resources may affect account status
</details>
<details>
<summary><strong>Q2: Will multiple accounts affect push speed?</strong></summary>
<br>
Yes. Each account sends independently, total time = number of accounts × time per account. It is recommended to control the number of accounts.
</details>
<details>
<summary><strong>Q3: How should local development users configure in config.yaml?</strong></summary>
<br>
If you are developing locally and **will not push the code to a public repository**, you can configure directly in `config/config.yaml`:
```yaml
notification:
enable_notification: true
max_accounts_per_channel: 3
webhooks:
feishu_url: "https://hook1.feishu.cn/xxx;https://hook2.feishu.cn/yyy"
telegram_bot_token: "token1;token2"
telegram_chat_id: "id1;id2"
```
**⚠️ Important Reminder**:
- Ensure that `config/config.yaml` is in `.gitignore` (if you will submit code)
- Or only use it in the local development environment, **never submit to a public repository**
</details>
</details>
<br>
## 🤖 AI Intelligent Analysis
TrendRadar v3.0.0 introduces AI analysis features based on **MCP (Model Context Protocol)**, allowing you to engage in deep analysis of news data through natural language conversations.
### ⚠️ Read Before Use
**Important Note: AI features require local news data support**
The AI analysis functionality **does not** directly query real-time data from the internet, but rather analyzes the **locally accumulated news data** (stored in the `output` folder).
#### Usage Instructions:
1. **Test Data Included**: The `output` directory by default contains news data from **November 1 to November 15, 2025**, which can be used for a quick experience of AI features.
2. **Query Limitations**:
- ✅ You can only query data within the existing date range (November 1-15).
- ❌ Real-time news or future dates cannot be queried.
3. **Getting the Latest Data**:
- The test data is only for quick experience; **it is recommended to deploy the project yourself** to obtain real-time data.
- Follow the [Quick Start](#-快速开始) to deploy and run the project.
- After accumulating news data for at least 1 day, you can query the latest hot topics.
### 1. Quick Deployment
Cherry Studio provides a GUI configuration interface for quick deployment in 5 minutes, with complex parts available for one-click installation.
**Image and Text Deployment Tutorial**: Now updated on my [public account](#问题答疑与交流), reply with "mcp" to access.
**Detailed Deployment Tutorial**: [README-Cherry-Studio.md](README-Cherry-Studio.md)
**Deployment Mode Description**:
- **STDIO Mode (Recommended)**: After one-time configuration, no need for repeated configurations. The **Image and Text Deployment Tutorial** uses this mode as an example.
- **HTTP Mode (Alternative)**: If you encounter issues with the STDIO mode configuration, you can use HTTP mode. The configuration method for this mode is basically the same as STDIO, but the content to copy and paste is just one line, reducing the chance of errors. The only thing to note is that the service needs to be manually started each time before use. For details, please refer to the HTTP mode description at the bottom of [README-Cherry-Studio.md](README-Cherry-Studio.md).
### 2. Learning the Posture for AI Conversations
**Detailed Conversation Tutorial**: [README-MCP-FAQ.md](README-MCP-FAQ.md)
<details>
<summary>👉 Click to expand: <strong>View AI Conversation Example Image</strong></summary>
<br>
> 💡 **Tip**: It is generally not recommended to ask multiple questions at once. If the AI model you choose cannot handle the sequential calls shown in the image below, it is advisable to switch to another one.
<img src="/_image/ai3.png" alt="mcp usage effect image" width="600">
</details>
<br>
## 🔌 MCP Client
TrendRadar MCP service supports the standard Model Context Protocol (MCP), allowing various AI clients that support MCP to connect for intelligent analysis.
### Supported Clients
**Notes**:
- Replace `/path/to/TrendRadar` with the actual path of your project
- Use double backslashes for Windows paths: `C:\\Users\\YourName\\TrendRadar`
- Remember to restart after saving
<details>
<summary>👉 Click to expand: <b>Claude Desktop</b></summary>
#### Configuration File Method
Edit the MCP configuration file for Claude Desktop:
**Windows**:
`%APPDATA%\Claude\claude_desktop_config.json`
**Mac**:
`~/Library/Application Support/Claude/claude_desktop_config.json`
**Configuration Content**:
```json
{
"mcpServers": {
"trendradar": {
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
],
"env": {},
"disabled": false,
"alwaysAllow": []
}
}
}
```
</details>
<details>
<summary>👉 Click to expand: <b>Cursor</b></summary>
#### Method 1: HTTP Mode
1. **Start HTTP Service**:
```bash
# Windows
start-http.bat
# Mac/Linux
./start-http.sh
```
2. **Configure Cursor**:
**Project-level Configuration** (Recommended):
Create a `.cursor/mcp.json` in the project root directory:
```json
{
"mcpServers": {
"trendradar": {
"url": "http://localhost:3333/mcp",
"description": "TrendRadar news hotspot aggregation analysis"
}
}
}
```
**Global Configuration**:
Create a `~/.cursor/mcp.json` in the user directory (same content)
3. **Usage Steps**:
- Restart Cursor after saving the configuration file
- Check the connected tools in the "Available Tools" section of the chat interface
- Start using: `Search for today's news related to "AI"`
#### Method Two: STDIO Mode (Recommended)
Create `.cursor/mcp.json`:
```json
{
"mcpServers": {
"trendradar": {
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
]
}
}
}
```
</details>
<details>
<summary>👉 Click to expand: <b>VSCode (Cline/Continue)</b></summary>
#### Cline Configuration
Add to the MCP settings of Cline:
**HTTP Mode**:
```json
{
"trendradar": {
"url": "http://localhost:3333/mcp",
"type": "streamableHttp",
"autoApprove": [],
"disabled": false
}
}
```
**STDIO Mode** (recommended):
```json
{
"trendradar": {
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
],
"type": "stdio",
"disabled": false
}
}
```
#### Continue Configuration
Edit `~/.continue/config.json`:
```json
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
]
}
}
]
}
}
```
**Usage Examples**:
```
Analyze the trend of "Tesla" popularity changes over the last 7 days
Generate today's hot topic summary report
Search for news related to "Bitcoin" and analyze sentiment tendency
```
</details>
<details>
<summary>👉 Click to expand: <b>Claude Code CLI</b></summary>
#### HTTP Mode Configuration
```bash
# 1. Start HTTP Service
# Windows: start-http.bat
# Mac/Linux: ./start-http.sh
# 2. Add MCP Server
claude mcp add --transport http trendradar http://localhost:3333/mcp
# 3. Verify Connection (Ensure the Service is Started)
claude mcp list
```
#### Usage Example
```bash
# Query News
claude "Search today's trending news on Zhihu, top 10"
# Trend Analysis
claude "Analyze the trend of the topic 'artificial intelligence' over the past week"
# Data Comparison
claude "Compare the attention to 'Bitcoin' on Zhihu and Weibo platforms"
```
</details>
<details>
<summary>👉 Click to expand: <b>MCP Inspector</b> (Debugging Tool)</summary>
<br>
MCP Inspector is the official debugging tool used for testing MCP connections:
#### Usage Steps
1. **Start the TrendRadar HTTP Service**:
```bash
# Windows
start-http.bat
# Mac/Linux
./start-http.sh
```
2. **Start the MCP Inspector**:
```bash
npx @modelcontextprotocol/inspector
```
3. **Connect in the Browser**:
- Visit: `http://localhost:3333/mcp`
- Test the "Ping Server" feature to verify the connection
- Check if "List Tools" returns 13 tools:
- Basic Queries: get_latest_news, get_news_by_date, get_trending_topics
- Intelligent Retrieval: search_news, search_related_news_history
- Advanced Analytics: analyze_topic_trend, analyze_data_insights, analyze_sentiment, find_similar_news, generate_summary_report
- System Management: get_current_config, get_system_status, trigger_crawl
</details>
<details>
<summary>👉 Click to expand: <b>Other Clients Supporting MCP</b></summary>
<br>
Any client that supports Model Context Protocol can connect to TrendRadar:
#### HTTP Mode
**Service Address**: `http://localhost:3333/mcp`
**Basic Configuration Template**:
```json
{
"name": "trendradar",
"url": "http://localhost:3333/mcp",
"type": "http",
"description": "News Hotspot Aggregation Analysis"
}
```
#### STDIO Mode (Recommended)
**Basic Configuration Template**:
```json
{
"name": "trendradar",
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
],
"type": "stdio"
}
```
**Notes**:
- Replace `/path/to/TrendRadar` with the actual project path
- Use backslashes to escape Windows paths: `C:\\Users\\...`
- Ensure that project dependencies have been installed (the setup script has been run)
### Frequently Asked Questions
<details>
<summary>👉 Click to expand: <b>Q1: HTTP service cannot start?</b></summary>
<br>
**Check Steps**:
1. Confirm that port 3333 is not occupied:
```bash
# Windows
netstat -ano | findstr :3333
# Mac/Linux
lsof -i :3333
```
2. Check if project dependencies are installed:
```bash
# Re-run the installation script
# Windows: setup-windows.bat or setup-windows-en.bat
# Mac/Linux: ./setup-mac.sh
```
3. View detailed error logs:
```bash
uv run python -m mcp_server.server --transport http --port 3333
```
4. Try a custom port:
```bash
uv run python -m mcp_server.server --transport http --port 33333
```
</details>
<details>
<summary>👉 Click to expand: <b>Q2: Client cannot connect to MCP service?</b></summary>
<br>
**Solutions**:
1. **STDIO Mode**:
- Confirm the UV path is correct (run `which uv` or `where uv`)
- Ensure the project path is correct and does not contain Chinese characters
- Check the client error logs
2. **HTTP Mode**:
- Confirm the service is running (access `http://localhost:3333/mcp`)
- Check firewall settings
- Try using 127.0.0.1 instead of localhost
3. **General Checks**:
- Restart the client application
- Check the MCP service logs
- Use MCP Inspector to test the connection
</details>
<details>
<summary>👉 Click to expand: <b>Q3: Tool invocation failed or returned an error?</b></summary>
<br>
**Possible Reasons**:
1. **Data does not exist**:
- Confirm that the crawler has been run (there is data in the output directory)
- Check if there is data in the queried date range
- View the available dates in the output directory
2. **Parameter errors**:
- Check the date format: `YYYY-MM-DD`
- Confirm the platform ID is correct: `zhihu`, `weibo`, etc.
- Refer to the parameter descriptions in the tool documentation
3. **Configuration issues**:
- Confirm that `config/config.yaml` exists
- Confirm that `config/frequency_words.txt` exists
- Check if the configuration file format is correct
</details>
<br>
## ☕ Q&A and Communication
> If you want to support this project, you can search for **Tencent Charity** on WeChat and donate to any of the **Educational Assistance** related projects as you wish.
>
> Thanks to all the friends who participated in **One Yuan Like**, you have been included in the top **Acknowledgment List**! Your support motivates the maintenance of open source, and the personal reward code has been removed.
- **GitHub Issues**: Suitable for targeted answers. Please provide complete information (screenshots, error logs, system environment, etc.) when asking questions.
- **Public Account Communication**: Suitable for quick inquiries. It is recommended to communicate in the public comment section under relevant articles first; if messaging privately, please use polite language 😉
- 💡 Successfully deployed? Come share your experience on the public account; your likes and comments are my motivation to continue updating~
<div align="center">
| Follow the Public Account |
|:---:|
| <img src="_image/weixin.png" width="400" title="Silicon-based Tea Room"/> |
</div>
<br>
## 🪄 Sponsors
> **302.AI** is a pay-as-you-go enterprise-level AI resource platform
> It provides the latest and most comprehensive **AI models** and **APIs** on the market, as well as a variety of out-of-the-box online AI applications.
<div align="center">
[](https://share.302.ai/mEOUzG)
<a href="https://share.302.ai/mEOUzG" target="_blank">
<img src="_image/banner-302ai-zh.jpg" alt="302.AI" width="700"/>
</a>
</div>
<details id="sponsor-tutorial">
<summary>👉 Click to expand: <b>302.AI Usage Tutorial</b></summary>
<br>
> The $1 received can be used to call various large AI models (such as Claude, GPT, etc.)
> The AI analysis feature of this project requires configuration for large model usage. For configuration tutorials, see [AI Intelligent Analysis](#-ai-智能分析).
### Step 1: Obtain API Key
1. After registration, go to the upper right corner [Management Dashboard](https://302.ai/dashboard/overview)
2. Click on [API Keys](https://302.ai/apis/list) on the left side
3. Find the default API KEY at the bottom of the page, **click the eye icon to view**, and then copy it
(⚠️ Note: Do not click the copy button on the far right)
### Step 2: Configure in Cherry Studio
1. Open Cherry Studio and go to settings.
2. Select the model provider **"302.AI"**.
3. Paste the API Key you just copied.
4. Click **Manage**, and now you can use all supported AI models.
**Tip:** Cherry Studio has natively integrated 302.AI, and you will see the complete model list after configuration.
**Q: How long can I use the $1 free quota?**
A: It depends on the usage frequency and model selection; you can conduct multiple test experiences.
**Q: What should I do after the free quota is used up?**
A: You can recharge as needed and pay per usage. Currently, the prices for major models are relatively affordable.
</details>
> Tracking so many hot topics every day, does writing reports and replying to messages make your wrist tired?
> Try "Shandian Shuo" AI voice input method — speaking is 4 times faster than typing ⚡. From following hot topics to outputting content, double your efficiency 👇
<div align="center">
[](https://shandianshuo.cn) [](https://shandianshuo.cn)
<a href="https://shandianshuo.cn" target="_blank">
<img src="_image/banner-shandianshuo.png" alt="Shandian Shuo" width="700"/>
</a>
</div>
---
<br>
## 📚 Project Related
> **4 Articles**:
- [You can leave comments below this article for the project author to answer questions via mobile](https://mp.weixin.qq.com/s/KYEPfTPVzZNWFclZh4am_g)
- [Breaking 1000 stars in 2 months: My practical experience in promoting GitHub projects](https://mp.weixin.qq.com/s/jzn0vLiQFX408opcfpPPxQ)
- [Notes on running this project after forking on GitHub](https://mp.weixin.qq.com/s/C8evK-U7onG1sTTdwdW2zg)
- [How to write articles for public accounts or news information based on this project](https://mp.weixin.qq.com/s/8ghyfDAtQZjLrnWTQabYOQ)
> **AI Development**:
- If you have niche needs, you can definitely develop based on my project, even those with zero programming background can give it a try
- All my open-source projects use my own **AI-assisted software** to enhance development efficiency to some extent, and this tool has been open-sourced
- **Core Functionality**: Quickly filter project code to feed to AI; you only need to supplement with your personal requirements
- **Project Address**: https://github.com/sansan0/ai-code-context-helper
### Other Projects
> 📍 Chairman Mao's Footprint Map - An interactive dynamic display of the complete trajectory from 1893 to 1976. Comrades are welcome to contribute data.
- https://github.com/sansan0/mao-map
> Bilibili comment section data visualization and analysis software.
- https://github.com/sansan0/bilibili-comment-analyzer
### Project Flowchart
```mermaid
flowchart TD
A[👤 User Starts] --> B{🚀 Choose Deployment Method}
B -->|Cloud Deployment| C1[🍴 Fork Project to GitHub]
B -->|Local Deployment| C2[🐳 Docker Deployment]
C1 --> D[⚙️ Configure Notification Channels<br/>Multiple configurations allowed]
C2 --> D
D --> E[Choose Notification Methods:<br/>📱 WeChat 💬 Feishu 🔔 DingTalk<br/>📟 Telegram 📧 Email]
E --> F[🔑 Fill in Notification Parameters<br/>GitHub Secrets or Environment Variables]
F --> G[📝 Configure Keywords<br/>config/frequency_words.txt<br/>Common Words/Must Words+/Filter Words!]
G --> H[🎯 Choose Running Mode<br/>config/config.yaml]
H --> H1[📋 daily - Daily Summary<br/>Scheduled push of all matching news]
H --> H2[📰 current - Current Rankings<br/>Scheduled push of the latest rankings]
H --> H3[📈 incremental - Incremental Monitoring<br/>Only push new content]
H1 --> I[Optional: Control Push Time Window<br/>⏰ Limit push time range]
H2 --> I
H3 --> I
I --> J[✅ Configuration Complete]
J --> K[🤖 System Runs Automatically]
K --> L[🕷️ Crawl Hot Topics from 11+ Platforms]
L --> M[🔍 Keyword Filtering]
M --> N[⚖️ Weight Algorithm Sorting<br/>Ranking 60% + Frequency 30% + Popularity 10%]
N --> O[📊 Generate Report<br/>HTML Page + Push Messages]
O --> P[📱 Multi-channel Push Notifications]
P --> Q[🎉 Continuously Receive Accurate Pushes<br/>Say Goodbye to Information Overload]
style A fill:#e3f2fd
style B fill:#f3e5f5
style D fill:#fff3e0
style F fill:#fff9c4
style G fill:#e8f5e9
style H fill:#e0f2f1
style I fill:#fce4ec
style O fill:#e1bee7
style Q fill:#c8e6c9
```
[](https://www.star-history.com/#sansan0/TrendRadar&Date)
<br>
## 📄 License
GPL-3.0 License
---
<div align="center">
[🔝 Back to Top](#trendradar)
</div>
Connection Info
You Might Also Like
Git
Model Context Protocol Servers
firecrawl
🔥 Official Firecrawl MCP Server - Adds powerful web scraping and search to...
repomix
📦 Repomix is a powerful tool that packs your entire repository into a...
Mastra
The TypeScript AI agent framework. ⚡ Assistants, RAG, observability....
Blender
BlenderMCP integrates Blender with Claude AI for enhanced 3D modeling.
MarkItDown MCP
Python tool for converting files and office documents to Markdown.