Repository Analysis

sansan0/TrendRadar

⭐AI-driven public opinion & trend monitor with multi-platform aggregation, RSS, and smart alerts.🎯 告别信息过载,你的 AI 舆情监控助手与热点筛选工具!聚合多平台热点 + RSS 订阅,支持关键词精准筛选。AI 智能筛选新闻 + AI 翻译 + AI 分析简报直推手机,也支持接入 MCP 架构,赋能 AI 自然语言对话分析、情感洞察与趋势预测等。支持 Docker ,数据本地/云端自持。集成微信/飞书/钉钉/Telegram/邮件/ntfy/bark/slack 等渠道智能推送。

29.5 Moderate AI signal View on GitHub
29.5
Adjusted Score
29.5
Raw Score
100%
Time Factor
2026-05-27
Last Push
58,576
Stars
Python
Language
55,597
Lines of Code
101
Files
849
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 153MEDIUM 154LOW 542

Pattern Findings

849 matches across 9 categories. Click a row to expand file-level details.

Decorative Section Separators154 hits · 478 pts
SeverityFileLineSnippet
MEDIUMconfig/ai_translation_prompt.txt1# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/ai_translation_prompt.txt4# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/ai_translation_prompt.txt12# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/ai_interests.txt1# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/ai_interests.txt4# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/ai_analysis_prompt.txt1# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/ai_analysis_prompt.txt4# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/ai_analysis_prompt.txt21# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/config.yaml1# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/config.yaml4# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/config.yaml10# ===============================================================
MEDIUMconfig/config.yaml12# ===============================================================
MEDIUMconfig/config.yaml41# ===============================================================
MEDIUMconfig/config.yaml47# ===============================================================
MEDIUMconfig/config.yaml54# ===============================================================
MEDIUMconfig/config.yaml24# ===============================================================
MEDIUMconfig/config.yaml83# ===============================================================
MEDIUMconfig/config.yaml90# ===============================================================
MEDIUMconfig/config.yaml130# ===============================================================
MEDIUMconfig/config.yaml132# ===============================================================
MEDIUMconfig/config.yaml152# ===============================================================
MEDIUMconfig/config.yaml154# ===============================================================
MEDIUMconfig/config.yaml167# ===============================================================
MEDIUMconfig/config.yaml169# ===============================================================
MEDIUMconfig/config.yaml197# ===============================================================
MEDIUMconfig/config.yaml201# ===============================================================
MEDIUMconfig/config.yaml231# ===============================================================
MEDIUMconfig/config.yaml239# ===============================================================
MEDIUMconfig/config.yaml285# ===============================================================
MEDIUMconfig/config.yaml287# ===============================================================
MEDIUMconfig/config.yaml329# ===============================================================
MEDIUMconfig/config.yaml331# ===============================================================
MEDIUMconfig/config.yaml388# ===============================================================
MEDIUMconfig/config.yaml390# ===============================================================
MEDIUMconfig/config.yaml415# ===============================================================
MEDIUMconfig/config.yaml419# ===============================================================
MEDIUMconfig/config.yaml432# ===============================================================
MEDIUMconfig/config.yaml434# ===============================================================
MEDIUMconfig/timeline.yaml101# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/timeline.yaml104# ───────────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml106# ───────────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml109 # ───────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml117 # ───────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml509 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MEDIUMconfig/timeline.yaml515 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MEDIUMconfig/timeline.yaml523 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MEDIUMconfig/timeline.yaml527 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MEDIUMconfig/timeline.yaml1# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/timeline.yaml4# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/timeline.yaml152 # ───────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml160 # ───────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml211 # ───────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml222 # ───────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml295 # ───────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml304 # ───────────────────────────────────────────────────────────
MEDIUMconfig/timeline.yaml353# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/timeline.yaml362# ═══════════════════════════════════════════════════════════════
MEDIUMconfig/timeline.yaml401 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MEDIUMconfig/timeline.yaml406 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MEDIUMconfig/timeline.yaml448 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
94 more matches not shown…
Cross-Language Confusion82 hits · 354 pts
SeverityFileLineSnippet
HIGHtrendradar/report/html.py2379 var timer = null;
HIGHtrendradar/report/html.py2386 item.style.display = (!query || title.toLowerCase().indexOf(query) !== -1) ? '' : 'none';
HIGHtrendradar/report/html.py2390 item.style.display = (!query || title.toLowerCase().indexOf(query) !== -1) ? '' : 'none';
HIGHtrendradar/report/html.py2867 lines.push('# ' + (headerTitle ? headerTitle.textContent.trim() : 'TrendRadar'));
HIGHtrendradar/report/html.py2868 lines.push('');
HIGHtrendradar/report/html.py2876 if (label && value) {
HIGHtrendradar/report/html.py2877 lines.push('- **' + label.textContent.trim() + '**: ' + value.textContent.trim());
HIGHtrendradar/report/html.py2880 lines.push('');
HIGHtrendradar/report/html.py2899 if (rank && rank.textContent.trim() && rank.textContent.trim() !== '?') meta.push('#' + rank.textCon
HIGHtrendradar/report/html.py2899 if (rank && rank.textContent.trim() && rank.textContent.trim() !== '?') meta.push('#' + rank.textCon
HIGHtrendradar/report/html.py2901 if (source) meta.push(source.textContent.trim());
HIGHtrendradar/report/html.py2903 if (keyword) meta.push(keyword.textContent.trim());
HIGHtrendradar/report/html.py2905 if (time) meta.push(time.textContent.trim());
HIGHtrendradar/report/html.py2907 if (count) meta.push(count.textContent.trim());
HIGHtrendradar/report/html.py2922 lines.push('## 热点新闻');
HIGHtrendradar/report/html.py2923 lines.push('');
HIGHtrendradar/report/html.py2928 lines.push('### ' + wordName.textContent.trim() + (wordCount ? ' (' + wordCount.textContent.
HIGHtrendradar/report/html.py2929 lines.push('');
HIGHtrendradar/report/html.py2934 if (line) lines.push(line);
HIGHtrendradar/report/html.py2936 lines.push('');
HIGHtrendradar/report/html.py2944 lines.push('## ' + (newTitle ? newTitle.textContent.trim() : '本次新增热点'));
HIGHtrendradar/report/html.py2945 lines.push('');
HIGHtrendradar/report/html.py2950 lines.push('### ' + srcTitle.textContent.trim());
HIGHtrendradar/report/html.py2951 lines.push('');
HIGHtrendradar/report/html.py2956 if (line) lines.push(line);
HIGHtrendradar/report/html.py2958 lines.push('');
HIGHtrendradar/report/html.py2966 lines.push('## ' + (rssSectionTitle ? rssSectionTitle.textContent.trim() : 'RSS 订阅更新'));
HIGHtrendradar/report/html.py2967 lines.push('');
HIGHtrendradar/report/html.py2973 lines.push('### ' + feedName.textContent.trim() + (feedCount ? ' (' + feedCount.textContent.
HIGHtrendradar/report/html.py2974 lines.push('');
HIGHtrendradar/report/html.py2984 if (time) meta.push(time.textContent.trim());
HIGHtrendradar/report/html.py2986 if (author) meta.push(author.textContent.trim());
HIGHtrendradar/report/html.py2991 lines.push(line);
HIGHtrendradar/report/html.py2993 lines.push('');
HIGHtrendradar/report/html.py3003 lines.push('## AI 分析');
HIGHtrendradar/report/html.py3004 lines.push('');
HIGHtrendradar/report/html.py3005 lines.push('> ' + aiError.textContent.trim());
HIGHtrendradar/report/html.py3006 lines.push('');
HIGHtrendradar/report/html.py3011 lines.push('## ' + (aiTitle ? aiTitle.textContent.trim() : 'AI 热点分析'));
HIGHtrendradar/report/html.py3012 lines.push('');
HIGHtrendradar/report/html.py3018 lines.push('### ' + blockTitle.textContent.trim());
HIGHtrendradar/report/html.py3019 lines.push('');
HIGHtrendradar/report/html.py3022 lines.push(blockContent.textContent.trim());
HIGHtrendradar/report/html.py3023 lines.push('');
HIGHtrendradar/report/html.py3033 lines.push('## ' + (standaloneTitle ? standaloneTitle.textContent.trim() : '独立展示区'));
HIGHtrendradar/report/html.py3034 lines.push('');
HIGHtrendradar/report/html.py3040 lines.push('### ' + name.textContent.trim() + (cnt ? ' (' + cnt.textContent.trim() + ')' : '
HIGHtrendradar/report/html.py3041 lines.push('');
HIGHtrendradar/report/html.py3046 if (line) lines.push(line);
HIGHtrendradar/report/html.py3048 lines.push('');
HIGHtrendradar/report/html.py3057 lines.push('## 抓取异常');
HIGHtrendradar/report/html.py3058 lines.push('');
HIGHtrendradar/report/html.py3060 lines.push('- ' + item.textContent.trim());
HIGHtrendradar/report/html.py3062 lines.push('');
HIGHtrendradar/report/html.py3067 lines.push('---');
HIGHtrendradar/report/html.py3068 lines.push('*Generated by TrendRadar*');
HIGHtrendradar/report/html.py3087 var savedMode = null;
HIGHtrendradar/report/html.py3089 if (savedMode === '1' || (savedMode === null && window.innerWidth > 768)) {
HIGHtrendradar/report/html.py3096 var savedDark = null;
HIGHtrendradar/report/html.py2299 var tabBar = wrapper ? wrapper.querySelector('.tab-bar') : null;
22 more matches not shown…
Docstring Block Structure68 hits · 340 pts
SeverityFileLineSnippet
HIGHtrendradar/core/frequency.py99 加载频率词配置 配置文件格式说明: - 每个词组由空行分隔 - [GLOBAL_FILTER] 区域定义全局过滤词 - [WORD_GROUPS] 区域定义词组(默认) 词组语法:
HIGHtrendradar/core/config.py12 解析多账号配置,返回账号列表 Args: config_value: 配置值字符串,多个账号用分隔符分隔 separator: 分隔符,默认为 ; Returns:
HIGHtrendradar/core/config.py45 验证配对配置的数量是否一致 对于需要多个配置项配对的渠道(如 Telegram 的 token 和 chat_id), 验证所有配置项的账号数量是否一致。 Args: configs:
HIGHtrendradar/core/config.py102 限制账号数量 当配置的账号数量超过最大限制时,只使用前 N 个账号, 并输出警告信息。 Args: accounts: 账号列表 max_count: 最大账号数量
HIGHtrendradar/core/config.py129 安全获取指定索引的账号值 当索引超出范围或账号值为空时,返回默认值。 Args: accounts: 账号列表 index: 索引 default: 默认值
HIGHtrendradar/core/loader.py530 加载配置文件 Args: config_path: 配置文件路径,默认从环境变量 CONFIG_PATH 获取或使用 config/config.yaml Returns: 包含
HIGHtrendradar/utils/url.py39 标准化 URL,去除动态参数 用于数据库去重,确保同一条新闻的不同 URL 变体能被正确识别为同一条。 处理规则: 1. 去除平台特定的动态参数(如微博的 band_rank) 2. 去除通用追
HIGHtrendradar/ai/client.py47 调用 AI 模型进行对话 Args: messages: 消息列表,格式: [{"role": "system/user/assistant", "content": "..."}
HIGHmcp_server/server.py122 【推荐优先调用】将自然语言日期表达式解析为标准日期范围 **为什么需要这个工具?** 用户经常使用"本周"、"最近7天"等自然语言表达日期,但 AI 模型自己计算日期 可能导致不一致的结果。此工具在服务器
HIGHmcp_server/server.py225 获取热点话题统计 Args: top_n: 返回TOP N话题,默认10 mode: 时间模式 - "daily": 当日累计数据统计 -
HIGHmcp_server/server.py261 获取最新的 RSS 订阅数据(支持多日查询) RSS 数据与热榜新闻分开存储,按时间流展示,适合获取特定来源的最新内容。 Args: feeds: RSS 源 ID 列表,如 ['hacker-
HIGHmcp_server/server.py295 搜索 RSS 数据 在 RSS 订阅数据中搜索包含指定关键词的文章。 Args: keyword: 搜索关键词(必需) feeds: RSS 源 ID 列表,如 ['hacker
HIGHmcp_server/server.py398 统一话题趋势分析工具 - 整合多种趋势分析模式 建议:使用自然语言日期时,先调用 resolve_date_range 获取精确日期范围。 Args: topic: 话题关键词(必需)
HIGHmcp_server/server.py447 统一数据洞察分析工具 - 整合多种数据分析模式 Args: insight_type: 洞察类型,可选值: - "platform_compare": 平台对比分析(对比不同平台对
HIGHmcp_server/server.py492 分析新闻的情感倾向和热度趋势 建议:使用自然语言日期时,先调用 resolve_date_range 获取精确日期范围。 Args: topic: 话题关键词(可选) platf
HIGHmcp_server/server.py532 查找与指定新闻标题相关的其他新闻(支持当天和历史数据) Args: reference_title: 参考新闻标题(完整或部分) date_range: 日期范围(可选)
HIGHmcp_server/server.py599 跨平台新闻聚合 - 对相似新闻进行去重合并 将不同平台报道的同一事件合并为一条聚合新闻,显示跨平台覆盖情况和综合热度。 Args: date_range: 日期范围,不指定则查询今天
HIGHmcp_server/server.py639 时期对比分析 - 比较两个时间段的新闻数据 对比不同时期的热点话题、平台活跃度、新闻数量等维度。 **使用场景:** - 对比本周和上周的热点变化 - 分析某个话题在两个时期的热度差异
HIGHmcp_server/server.py705 统一搜索接口,支持多种搜索模式,可同时搜索热榜和RSS 建议:使用自然语言日期时,先调用 resolve_date_range 获取精确日期范围。 Args: query: 搜索关键词或内容片段
HIGHmcp_server/server.py794 检查版本更新(同时检查 TrendRadar 和 MCP Server) 比较本地版本与 GitHub 远程版本,判断是否需要更新。 Args: proxy_url: 可选的代理URL,用于访问
HIGHmcp_server/server.py820 手动触发一次爬取任务(可选持久化) Args: platforms: 平台ID列表,如 ['zhihu', 'weibo'],不指定则使用所有平台 save_to_local: 是否保存到
HIGHmcp_server/server.py849 从远程存储拉取数据到本地 用于 MCP Server 等场景:爬虫存到远程云存储(如 Cloudflare R2), MCP Server 拉取到本地进行分析查询。 Args: days
HIGHmcp_server/server.py905 列出本地/远程可用的日期范围 查看本地和远程存储中有哪些日期的数据可用。 Args: source: 数据来源 - "local": 仅本地 -
HIGHmcp_server/server.py935 读取指定 URL 的文章内容,返回 LLM 友好的 Markdown 格式 通过 Jina AI Reader 将网页转换为干净的 Markdown,自动去除广告、导航栏等噪音内容。 适合用于:阅读新闻正文、获取
HIGHmcp_server/server.py975 批量读取多篇文章内容(最多 5 篇,间隔 5 秒) 逐篇请求文章内容,每篇之间自动间隔 5 秒以遵守速率限制。 **典型使用流程:** 1. 先用 search_news(include_url=Tru
HIGHmcp_server/server.py1014 获取通知渠道的格式化策略指南 返回各渠道支持的 Markdown 特性、格式限制和最佳格式化提示词。 在调用 send_notification 之前使用此工具,可以了解目标渠道的格式要求, 从而生成最佳
HIGHmcp_server/server.py1077 向已配置的通知渠道发送消息 接受 markdown 格式内容,内部自动适配各渠道的格式要求和限制: - 飞书:Markdown 卡片消息(支持 **粗体**、<font color>彩色文本、[链接](url)、
HIGHmcp_server/tools/search_tools.py43 统一新闻搜索工具 - 整合多种搜索模式,支持同时搜索热榜和RSS Args: query: 查询内容(必需)- 关键词、内容片段或实体名称 search_m
HIGHmcp_server/tools/analytics.py119 统一数据洞察分析工具 - 整合多种数据分析模式 Args: insight_type: 洞察类型,可选值: - "platform_compare"
HIGHmcp_server/tools/analytics.py272 热度趋势分析 - 追踪特定话题的热度变化趋势 Args: topic: 话题关键词 date_range: 日期范围(可选)
HIGHmcp_server/tools/analytics.py430 平台对比分析 - 对比不同平台对同一话题的关注度 Args: topic: 话题关键词(可选,不指定则对比整体活跃度) date_range: 日期范围,格
HIGHmcp_server/tools/analytics.py554 关键词共现分析 - 分析哪些关键词经常同时出现 Args: min_frequency: 最小共现频次 top_n: 返回TOP N关键词对
HIGHmcp_server/tools/analytics.py666 情感倾向分析 - 生成用于 AI 情感分析的结构化提示词 本工具收集新闻数据并生成优化的 AI 提示词,你可以将其发送给 AI 进行深度情感分析。 Args: t
HIGHmcp_server/tools/analytics.py944 相似新闻查找 - 基于标题相似度查找相关新闻 Args: reference_title: 参考标题 threshold: 相似度阈值(0-1之间)
HIGHmcp_server/tools/analytics.py1059 实体识别搜索 - 搜索包含特定人物/地点/机构的新闻 Args: entity: 实体名称 entity_type: 实体类型(person/locatio
HIGHmcp_server/tools/analytics.py1188 每日/每周摘要生成器 - 自动生成热点摘要报告 Args: report_type: 报告类型(daily/weekly) date_range: 自定义日
HIGHmcp_server/tools/analytics.py1367 平台活跃度统计 - 统计各平台的发布频率和活跃时间段 Args: date_range: 日期范围(可选) Returns: 平台活跃度统
HIGHmcp_server/tools/analytics.py1495 话题生命周期分析 - 追踪话题从出现到消失的完整周期 Args: topic: 话题关键词 date_range: 日期范围(可选)
HIGHmcp_server/tools/analytics.py1653 异常热度检测 - 自动识别突然爆火的话题 Args: threshold: 热度突增倍数阈值 time_window: 检测时间窗口(小时)
HIGHmcp_server/tools/analytics.py1792 话题预测 - 基于历史数据预测未来可能的热点 Args: lookahead_hours: 预测未来多少小时 confidence_threshold: 置
HIGHmcp_server/utils/validators.py22 将字符串解析为列表 支持格式: - JSON 数组: '["zhihu", "weibo"]' - Python 列表字符串: "['zhihu', 'weibo']" - 逗号分隔: "zhih
HIGHmcp_server/utils/validators.py74 将字符串解析为整数 Args: value: 字符串值 param_name: 参数名(用于错误消息) Returns: 解析后的整数 Raises:
HIGHmcp_server/utils/validators.py106 将字符串解析为浮点数 Args: value: 字符串值 param_name: 参数名(用于错误消息) Returns: 解析后的浮点数 Raises
HIGHmcp_server/utils/validators.py197 验证平台列表 Args: platforms: 平台ID列表或字符串,None表示使用 config.yaml 中配置的所有平台 支持多种格式:
HIGHmcp_server/utils/validators.py258 验证数量限制参数 Args: limit: 限制数量(整数或字符串) default: 默认值 max_limit: 最大限制 Returns:
HIGHmcp_server/utils/validators.py295 验证日期格式 Args: date_str: 日期字符串 (YYYY-MM-DD) Returns: datetime对象 Raises: Invali
HIGHmcp_server/utils/validators.py317 规范化 date_range 参数 某些 MCP 客户端(特别是 HTTP 方式)会将 JSON 对象序列化为字符串传入。 此函数尝试将 JSON 字符串解析为 dict,如果不是 JSON 格式则保持原样。
HIGHmcp_server/utils/validators.py364 验证日期范围 Args: date_range: 日期范围,支持多种格式: - dict: {"start": "YYYY-MM-DD", "end": "YYYY-MM-DD"}
HIGHmcp_server/utils/validators.py483 验证关键词 Args: keyword: 搜索关键词 Returns: 处理后的关键词 Raises: InvalidParameterError: 关
HIGHmcp_server/utils/validators.py516 验证TOP N参数 Args: top_n: TOP N数量(整数或字符串) default: 默认值 Returns: 验证后的值 Raises:
HIGHmcp_server/utils/validators.py533 验证模式参数 Args: mode: 模式字符串 valid_modes: 有效模式列表 default: 默认模式 Returns: 验证后的模
HIGHmcp_server/utils/validators.py563 验证配置节参数 Args: section: 配置节名称 Returns: 验证后的配置节 Raises: InvalidParameterError:
HIGHmcp_server/utils/validators.py586 验证阈值参数(浮点数) Args: threshold: 阈值(浮点数、整数或字符串) default: 默认值 min_value: 最小值 max_va
HIGHmcp_server/utils/validators.py633 验证并解析日期查询字符串 Args: date_query: 日期查询字符串 allow_future: 是否允许未来日期 max_days_ago: 允许查询的最大天数
HIGHmcp_server/utils/date_parser.py93 解析日期查询字符串 支持的格式: - 相对日期(中文):今天、昨天、前天、大前天、N天前 - 相对日期(英文):today、yesterday、N days ago
HIGHmcp_server/utils/date_parser.py279 将日期格式化为文件夹名称 Args: date: datetime对象 Returns: 文件夹名称,格式: YYYY-MM-DD
HIGHmcp_server/utils/date_parser.py332 将自然语言日期表达式解析为标准日期范围 这是专门为 MCP 工具设计的方法,用于在服务器端解析日期表达式, 避免 AI 模型自己计算日期导致的不一致问题。 Args:
HIGHmcp_server/services/data_service.py52 获取最新一批爬取的新闻数据 Args: platforms: 平台ID列表,None表示所有平台 limit: 返回条数限制 inc
HIGHmcp_server/services/data_service.py127 按指定日期获取新闻 Args: target_date: 目标日期 platforms: 平台ID列表,None表示所有平台 lim
HIGHmcp_server/services/data_service.py207 按关键词搜索新闻 Args: keyword: 搜索关键词 date_range: 日期范围 (start_date, end_date)
8 more matches not shown…
Hyper-Verbose Identifiers135 hits · 133 pts
SeverityFileLineSnippet
LOWdocker/manage.py466def _is_expected_webserver_process(pid: int) -> bool:
LOWdocker/manage.py474def _terminate_webserver_process(pid: int, require_expected: bool = True) -> bool:
LOWdocs/assets/script.js452function saveFrequencyToLocalStorage() {
LOWdocs/assets/script.js456function saveTimelineToLocalStorage() {
LOWdocs/assets/script.js2614function parseDisplayRegionsFromYaml() {
LOWdocs/assets/script.js2721function updateDisplayRegionsInYaml(regions) {
LOWdocs/assets/script.js3119function parseStandaloneConfigFromYaml() {
LOWdocs/assets/script.js3198function updateStandaloneConfigInYaml(type, list) {
LOWdocs/assets/script.js3341function showVersionComparisonModal(fileName, currentVersion, latestVersion) {
LOWdocs/assets/script.js4625function applyTimelineEditorChanges(editor, lines) {
LOWdocs/assets/script.js4681function updateTimelineSectionField(presetName, field, value) {
LOWdocs/assets/script.js4865function scrollTimelineEditorToPreset(presetName) {
LOWdocs/assets/script.js5577function removePeriodFromDayPlanInLines(lines, sectionInfo, planKey, periodKey) {
LOWtrendradar/context.py462 def create_notification_dispatcher(self) -> NotificationDispatcher:
LOWtrendradar/context.py919 def convert_ai_filter_to_report_data(
LOWtrendradar/__main__.py253 def _detect_docker_environment(self) -> bool:
LOWtrendradar/__main__.py280 def _set_update_info_from_config(self) -> None:
LOWtrendradar/__main__.py302 def _has_notification_configured(self) -> bool:
LOWtrendradar/__main__.py343 def _prepare_ai_analysis_data(
LOWtrendradar/__main__.py618 def _prepare_current_title_info(self, results: Dict, time_info: str) -> Dict:
LOWtrendradar/__main__.py915 def _send_notification_if_needed(
LOWtrendradar/__main__.py1047 def _initialize_and_check_config(self) -> bool:
LOWtrendradar/__main__.py1208 def _process_rss_data_by_mode(self, rss_data) -> Tuple[Optional[List[Dict]], Optional[List[Dict]], Optional[List[Dic
LOWtrendradar/__main__.py1388 def _convert_rss_items_to_list(self, items_dict: Dict, id_to_name: Dict) -> List[Dict]:
LOWtrendradar/__main__.py1484 def _generate_rss_html_report(self, rss_items: list, feeds_info: dict) -> str:
LOWtrendradar/core/config.py11def parse_multi_account_config(config_value: str, separator: str = ";") -> List[str]:
LOWtrendradar/core/analyzer.py712def convert_keyword_stats_to_platform_stats(
LOWtrendradar/core/loader.py96def _load_notification_config(config_data: Dict) -> Dict:
LOWtrendradar/core/loader.py303def _load_ai_translation_config(config_data: Dict) -> Dict:
LOWtrendradar/core/loader.py447def _print_notification_sources(config: Dict) -> None:
LOWtrendradar/core/data.py15def read_all_today_titles_from_storage(
LOWtrendradar/core/data.py113def detect_latest_new_titles_from_storage(
LOWtrendradar/notification/formatters.py72def convert_markdown_to_mrkdwn(content: str) -> str:
LOWtrendradar/notification/renderer.py287def _render_rss_section_feishu(rss_items: list, separator: str = "---") -> str:
LOWtrendradar/notification/renderer.py330def _render_rss_section_markdown(rss_items: list) -> str:
LOWtrendradar/notification/batch.py34def get_max_batch_header_size(format_type: str) -> int:
LOWtrendradar/notification/batch.py73def truncate_at_line_boundary(text: str, max_bytes: int) -> str:
LOWtrendradar/notification/batch.py95def truncate_preserving_footer(content: str, max_bytes: int) -> str:
LOWtrendradar/notification/splitter.py135def split_content_into_batches(
LOWtrendradar/notification/splitter.py617 def process_new_titles_section(current_batch, current_batch_has_content, batches, add_separator=True):
LOWtrendradar/notification/splitter.py845 def process_standalone_section_wrapper(current_batch, current_batch_has_content, batches, add_separator=True):
LOWtrendradar/notification/splitter.py856 def process_rss_stats_wrapper(current_batch, current_batch_has_content, batches, add_separator=True):
LOWtrendradar/notification/splitter.py995def _process_rss_stats_section(
LOWtrendradar/notification/splitter.py1226def _process_rss_new_titles_section(
LOWtrendradar/notification/splitter.py1474def _process_standalone_section(
LOWtrendradar/notification/splitter.py1701def _format_standalone_platform_item(item: Dict, index: int, format_type: str, rank_threshold: int = 10) -> str:
LOWtrendradar/notification/splitter.py1807def _format_standalone_rss_item(
LOWtrendradar/storage/remote.py489 def get_active_ai_filter_tags(self, date=None, interests_file="ai_interests.txt"):
LOWtrendradar/storage/remote.py495 def get_latest_ai_filter_tag_version(self, date=None):
LOWtrendradar/storage/remote.py498 def deprecate_all_ai_filter_tags(self, date=None, interests_file="ai_interests.txt"):
LOWtrendradar/storage/remote.py516 def get_active_ai_filter_results(self, date=None, interests_file="ai_interests.txt"):
LOWtrendradar/storage/remote.py519 def deprecate_specific_ai_filter_tags(self, tag_ids, date=None):
LOWtrendradar/storage/remote.py525 def update_ai_filter_tags_hash(self, interests_file, new_hash, date=None):
LOWtrendradar/storage/remote.py531 def update_ai_filter_tag_descriptions(self, tag_updates, date=None, interests_file="ai_interests.txt"):
LOWtrendradar/storage/remote.py537 def update_ai_filter_tag_priorities(self, tag_priorities, date=None, interests_file="ai_interests.txt"):
LOWtrendradar/storage/remote.py558 def clear_unmatched_analyzed_news(self, date=None, interests_file="ai_interests.txt"):
LOWtrendradar/storage/local.py234 def get_active_ai_filter_tags(self, date=None, interests_file="ai_interests.txt"):
LOWtrendradar/storage/local.py240 def get_latest_ai_filter_tag_version(self, date=None):
LOWtrendradar/storage/local.py243 def deprecate_all_ai_filter_tags(self, date=None, interests_file="ai_interests.txt"):
LOWtrendradar/storage/local.py252 def get_active_ai_filter_results(self, date=None, interests_file="ai_interests.txt"):
75 more matches not shown…
Excessive Try-Catch Wrapping178 hits · 131 pts
SeverityFileLineSnippet
LOWdocker/manage.py462 except Exception:
LOWdocker/manage.py31 except Exception as e:
LOWdocker/manage.py46 except Exception as e:
LOWdocker/manage.py127 except Exception as e:
LOWdocker/manage.py149 except Exception as e:
LOWdocker/manage.py236 except Exception as e:
LOWdocker/manage.py330 except Exception as e:
LOWdocker/manage.py425 except Exception as e:
LOWdocker/manage.py449 except Exception as e:
LOWdocker/manage.py517 except Exception:
LOWdocker/manage.py524 except Exception:
LOWdocker/manage.py539 except Exception:
LOWdocker/manage.py566 except Exception as e:
LOWdocker/manage.py602 except Exception as e:
LOWdocker/manage.py620 except Exception as e:
LOWdocker/manage.py653 except Exception as e:
LOWdocker/manage.py738 except Exception as e:
LOWtrendradar/__main__.py75 except Exception as e:
LOWtrendradar/__main__.py164 except Exception as e:
LOWtrendradar/__main__.py263 except Exception:
LOWtrendradar/__main__.py295 except Exception as e:
LOWtrendradar/__main__.py442 except Exception as e:
LOWtrendradar/__main__.py565 except Exception as e:
LOWtrendradar/__main__.py614 except Exception as e:
LOWtrendradar/__main__.py1204 except Exception as e:
LOWtrendradar/__main__.py1510 except Exception as e:
LOWtrendradar/__main__.py1755 except Exception as e:
LOWtrendradar/__main__.py1809 except Exception as e:
LOWtrendradar/__main__.py1858 except Exception as e:
LOWtrendradar/__main__.py1869 except Exception as e:
LOWtrendradar/__main__.py1890 except Exception as e:
LOWtrendradar/__main__.py1918 except Exception as e:
LOWtrendradar/__main__.py2001 except Exception as e:
LOWtrendradar/__main__.py2073 except Exception as e:
LOWtrendradar/__main__.py2310 except Exception as e:
LOWtrendradar/__main__.py2257 except Exception as e:
LOWtrendradar/core/cdn.py69 except Exception as e:
LOWtrendradar/core/cdn.py86 except Exception:
LOWtrendradar/core/data.py78 except Exception as e:
LOWtrendradar/core/data.py193 except Exception as e:
LOWtrendradar/notification/senders.py221 except Exception as e:
LOWtrendradar/notification/senders.py337 except Exception as e:
LOWtrendradar/notification/senders.py464 except Exception as e:
LOWtrendradar/notification/senders.py579 except Exception as e:
LOWtrendradar/notification/senders.py740 except Exception as e:
LOWtrendradar/notification/senders.py923 except Exception as e:
LOWtrendradar/notification/senders.py1085 except Exception as e:
LOWtrendradar/notification/senders.py1197 except Exception as e:
LOWtrendradar/notification/senders.py1321 except Exception as e:
LOWtrendradar/crawler/fetcher.py103 except Exception as e:
LOWtrendradar/crawler/fetcher.py171 except Exception as e:
LOWtrendradar/crawler/rss/fetcher.py191 except Exception as e:
LOWtrendradar/utils/time.py164 except Exception:
LOWtrendradar/utils/time.py237 except Exception:
LOWtrendradar/utils/time.py285 except Exception:
LOWtrendradar/utils/url.py126 except Exception:
LOWtrendradar/storage/remote.py638 except Exception as e:
LOWtrendradar/storage/remote.py765 except Exception:
LOWtrendradar/storage/remote.py203 except Exception as e:
LOWtrendradar/storage/remote.py251 except Exception as e:
118 more matches not shown…
Deep Nesting110 hits · 85 pts
SeverityFileLineSnippet
LOWdocker/manage.py50
LOWdocker/manage.py131
LOWdocker/manage.py336
LOWtrendradar/context.py517
LOWtrendradar/context.py919
LOWtrendradar/__main__.py80
LOWtrendradar/__main__.py1813
LOWtrendradar/__main__.py343
LOWtrendradar/__main__.py449
LOWtrendradar/__main__.py638
LOWtrendradar/__main__.py915
LOWtrendradar/__main__.py1106
LOWtrendradar/__main__.py1388
LOWtrendradar/__main__.py1460
LOWtrendradar/core/frequency.py96
LOWtrendradar/core/analyzer.py93
LOWtrendradar/core/analyzer.py494
LOWtrendradar/core/scheduler.py363
LOWtrendradar/core/data.py113
LOWtrendradar/notification/dispatcher.py72
LOWtrendradar/notification/dispatcher.py719
LOWtrendradar/notification/renderer.py18
LOWtrendradar/notification/renderer.py150
LOWtrendradar/notification/splitter.py135
LOWtrendradar/notification/splitter.py995
LOWtrendradar/notification/splitter.py1226
LOWtrendradar/notification/splitter.py1474
LOWtrendradar/notification/splitter.py1701
LOWtrendradar/notification/splitter.py1807
LOWtrendradar/notification/splitter.py376
LOWtrendradar/notification/splitter.py617
LOWtrendradar/notification/splitter.py791
LOWtrendradar/notification/senders.py96
LOWtrendradar/notification/senders.py230
LOWtrendradar/notification/senders.py346
LOWtrendradar/notification/senders.py473
LOWtrendradar/notification/senders.py588
LOWtrendradar/notification/senders.py747
LOWtrendradar/notification/senders.py938
LOWtrendradar/notification/senders.py1100
LOWtrendradar/notification/senders.py1206
LOWtrendradar/crawler/fetcher.py117
LOWtrendradar/crawler/rss/fetcher.py242
LOWtrendradar/utils/time.py96
LOWtrendradar/utils/time.py175
LOWtrendradar/utils/time.py242
LOWtrendradar/storage/remote.py574
LOWtrendradar/storage/remote.py680
LOWtrendradar/storage/remote.py773
LOWtrendradar/storage/remote.py831
LOWtrendradar/storage/local.py289
LOWtrendradar/storage/local.py395
LOWtrendradar/storage/sqlite_mixin.py119
LOWtrendradar/storage/sqlite_mixin.py343
LOWtrendradar/storage/sqlite_mixin.py482
LOWtrendradar/storage/sqlite_mixin.py620
LOWtrendradar/storage/sqlite_mixin.py818
LOWtrendradar/storage/sqlite_mixin.py1044
LOWtrendradar/storage/sqlite_mixin.py1581
LOWtrendradar/storage/base.py230
50 more matches not shown…
Unused Imports84 hits · 83 pts
SeverityFileLineSnippet
LOWtrendradar/__init__.py10
LOWtrendradar/__main__.py20
LOWtrendradar/core/__init__.py6
LOWtrendradar/core/__init__.py6
LOWtrendradar/core/__init__.py6
LOWtrendradar/core/__init__.py6
LOWtrendradar/core/__init__.py12
LOWtrendradar/core/__init__.py13
LOWtrendradar/core/__init__.py13
LOWtrendradar/core/__init__.py14
LOWtrendradar/core/__init__.py14
LOWtrendradar/core/__init__.py15
LOWtrendradar/core/__init__.py15
LOWtrendradar/core/__init__.py15
LOWtrendradar/core/__init__.py15
LOWtrendradar/core/__init__.py21
LOWtrendradar/core/__init__.py21
LOWtrendradar/core/__init__.py21
LOWtrendradar/core/__init__.py21
LOWtrendradar/notification/dispatcher.py13
LOWtrendradar/notification/dispatcher.py39
LOWtrendradar/notification/__init__.py19
LOWtrendradar/notification/__init__.py19
LOWtrendradar/notification/__init__.py23
LOWtrendradar/notification/__init__.py23
LOWtrendradar/notification/__init__.py23
LOWtrendradar/notification/__init__.py23
LOWtrendradar/notification/__init__.py29
LOWtrendradar/notification/__init__.py29
LOWtrendradar/notification/__init__.py33
LOWtrendradar/notification/__init__.py33
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py37
LOWtrendradar/notification/__init__.py48
LOWtrendradar/crawler/__init__.py6
LOWtrendradar/crawler/rss/__init__.py8
LOWtrendradar/crawler/rss/__init__.py9
LOWtrendradar/crawler/rss/__init__.py9
LOWtrendradar/utils/__init__.py6
LOWtrendradar/utils/__init__.py6
LOWtrendradar/utils/__init__.py6
LOWtrendradar/utils/__init__.py6
LOWtrendradar/utils/__init__.py6
LOWtrendradar/utils/__init__.py13
LOWtrendradar/storage/__init__.py11
LOWtrendradar/storage/__init__.py11
LOWtrendradar/storage/__init__.py11
LOWtrendradar/storage/__init__.py11
LOWtrendradar/storage/__init__.py11
LOWtrendradar/storage/__init__.py11
LOWtrendradar/storage/__init__.py19
LOWtrendradar/storage/__init__.py20
LOWtrendradar/storage/__init__.py21
24 more matches not shown…
Over-Commented Block35 hits · 20 pts
SeverityFileLineSnippet
LOWconfig/ai_translation_prompt.txt1# ═══════════════════════════════════════════════════════════════
LOWconfig/ai_analysis_prompt.txt1# ═══════════════════════════════════════════════════════════════
LOWconfig/config.yaml1# ═══════════════════════════════════════════════════════════════
LOWconfig/config.yaml21 show_version_update: true # 是否显示版本更新提示(true=显示, false=隐藏)
LOWconfig/config.yaml81
LOWconfig/config.yaml121
LOWconfig/config.yaml221 ai_analysis: true # AI 分析区域(true=显示, false=隐藏)
LOWconfig/config.yaml281 # 示例:{"content": "{content}"}
LOWconfig/config.yaml321 region: "" # 区域(可选,部分服务商需要)
LOWconfig/config.yaml341 # 完整列表: https://docs.litellm.ai/docs/providers
LOWconfig/config.yaml381 # 额外参数(一般无需修改,删掉 # 号即可启用)
LOWconfig/timeline.yaml1# ═══════════════════════════════════════════════════════════════
LOWconfig/timeline.yaml21#
LOWconfig/timeline.yaml41# 调用 AI 大模型对采集到的新闻进行深度分析(可选,需配置 API Key)
LOWconfig/timeline.yaml61#
LOWconfig/timeline.yaml81# ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
LOWconfig/timeline.yaml101# ═══════════════════════════════════════════════════════════════
LOWconfig/timeline.yaml361#
LOWconfig/timeline.yaml381#
LOWconfig/timeline.yaml401 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
LOWconfig/timeline.yaml421
LOWconfig/timeline.yaml441 # 例如晚间汇总用 AI 筛选:
LOWconfig/timeline.yaml541 # 什么是「冲突」?
LOWconfig/frequency_words.txt1# ═══════════════════════════════════════════════════════════════
LOWconfig/frequency_words.txt21# 全局过滤区
LOWconfig/frequency_words.txt41#
LOWconfig/frequency_words.txt61# ┌─────────────────────────────────────────────────────────────┐
LOWconfig/frequency_words.txt81# 3. 给词组起个名字(推荐)
LOWconfig/frequency_words.txt101#
LOWconfig/frequency_words.txt121# [苹果公司]
LOWconfig/frequency_words.txt141# ────────────────────
LOWdocs/assets/style.css1/* 编辑器区域滚动条 */
LOW.github/workflows/crawler.yml1name: Get Hot News
LOW.github/workflows/crawler.yml21 # 🙏 珍惜资源 / Respect shared resources:
LOW.github/workflows/crawler.yml101 # Critical for load balancing.
Cross-File Repetition3 hits · 15 pts
SeverityFileLineSnippet
HIGHtrendradar/storage/sqlite_mixin.py0insert into rank_history (news_item_id, rank, crawl_time, created_at) values (?, ?, ?, ?)
HIGHtrendradar/storage/sqlite_mixin.py0insert into rank_history (news_item_id, rank, crawl_time, created_at) values (?, ?, ?, ?)
HIGHtrendradar/storage/sqlite_mixin.py0insert into rank_history (news_item_id, rank, crawl_time, created_at) values (?, ?, ?, ?)