一个可开源、可部署的网站版个性化文献推送系统。项目默认面向细胞生物学研0学生,使用 PubMed 官方 E-utilities 检索近期论文,按个人关键词偏好打分排序,并支持 Markdown 日报、命令行定时任务和邮件推送。
- 网站表单:在线调整检索式、关键词权重、检索天数和推送篇数。
- PubMed 检索:不依赖爬虫,使用官方接口。
- 个性化排序:核心词加权、扩展词加权、低价值词降权。
- Markdown 导出:适合保存、发给导师或同步到知识库。
- 本地定时:Windows 计划任务脚本。
- 邮件推送:支持 SMTP,可选开启。
- 开源部署:内置 Flask、Gunicorn、Render 配置。
安装依赖:
pip install -r requirements.txt启动网站:
python app.py浏览器打开:
http://127.0.0.1:5000
Windows 也可以直接双击 start_web.bat,或在 PowerShell 运行:
.\start_web.ps1使用网站时请保持启动窗口不要关闭;关闭窗口后网站也会停止。
- 复制配置:
Copy-Item config.example.toml config.toml- 编辑
config.toml:
search.pubmed_query:改成你当前课题最相关的关键词。ranking.must_have/nice_to_have:决定排序偏好。email.enabled:需要邮件推送时改为true并填写 SMTP。
- 试运行:
python literature_push.py --config config.toml --dry-run报告会生成在 reports/。
- 注册每天定时任务:
.\schedule_windows.ps1 -Time "08:30"项目已包含 Vercel 部署入口:
api/index.py:Vercel Python Serverless 入口vercel.json:路由和 Cron 配置/api/cron/push:定时推送入口
Hobby 计划下建议不要使用 Vercel Cron 做每小时任务。项目改为:
- Vercel:部署网站和
/api/cron/push推送接口 - GitHub Actions:每小时调用一次
/api/cron/push
.github/workflows/cron-push.yml 中的计划任务:
schedule:
- cron: "0 * * * *"系统不会每小时都给用户发邮件,而是由每个订阅自己的设置决定是否到点发送。用户可以设置:
- 每天
- 工作日
- 每周
- 暂停
- 推送时间,按
Asia/Shanghai解释
如果用户设置 08:30,由于 Cron 每小时触发,通常会在 09:00 这一轮补发,不会在 08:00 提前发送。
在 GitHub 仓库 Settings → Secrets and variables → Actions 中添加:
Repository secret:
SCIPUSH_CRON_SECRET=和 Vercel 环境变量 CRON_SECRET 完全相同的值
Repository variable:
SCIPUSH_CRON_URL=https://scipush.vercel.app/api/cron/push
也可以在 Actions 页面手动运行 Scheduled literature push,用于立即测试定时入口。
本地开发默认使用 SQLite;Vercel 生产环境必须使用持久数据库。推荐在 Vercel Marketplace 添加 Neon/Postgres,并获得:
DATABASE_URL
如果没有 DATABASE_URL,订阅和去重数据无法在 Vercel Serverless 环境中长期保存。
在 Vercel Project Settings → Environment Variables 中添加:
DATABASE_URL=你的 Neon/Postgres 连接串
SMTP_HOST=smtp.163.com
SMTP_PORT=465
SMTP_USE_SSL=true
SMTP_USERNAME=scipush@163.com
SMTP_PASSWORD=你的 SMTP 授权码
SMTP_FROM=scipush@163.com
PUBLIC_BASE_URL=https://你的-vercel-域名
SECRET_KEY=生成一个长随机字符串,用于登录会话
CRON_SECRET=生成一个长随机字符串
SMTP_PASSWORD 和 CRON_SECRET 不要提交到 GitHub。
- 把代码推送到 GitHub。
- 打开 Vercel Dashboard,选择 Add New → Project。
- 导入 GitHub 仓库
VidsHidden/scipush。 - Framework Preset 选择 Other。
- 部署后,把
PUBLIC_BASE_URL改成 Vercel 分配的正式域名。
npm i -g vercel
vercel login
vercel
vercel --prod- 把项目推送到 GitHub。
- 打开 Render,选择 New Web Service。
- 连接 GitHub 仓库。
- Render 会读取
render.yaml,使用:
Build Command: pip install -r requirements.txt
Start Command: gunicorn app:app
- 部署完成后即可通过 Render 分配的域名访问。
只要平台支持 Python Web 服务即可:
pip install -r requirements.txt
gunicorn app:app本项目也可以部署到 Railway、Fly.io、VPS、学校服务器或 Docker 化后部署。
docker build -t open-literature-push .
docker run -p 8000:8000 open-literature-push访问:
http://127.0.0.1:8000
建议创建 GitHub 仓库后补充:
- 仓库名称:
open-literature-push - 项目简介:
Personalized PubMed literature push for biology students and labs - License:MIT
- Topics:
pubmed,literature-review,flask,biology,open-source
不要提交个人配置和邮箱授权码;.gitignore 已排除 config.toml、数据库、报告和日志。
网站本身负责保存订阅条件,真正的推送由 push_worker.py 定时执行:
- 读取
data/subscriptions.sqlite3中的订阅。 - 按每个订阅的研究领域、关键词、文章体裁和期刊筛选检索 PubMed。
- 按个性化规则打分排序。
- 用订阅级别的去重表过滤已经推送过的 PMID。
- 通过 SMTP 发送邮件,并在邮件底部附带退订链接。
启动网站后,填写检索条件和“推送邮箱”,点击“保存推送订阅”。
push_worker.py 使用环境变量读取邮件配置:
[Environment]::SetEnvironmentVariable("SMTP_HOST", "smtp.example.com", "User")
[Environment]::SetEnvironmentVariable("SMTP_PORT", "587", "User")
[Environment]::SetEnvironmentVariable("SMTP_USERNAME", "your_email@example.com", "User")
[Environment]::SetEnvironmentVariable("SMTP_PASSWORD", "你的SMTP授权码", "User")
[Environment]::SetEnvironmentVariable("SMTP_FROM", "your_email@example.com", "User")
[Environment]::SetEnvironmentVariable("PUBLIC_BASE_URL", "http://127.0.0.1:5000", "User")设置后重新打开 PowerShell。
默认 AI provider 是 Gemini。先在 .env 里加入:
AI_TRANSLATION_PROVIDER=gemini
AI_TRANSLATION_MODEL=gemini-2.5-flash-lite
AI_TRANSLATION_API_KEY=你的 Gemini API Key
AI_TRANSLATION_ENABLED=true
AI_SUMMARY_PROVIDER=gemini
AI_SUMMARY_MODEL=gemini-2.5-flash-lite
AI_SUMMARY_API_KEY=你的 Gemini API Key
AI_PUSH_SUMMARY_ENABLED=false保存订阅时可选择目标语言,并勾选“双语标题和摘要”。系统会缓存每篇 PMID 的译文;API 不可用时仍会发送英文原文。若要试用推送小结,把订阅中的“生成 AI 推送小结”勾上,并将 AI_PUSH_SUMMARY_ENABLED=true。
如果翻译和小结暂时共用同一个 API,也可以继续使用旧变量作为 fallback:
AI_PROVIDER=gemini
AI_MODEL=gemini-2.5-flash-lite
AI_API_KEY=你的 Gemini API KeyDeepSeek 兼容 OpenAI Chat Completions。可以只把小结切到 DeepSeek:
AI_SUMMARY_PROVIDER=deepseek
AI_SUMMARY_MODEL=deepseek-v4-flash
AI_SUMMARY_API_KEY=你的 DeepSeek API Key
AI_SUMMARY_BASE_URL=https://api.deepseek.com
AI_PUSH_SUMMARY_ENABLED=true也可以把翻译切到 DeepSeek:
AI_TRANSLATION_PROVIDER=deepseek
AI_TRANSLATION_MODEL=deepseek-v4-flash
AI_TRANSLATION_API_KEY=你的 DeepSeek API Key
AI_TRANSLATION_BASE_URL=https://api.deepseek.com
AI_TRANSLATION_ENABLED=trueAI_*_BASE_URL 对 DeepSeek 可省略,默认就是 https://api.deepseek.com。如果两个功能共用同一个 DeepSeek Key,也可以只设置一次:
DEEPSEEK_API_KEY=你的 DeepSeek API Keypython push_worker.py --dry-run真实发送:
python push_worker.py登录后也可以在“我的订阅”中点击“立即测试推送”。测试推送会发送当前订阅匹配结果,但不会写入正式去重记录,不影响下一次正常定时推送。
生成本地 HTML demo,不发送邮件:
python demo_email.py打开:
reports/email_demo.html
网站运行时也可以访问:
http://127.0.0.1:5000/email-demo
.\schedule_push_worker.ps1 -Time "08:30"如果使用邮箱 SMTP,把 config.toml 的 [email] 填好,并设置邮箱授权码环境变量:
[Environment]::SetEnvironmentVariable("LIT_PUSH_EMAIL_PASSWORD", "你的SMTP授权码", "User")之后重新打开 PowerShell 或重启电脑,让环境变量生效。
当前默认配置参考了你的背景和课题组网页公开方向,偏向:
- 细胞生物学机制
- 免疫与炎症
- 单细胞/空间组学
- 系统生物学与生物信息
- 疾病、治疗和标志物相关研究
当你明确进入具体课题后,建议把默认词替换为更窄的组合。例如:
(autophagy OR lysosome OR mitochondria) AND (immune OR inflammation) AND single-cell
或:
(tumor microenvironment OR macrophage OR T cell) AND (spatial transcriptomics OR single-cell)
- 报告:
reports/literature_push_YYYYMMDD_HHMMSS.md - 去重数据库:
data/literature_push.sqlite3
如果想从头重新推送,删除 data/literature_push.sqlite3 即可。
- 用户账号与个人配置保存
- 每日/每周邮件队列
- RSS 和 bioRxiv 支持
- LLM 摘要与中文解读
- Zotero / Notion / Obsidian 导出