logo
0
0
WeChat Login
fix: merge dependency installation into runtime stage for cron task

Hacker News Crawler with CNB AI Summary

自动化爬取 Hacker News 热门内容,调用 CNB AI 生成汇总,并自动创建 Issue。

功能特性

  • 📡 自动爬取 Hacker News 热门内容(Top 30)
  • 🤖 调用 CNB AI Chat API 生成智能汇总
  • 📝 自动创建 CNB Issue 保存每日汇总
  • ⏰ 支持 CNB 定时任务自动执行
  • 🔘 支持手动触发(Web Trigger)
  • 🔄 自动重试和错误处理机制

项目结构

. ├── auto_crawl_and_issue.py # 主脚本:爬取 HN 内容并创建 Issue ├── hn_crawler.py # Hacker News 爬虫模块 ├── ai_summary.py # CNB AI 汇总模块 ├── cnb_api.py # CNB API 封装模块 ├── requirements.txt # Python 依赖 ├── .cnb.yml # CNB 流水线配置 └── .cnb/web_trigger.yml # CNB Web Trigger 配置

环境要求

Python 环境

  • Python 3.11+

依赖安装

pip install -r requirements.txt

依赖列表:

  • requests>=2.31.0 - HTTP 请求库
  • python-dotenv>=1.0.0 - 环境变量管理

环境变量

变量名必需说明
CNB_TOKENCNB API 访问令牌(在 CNB 流水线环境中自动注入)

模块说明

cnb_api.py

CNB HTTP API 封装模块,提供 Issue 创建和管理功能。

主要类

  • CNBAPI: CNB API 客户端

主要方法

  • create_issue(title, body, labels): 创建 Issue
  • update_issue(issue_id, ...): 更新 Issue
  • get_issue(issue_id): 获取 Issue 详情
  • list_issues(state, page, ...): 列出 Issue
  • create_issue_comment(issue_id, body): 创建 Issue 评论
  • close_issue(issue_id): 关闭 Issue

错误处理

  • 自动重试机制(最多 3 次)
  • 指数退避策略(2秒 → 4秒 → 8秒)
  • 4xx 错误不重试,5xx 错误重试
  • 网络错误自动重试

使用示例

from cnb_api import CNBAPI api = CNBAPI(repo="group/repo") result = api.create_issue( title="Issue 标题", body="Issue 内容", labels=["automated", "hacker-news"] ) print(f"Issue ID: {result['iid']}") print(f"Issue URL: {result['web_url']}")

auto_crawl_and_issue.py

主脚本,整合爬虫、AI 汇总和 Issue 创建功能。

执行流程

  1. 爬取 Hacker News Top 30 热门内容
  2. 调用 CNB AI 生成汇总
  3. 创建 Issue(包含 AI 总结和原始内容)
  4. 保存到文件(output/hn_issue_YYYYMMDD_HHMMSS.md
  5. 调用 CNB API 创建 Issue

使用方式

# 直接运行(需要 CNB_TOKEN 环境变量) python3 auto_crawl_and_issue.py # 或通过 CNB 流水线触发

CNB 流水线配置

定时任务

每天早上 8:00 自动执行:

main: "crontab: 0 8 * * *": - name: hacker-news-daily-crawler stages: - name: run-crawler-and-save image: python:3.11-slim script: - pip install requests python-dotenv -q - python3 auto_crawl_and_issue.py artifacts: paths: - output/ expire_in: 7 days

Web Trigger(手动触发)

在 CNB 仓库详情页点击"手动爬取 HN"按钮触发。

配置文件.cnb/web_trigger.yml

branch: - buttons: - name: 手动爬取 HN description: 手动触发 Hacker News 内容爬取和总结 event: web_trigger_hn_crawler isDefault: true

API 配置

  • API 基础 URL: https://api.cnb.cool
  • 认证方式: Bearer Token(通过 CNB_TOKEN 环境变量)
  • 超时设置: 30 秒
  • 重试策略: 指数退避

Issue 模板

创建的 Issue 包含以下内容:

# Hacker News 每日汇总 - YYYY-MM-DD > 🤖 本内容由自动化爬虫生成,每日早上 8:00 更新 --- ## 📊 今日热点概要 [AI 生成的汇总] --- ## 📋 热门内容列表 [原始内容列表] --- ## 📝 元信息 - 生成时间: YYYY-MM-DD HH:MM:SS - 数据来源: Hacker News - 自动化任务: CNB 定时爬取服务

开发指南

本地开发

  1. 克隆仓库
  2. 安装依赖:pip install -r requirements.txt
  3. 设置 CNB_TOKEN 环境变量
  4. 运行:python3 auto_crawl_and_issue.py

添加新功能

  1. 修改对应的模块文件
  2. 更新 requirements.txt(如需新依赖)
  3. 更新 .cnb.yml 流水线配置
  4. 提交并推送到 CNB

故障排查

定时任务触发失败(ModuleNotFoundError)

可能原因

  • CNB 流水线每个 stage 使用独立容器
  • 依赖安装在单独的 stage,但运行时不可用

解决方案

  • 将依赖安装命令合并到运行 stage
  • 确保在同一 stage 中先 pip install 再运行脚本
  • 参考 .cnb.yml 配置示例

Issue 创建失败

可能原因

  • CNB_TOKEN 未设置或无效
  • 网络连接问题
  • API 限流

解决方案

  • 检查 CNB 流水线环境变量配置
  • 查看 API 重试日志
  • 确认仓库权限正确

AI 汇总失败

可能原因

  • CNB AI API 不可用
  • API 请求超时

解决方案

  • AI 汇总失败不影响 Issue 创建
  • Issue 会标记"AI 汇总生成失败"

许可证

MIT License