AI 驱动的 GitHub 热门项目分析与日报生成系统
每天早上 8 点自动采集 GitHub 热门项目 → AI 深度分析技术原理 → 生成结构化日报 → 推送到 QQ 群/邮件/Notion
功能演示:支持 QA 问答机器人,可基于历史日报回答项目相关问题
-
🤖 AI 深度分析
- 使用 GLM-4-Flash 大模型分析项目技术原理
- 自动提取技术栈、核心功能、创新点
- 支持 Git Clone + 代码结构提取进行深度分析
-
📊 智能数据采集
- 支持 GitHub、GitLab、Bitbucket 多平台
- 智能过滤:按语言、星标数、增长率筛选
- 并发处理:最多 3 个项目同时分析
-
📝 自动化日报生成
- 生成 Markdown 格式结构化日报
- 包含趋势分析:新上榜、持续热门、增长冠军
- 技术栈统计:语言分布、平均星标
-
🗄️ 多渠道存储
- Notion 知识库自动同步
- 本地历史记录(
data/history.json) - 保留最近 30 天数据
-
📢 多渠道通知
- QQ 群 @all + 摘要 + 链接
- HTML 格式邮件通知
- 支持企业微信、钉钉、Telegram 等
-
🧹 智能内存管理
- 自动垃圾回收
- 日志自动清理(保留 7 天)
- 内存超阈值自动清理
-
⏰ 定时任务调度
- Cron 表达式支持
- 时区配置
- 默认每天 8:00 执行
-
🧠 QA 问答机器人
- 基于历史日报的智能问答
- 多源知识检索(代码、文档、Notion、本地历史)
- 支持项目查询、技术原理解答
-
💾 本地历史索引
- 自动索引本地历史日报
- 支持按项目名、语言、内容搜索
- 相关性评分算法
┌─────────────────────────────────────────────────────────────────┐
│ GitHub 技术日报自动化系统 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 定时任务 │ ───▶ │ 数据采集 │ ───▶ │ AI 分析 │ │
│ │ (Scheduler) │ │ (Collectors) │ │ (Analyzers) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 内存管理 │ │ 数据处理 │ │ 内容生成 │ │
│ │ (Cleanup) │ │(DataAnalyzer)│ │ (Generators) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────┘ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Notion 存储 │ │ QQ 推送 │ │ 邮件通知 │ │
│ │(NotionClient)│ │ (Notifiers) │ │ (Email) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Koishi QA Bot 问答系统 │
├─────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 消息监听 │ ───▶ │ 知识检索 │ ───▶ │ AI 回答 │ │
│ │ (Koishi Core)│ │(KnowledgeBase)│ │ (GLM API) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │本地历史 │ │ Notion │ │
│ │history.json│ │ API │ │
│ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
GitHub/GitLab/Bitbucket API
↓
[过滤系统] → 语言、星标、增长率筛选
↓
[并发处理器] → 最多 3 个项目同时分析
↓
[GIT Clone] → 克隆到 /tmp/github-analysis/
↓
[代码提取] → 提取 package.json、README、核心文件
↓
[GLM AI 分析] → 深度技术原理分析
↓
[数据统计] → 趋势分析、语言分布
↓
[日报生成] → Markdown 格式
↓
[多渠道存储] → Notion + history.json
↓
[消息推送] → QQ 群 + 邮件
| 组件 | 技术选型 | 版本要求 |
|---|---|---|
| 运行环境 | Node.js | v22+ |
| 包管理器 | npm | v10+ |
| HTTP 客户端 | Axios | latest |
| AI 模型 | GLM-4-Flash (智谱AI) | - |
| 知识库 | Notion API | 2022-06-28 |
| 定时任务 | node-cron | latest |
| 邮件发送 | Nodemailer | latest |
| WebSocket | ws | latest |
| 机器人框架 | Koishi | v4.18+ |
| TypeScript | TypeScript | v5+ |
- Node.js v22 或更高版本
- npm 或 yarn
- (可选)Docker - 用于运行 NapCat QQ 机器人
git clone https://github.com/joke-lx/github-notifier.git
cd github-notifiernpm install复制环境变量模板并填写配置:
cp .env.template .env
nano .env # 或使用你喜欢的编辑器.env文件包含敏感信息,不要提交到 Git- 所有配置项的详细说明见详细配置章节
# 开发模式(立即执行一次测试)
npm run dev
# 生产模式(启动定时任务)
npm start
# 使用 PM2 守护进程(推荐)
npm install -g pm2
pm2 start src/index.js --name github-daily
pm2 save
pm2 startup# 查看日志
tail -f logs/daily.log
# 检查 PM2 状态
pm2 status
pm2 logs github-daily项目使用 .env 文件管理所有配置。配置项分为以下几类:
- 必需配置 - 系统运行必须的配置
- 平台配置 - GitHub/GitLab/Bitbucket API
- AI 配置 - GLM 大模型配置
- 存储配置 - Notion 数据库配置
- 通知配置 - QQ/邮件/企业微信等
- 监控配置 - 采集过滤规则
- 性能配置 - 内存管理、并发控制
- 调度配置 - 定时任务配置
必需程度:⭐⭐⭐⭐⭐ (必须)
GLM_API_KEY=your_glm_api_key_here
GLM_API_URL=https://open.bigmodel.cn/api/paas/v4/chat/completions获取方式:
- 访问 智谱AI开放平台
- 注册/登录账号
- 进入「API Keys」页面
- 点击「创建 API Key」
- 复制生成的 Key(格式:
xxxxxxxx.xxxxxxxxxxxxxxxx)
注意事项:
- API Key 包含两部分,用
.分隔,必须完整复制 - 新用户有免费额度,约 100 万 tokens
- GLM-4-Flash 模型性价比最高,推荐使用
必需程度:⭐⭐⭐⭐⭐ (必须)
NOTION_TOKEN=your_notion_integration_token_here
NOTION_DATABASE_ID=your_database_id_here获取方式:
1. 创建 Notion Integration
- 访问 Notion Developers
- 点击「+ New integration」
- 填写基本信息:
- Name:
GitHub Daily Bot(或其他名称) - Associated workspace: 选择你的工作区
- Type:
Internal
- Name:
- 点击「Submit」
- 复制「Internal Integration Token」(格式:
ntn_xxxxxxxxxxxxxxxxxxxx)
2. 创建 Notion Database
- 在 Notion 中创建新页面
- 添加 Database,选择「Table」
- 设置 Database 属性:
- title (Title 类型) - 日报标题
- date (Date 类型) - 日报日期
- 点击右上角「...」→「Add connections」
- 选择刚创建的 Integration
3. 获取 Database ID
- 打开创建的 Database 页面
- 从 URL 中复制 Database ID
- URL 格式:
https://www.notion.so/username/[Database_ID]?v=... - Database ID 是 32 位字符串
- URL 格式:
注意事项:
- Token 和 Database ID 必须匹配同一个工作区
- Integration 必须添加到 Database 的连接中
必需程度:⭐⭐⭐⭐⭐ (必须)
GITHUB_TOKEN=your_github_token_here获取方式:
- 访问 GitHub Settings → Developer settings → Personal access tokens → Tokens (classic)
- 点击「Generate new token (classic)」
- 设置:
- Note:
GitHub Daily Bot - Expiration: 选择过期时间(建议 90 天或更长)
- Scopes: 勾选
public_repo(读取公共仓库)
- Note:
- 点击「Generate token」
- 复制 Token(格式:
ghp_xxxxxxxxxxxxxxxxxxxx)
注意事项:
- Token 只显示一次,请妥善保管
- 未认证用户每小时限制 60 次请求
- 认证用户每小时限制 5000 次请求
GITLAB_TOKEN=your_gitlab_token_here
GITLAB_URL=https://gitlab.com获取方式:
- 访问 GitLab User Settings → Access Tokens
- 点击「Add new token」
- 设置:
- Token name:
GitHub Daily Bot - Expiration: 选择过期时间
- Scopes: 勾选
read_api
- Token name:
- 点击「Create personal access token」
- 复制 Token
BITBUCKET_TOKEN=your_bitbucket_token_here获取方式:
- 访问 Bitbucket Settings → Access Tokens
- 点击「Create repository access token」
- 设置:
- Label:
GitHub Daily Bot - Permissions: 勾选
Repository: Read
- Label:
- 点击「Create」
- 复制 Token
必需程度:⭐⭐⭐ (推荐)
使用 NapCat(推荐)或 go-cqhttp 实现 QQ 通知。
方式一:使用 NapCat(推荐)
- 安装 NapCat:
docker run -d \
--name napcat \
--restart unless-stopped \
-p 3001:3001 \
-p 6099:6099 \
-v ~/napcat/config:/app/napcat/config \
docker.1ms.run/mlikiowa/napcat-docker:latest- 扫码登录 QQ:
# 查看二维码
docker logs -f napcat
# 或访问 Web UI
http://localhost:6099- 配置
.env:
QQ_BOT_SELF_ID=你的QQ号
QQ_GROUP_ID=你的QQ群号
QQ_BOT_HOST=127.0.0.1
QQ_BOT_PORT=3001方式二:使用 go-cqhttp
参考 go-cqhttp 文档
EMAIL_USER=your_email@gmail.com
EMAIL_PASS=your_email_password_or_app_passwordQQ 邮箱配置示例:
- 登录 QQ 邮箱网页版
- 进入「设置」→「账户」
- 开启「POP3/SMTP 服务」
- 点击「生成授权码」
- 使用授权码作为
EMAIL_PASS
EMAIL_USER=123456789@qq.com
EMAIL_PASS=abcdefghijklmnop # 授权码,不是QQ密码Gmail 配置示例:
- 启用两步验证
- 生成应用专用密码
- 使用应用专用密码作为
EMAIL_PASS
EMAIL_USER=yourname@gmail.com
EMAIL_PASS=abcd efgh ijkl mnop # 应用专用密码(包含空格)方式一:企业微信机器人
WEWORK_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key_here获取方式:
- 在企业微信群中点击「群设置」
- 选择「群机器人」→「添加机器人」→「新建机器人」
- 复制 Webhook URL 中的
key参数
方式二:企业微信应用消息
WECOM_CORP_ID=your_corp_id_here
WECOM_AGENT_ID=your_agent_id_here
WECOM_SECRET=your_secret_here
WECOM_TO_USER=@all # 或指定成员ID,多个用|分隔获取方式:
- 登录 企业微信管理后台
- 进入「应用管理」→「你的应用」
- 查看「应用信息」→「企业 ID」(
CORP_ID) - 查看「应用信息」→「AgentId」、
Secret
DINGTALK_WEBHOOK=your_dingtalk_webhook_url
DINGTALK_SECRET=your_dingtalk_secret # 可选,加签验证获取方式:
- 在钉钉群中点击「群设置」
- 选择「智能群助手」→「添加机器人」→「自定义」
- 设置机器人名称
- 选择「安全设置」:
- 方式一:「加签」- 复制密钥到
DINGTALK_SECRET - 方式二:「自定义关键词」- 添加关键词「日报」
- 方式一:「加签」- 复制密钥到
- 复制 Webhook URL
TELEGRAM_BOT_TOKEN=your_telegram_bot_token
TELEGRAM_CHAT_ID=your_telegram_chat_id获取方式:
1. 获取 Bot Token:
- 在 Telegram 中搜索 @BotFather
- 发送
/newbot - 按提示设置机器人名称
- 复制生成的 Token(格式:
123456789:ABCdefGHIjklMNOpqrsTUVwxyz)
2. 获取 Chat ID:
- 在 Telegram 中搜索 @userinfobot
- 发送
/start - 复制返回的 Chat ID
# 监控的编程语言(逗号分隔,留空则监控所有语言)
MONITOR_LANGUAGES=TypeScript,JavaScript,Vue,React,Next.js,Go,Rust
# 最小星标数(默认:100)
MIN_STARS=100
# 最小增长率(星/天,默认:5)
MIN_GROWTH=5
# 排除已归档的仓库(默认:true)
EXCLUDE_ARCHIVED=true
# 排除的仓库(逗号分隔)
EXCLUDE_REPOS=repo1/repo1,repo2/repo2说明:
MONITOR_LANGUAGES: 只采集指定语言的项目MIN_STARS: 过滤星标数低于此值的项目MIN_GROWTH: 过滤增长率低于此值的项目EXCLUDE_ARCHIVED: 排除已归档的仓库EXCLUDE_REPOS: 手动排除特定仓库
# AI 分析并发数(默认:3)
MAX_CONCURRENCY=3
# 缓存 TTL(毫秒,默认:1800000 = 30分钟)
CACHE_TTL=1800000
# Git Clone 超时时间(毫秒,默认:60000 = 60秒)
GIT_CLONE_TIMEOUT_MS=60000
# 最大仓库大小(MB,默认:50)
MAX_REPO_SIZE_MB=50
# 最大文件数量(默认:500)
MAX_FILE_COUNT=500
# 深度分析开关(默认:true)
DEEP_ANALYSIS_ENABLED=true
# 降级到 README 分析(默认:true)
FALLBACK_TO_README=true说明:
MAX_CONCURRENCY: 同时分析的项目数量,过高可能导致内存不足CACHE_TTL: 分析结果缓存时间GIT_CLONE_TIMEOUT_MS: Git Clone 超时时间MAX_REPO_SIZE_MB: 仓库大小超过此值则跳过深度分析MAX_FILE_COUNT: 文件数量超过此值则跳过深度分析DEEP_ANALYSIS_ENABLED: 是否启用代码深度分析FALLBACK_TO_README: 深度分析失败时是否降级到 README 分析
# 自动清理开关(默认:true)
AUTO_CLEAN_ENABLED=true
# 清理间隔(小时,默认:6)
CLEAN_INTERVAL_HOURS=6
# 内存阈值(MB,默认:800)
MEMORY_THRESHOLD_MB=800
# 日志保留天数(默认:7)
LOG_RETENTION_DAYS=7
# 临时代码目录
TEMP_CODE_DIR=/tmp/github-analysis说明:
AUTO_CLEAN_ENABLED: 启用自动内存清理CLEAN_INTERVAL_HOURS: 自动清理间隔MEMORY_THRESHOLD_MB: 进程内存超过此值时触发清理LOG_RETENTION_DAYS: 日志文件保留天数TEMP_CODE_DIR: Git Clone 临时目录
# 定时任务时间(默认:08:00)
SCHEDULE=08:00
# 时区(默认:Asia/Shanghai)
TZ=Asia/Shanghai说明:
SCHEDULE: 支持「HH:MM」格式或 Cron 表达式- 简单格式:
08:00、09:30 - Cron 表达式:
0 8 * * *(每天 8 点)
- 简单格式:
TZ: 支持的时区:Asia/Shanghai- 北京时间Asia/Tokyo- 东京时间America/New_York- 纽约时间Europe/London- 伦敦时间UTC- UTC 时间
Cron 表达式示例:
# 每天早上 8 点
SCHEDULE=0 8 * * *
# 每周一早上 9 点
SCHEDULE=0 9 * * 1
# 每天早上 8 点和下午 6 点
SCHEDULE=0 8,18 * * *
# 每 2 小时
SCHEDULE=0 */2 * * *# Web 服务器开关(默认:false)
WEB_SERVER_ENABLED=false
# Web 服务器端口(默认:3000)
WEB_SERVER_PORT=3000说明:
- 提供 HTTP 接口手动触发日报生成
- 端点:
POST /api/trigger
github-notifier/
├── src/ # 核心源代码
│ ├── index.js # 主入口 - 定时任务调度器
│ │
│ ├── collectors/ # 数据采集模块
│ │ ├── github.js # GitHub API 采集
│ │ ├── gitlab.js # GitLab API 采集
│ │ ├── bitbucket.js # Bitbucket API 采集
│ │ └── unified.js # 统一采集器(多平台)
│ │
│ ├── analyzers/ # AI 分析模块
│ │ ├── glm.js # GLM 大模型分析器
│ │ └── data-analyzer.js # 数据统计分析
│ │
│ ├── generators/ # 内容生成模块
│ │ └── daily-report.js # 日报模板生成器
│ │
│ ├── notifiers/ # 消息推送模块
│ │ ├── qq-napcat.js # QQ 通知 (NapCat)
│ │ ├── email.js # 邮件通知
│ │ └── qq-koishi.js # Koishi 集成
│ │
│ ├── notion/ # Notion 集成
│ │ └── client.js # Notion API 客户端
│ │
│ ├── utils/ # 工具模块
│ │ ├── cache.js # 缓存系统
│ │ ├── cleanup.js # 内存管理
│ │ ├── code-manager.js # 代码克隆与分析
│ │ ├── concurrent.js # 并发处理器
│ │ ├── scheduler.js # Cron 调度器
│ │ ├── logger.js # 日志系统
│ │ ├── config-validator.js # 配置验证
│ │ └── api-retry.js # API 重试机制
│ │
│ └── web/ # Web 服务
│ └── server.js # HTTP 接口
│
├── koishi-bot/ # Koishi 机器人
│ ├── plugins/
│ │ └── qa-bot/ # QA Bot 插件
│ │ ├── index.ts # 插件入口
│ │ ├── knowledge.ts # 知识库管理
│ │ ├── glm-client.ts # GLM API 客户端
│ │ └── prompts.ts # Prompt 构建器
│ ├── config.yml # Koishi 配置
│ └── package.json # 依赖管理
│
├── data/ # 数据存储
│ ├── history.json # 历史日报
│ └── cache/ # 缓存目录
│
├── logs/ # 日志目录
│ └── daily.log # 运行日志
│
├── .env.template # 环境变量模板
├── .gitignore # Git 忽略文件
├── package.json # 依赖管理
└── README.md # 项目说明
┌──────────────────────────────────────────────────────────────────┐
│ 每日定时任务流程 │
│ (每天早上 8:00 执行) │
└──────────────────────────────────────────────────────────────────┘
[步骤 0] 内存检查 (1-2秒)
├─ 检查进程内存使用
├─ 检查系统内存使用
└─ 超过阈值则触发清理
[步骤 1] 数据采集 (30-60秒)
├─ GitHub Trending API
│ └─ 获取热门仓库列表
├─ 过滤条件
│ ├─ Star 增长率 > 5/天
│ ├─ 排除 archived 仓库
│ └─ 限制特定语言
└─ 输出: trendingRepos[]
[步骤 2] 深度分析 (5-15分钟,并发处理)
│
├─ 对每个仓库执行:
│ │
│ ├─ [2.1] Git Clone
│ │ └─ 克隆到 /tmp/github-repos/
│ │
│ ├─ [2.2] 代码结构提取
│ │ ├─ 扫描 package.json、README.md
│ │ ├─ 分析源代码目录
│ │ └─ 提取核心文件 (limit: 3000 tokens)
│ │
│ ├─ [2.3] 获取 README
│ │ └─ 通过 GitHub API 获取
│ │
│ └─ [2.4] GLM AI 深度分析
│ ├─ Prompt: 项目信息 + 代码结构 + README
│ ├─ GLM-4-Flash 模型
│ └─ 输出: 技术原理分析 (Markdown)
│
└─ 并发控制: 最多 3 个仓库同时分析
[步骤 3] 趋势分析 (<1秒)
├─ DataAnalyzer.analyzeTechStack()
│ ├─ 语言分布统计
│ ├─ 平均 Star 数
│ └─ Top 语言排名
│
└─ DataAnalyzer.analyzeTrends()
├─ 新上榜项目
├─ 持续热门项目
└─ 增长冠军
[步骤 4] 日报生成 (<1秒)
├─ 构建报告标题
├─ 格式化每个项目分析
└─ 生成趋势总结
[步骤 5] Notion 存储 (10-30秒)
├─ 创建新页面
├─ 批量添加内容块 (每批 100 个)
├─ Markdown → Notion Blocks 转换
└─ 返回页面 URL
[步骤 6] 消息推送 (5-10秒)
├─ QQ 群通知
│ ├─ 发送日报摘要
│ ├─ Notion 链接
│ └─ @全体成员
│
├─ 邮件通知 (备选)
│ └─ HTML 格式邮件
│
└─ 企业微信/钉钉 (备选)
[步骤 7] 历史保存 (<1秒)
└─ DataAnalyzer.saveDailyReport()
├─ 保存到 data/history.json
├─ 包含: name, url, language, stars, growthRate
├─ 新增: description, analysis
└─ 只保留最近 30 天
[步骤 8] 清理工作
├─ 删除临时克隆的代码
├─ 清理过期缓存
└─ 记录运行日志
总耗时: 约 5-15 分钟(取决于项目数量)
项目包含一个 Koishi 问答机器人,可以基于历史日报回答项目相关问题。
启动 QA 机器人:
cd koishi-bot
npm install
npm run dev在 QQ 群中 @机器人 提问:
- "pdf.js 这个项目讲了什么?"
- "最近有什么 Vue 相关的项目?"
- "TypeScript 项目有哪些?"
- "这个项目是做什么的?"
- "技术架构是怎样的?"
机器人从以下来源检索知识:
- 本地历史 -
data/history.json - 代码索引 -
src/目录结构 - 文档索引 - 项目根目录的
.md文件 - Notion API - Notion 数据库
- 项目名匹配:+5 分(权重最高)
- 编程语言匹配:+3 分
- 分析内容匹配:+1 分
const GitHubCollector = require('./src/collectors/github');
const collector = new GitHubCollector({
token: process.env.GITHUB_TOKEN,
languages: ['TypeScript', 'JavaScript'],
minStars: 100,
minGrowth: 5
});
// 获取热门仓库
const trendingRepos = await collector.getTrendingRepos();const GLMAnalyzer = require('./src/analyzers/glm');
const analyzer = new GLMAnalyzer({
apiKey: process.env.GLM_API_KEY,
apiUrl: process.env.GLM_API_URL
});
// 深度分析仓库
const analysis = await analyzer.analyzeRepositoryDeep(
repo,
codeStructure,
readme
);const NotionClient = require('./src/notion/client');
const notionClient = new NotionClient();
// 创建日报
const pageUrl = await notionClient.createDailyReport(
'2026-02-09',
repositories
);
// 获取最近的日报
const recentReports = await notionClient.getRecentReports(10);
// 获取页面内容
const content = await notionClient.getPageContent(pageId);问题:API rate limit exceeded
原因:GitHub API 请求超限
解决方案:
- 检查
GITHUB_TOKEN是否正确 - 等待 1 小时后重置(未认证用户)
- 使用认证 Token(每小时 5000 次请求)
- 减少
MONITOR_LANGUAGES范围
问题:GLM API 调用失败
原因:API Key 错误或额度不足
解决方案:
- 检查 API Key 是否完整(包含
.部分) - 确认账户有足够额度
- 检查网络连接
- 查看 智谱AI文档
问题:QQ 推送失败 或 socket hang up
原因:NapCat 未运行或配置错误
解决方案:
-
确认 NapCat 容器正在运行
docker ps | grep napcat -
检查端口是否开放
telnet 127.0.0.1 3001
-
查看 NapCat 日志
docker logs -f napcat
-
重新扫码登录
docker logs napcat # 查看二维码 -
测试 WebSocket 连接
node -e " const WebSocket = require('ws'); const ws = new WebSocket('ws://127.0.0.1:3001'); ws.on('open', () => { ws.send(JSON.stringify({ action: 'get_status' })); }); ws.on('message', (data) => console.log('Response:', data.toString())); ws.on('error', (err) => console.error('Error:', err.message)); "
-
检查 QQ 机器人是否在线
- NapCat 连接失败通常是临时网络问题
- 邮件通知会作为备选方案自动发送
问题:Notion 页面创建失败
原因:Database ID 或 Token 错误,或网络连接问题
解决方案:
- 检查 Database ID 是否正确(32 位字符串)
- 确认 Notion Token 有权限
- 检查数据库 Schema 配置
- 确保 Integration 已添加到 Database
网络问题(ETIMEDOUT/ECONNREFUSED):
从 v1.1.0 开始,Notion 同步失败不会中断整个流程,通知仍会正常发送。
-
检查网络连接
curl -I https://api.notion.com
-
手动测试 Notion API
node -e " const https = require('https'); const options = { hostname: 'api.notion.com', path: '/v1/users/me', headers: { 'Authorization': 'Bearer ' + process.env.NOTION_TOKEN, 'Notion-Version': '2022-06-28' } }; https.get(options, (res) => { console.log('Status:', res.statusCode); res.on('data', (d) => console.log(d.toString())); }); "
-
如果持续超时,可能是临时网络中断,稍后重试即可
问题:JavaScript heap out of memory
原因:分析的仓库太大或并发数过高
解决方案:
-
降低并发数
MAX_CONCURRENCY=1
-
减小仓库大小限制
MAX_REPO_SIZE_MB=30 MAX_FILE_COUNT=300
-
关闭深度分析
DEEP_ANALYSIS_ENABLED=false
-
增加 Node.js 内存限制
node --max-old-space-size=4096 src/index.js
问题:克隆失败 或 克隆超时
原因:
- 网络连接不稳定
- 仓库过大
- Git 锁文件冲突
解决方案:
-
清理 Git 临时目录
rm -rf /tmp/github-analysis/* -
手动修复锁文件
find /tmp/github-analysis -name "*.lock" -delete -
降低并发数
// 修改 src/utils/concurrent.js maxConcurrency: 2 // 从 3 降到 2
-
系统会自动降级到 README 分析,不会丢失数据
注意:深度分析失败时,系统会自动使用 README 分析,确保流程继续执行。
A:可能的原因:
- 仓库大小超过
MAX_REPO_SIZE_MB限制 - 文件数量超过
MAX_FILE_COUNT限制 - Git Clone 超时
- 代码主要是二进制文件(图片、视频等)
系统会自动降级到 README 分析。
A:修改 .env 文件中的 SCHEDULE 配置:
# 简单格式
SCHEDULE=09:00
# Cron 表达式
SCHEDULE=0 9 * * *重启服务后生效。
A:修改 .env 文件中的 MONITOR_LANGUAGES:
MONITOR_LANGUAGES=TypeScript,Vue,Go留空则监控所有语言。
A:
- 本地:
data/history.json(最近 30 天) - Notion:永久存储在配置的数据库中
A:
# 查看实时日志
tail -f logs/daily.log
# 使用 PM2
pm2 logs github-daily
# 查看最近的错误
grep ERROR logs/daily.log | tail -20A:
# 方法一:直接运行
npm run dev
# 方法二:使用 Web API(需要开启 WEB_SERVER_ENABLED)
curl -X POST http://localhost:3000/api/triggerA:
- 确保本地历史有数据(
data/history.json) - 重新启动 Koishi Bot 加载最新知识
- 使用更具体的问题关键词
A:
推荐使用 PM2:
# 安装 PM2
npm install -g pm2
# 启动服务
pm2 start src/index.js --name github-daily
# 保存 PM2 配置
pm2 save
# 设置开机自启
pm2 startup欢迎提交 Issue 和 Pull Request!
请使用以下模板:
## 问题描述
简要描述问题
## 复现步骤
1. 步骤一
2. 步骤二
## 期望行为
描述期望的正确行为
## 环境信息
- Node.js 版本:
- 操作系统:
- 错误日志:
## 截图(可选)- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
MIT License
- GitHub: @joke-lx
- Issues: GitHub Issues
Made with ❤️ by joke-lx
如果这个项目对你有帮助,请给个 ⭐ Star!