JOURNAL / WORDS & IDEAS

GitHub Actions 定时任务:用 Python 更新个人项目

用定时工作流运行 Python 脚本,生成数据并提交到仓库,记录权限与异常处理要点。

阅读设置

核心目标:利用 GitHub Actions 定时生成和更新有实际用途的项目数据。 技术栈:GitHub Actions (CI/CD) + Python + Git


一、 核心原理 (The Mechanism)

不是简单的“刷量”,而是利用 CI/CD 流程完成“定时任务”。

  1. Trigger (触发):Cron 定时器 (0 8 * * *) 唤醒 GitHub 服务器。
  2. Runner (环境):GitHub 启动一台 Ubuntu 虚拟机。
  3. Execute (执行):运行 Python 脚本(API 抓取、数据处理、文件生成)。
  4. Push (回传):脚本以你的身份将变更(修改 README、保存图片/数据)提交回仓库。
  5. Result (结果):生成内容更新;是否计入贡献图取决于提交邮箱、目标分支等 GitHub 规则。

二、 标准工程结构 (SOP)

最小示例可从这 3 个核心文件开始:

1. 依赖文件 requirements.txt

requests
## 其他库:playwright, numpy, pillow 等按需添加

2. 业务脚本 main.py (或其他命名)

负责核心逻辑。关键是要处理好文件路径和异常捕获。

3. 自动化配置 .github/workflows/run.yml

工作流示例(依赖版本与产出路径需按项目调整):

name: Auto Task Name # 任务名称

on:
  schedule:
    - cron: '0 0 * * *' # UTC时间0点(北京时间8点)
  workflow_dispatch:    # 允许手动触发

permissions:
  contents: write       # 必须开启写入权限

jobs:
  run_task:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4 # 1. 拉取代码

    - uses: actions/setup-python@v4 # 2. 装Python
      with:
        python-version: '3.x'

    - run: pip install -r requirements.txt # 3. 装依赖

    - name: Run Script
      run: python main.py # 4. 跑脚本

    - name: Commit & Push # 5. 提交结果
      run: |
        # ⚠️ 关键:邮箱必须和 GitHub 账号一致
        git config --global user.email "你的邮箱@example.com"
        git config --global user.name "你的用户名"

        # 只暂存预期产物,脚本应先生成它们
        git add README.md data/

        # 防空提交报错
        git diff --quiet && git diff --staged --quiet || (git commit -m "🤖 Auto update: $(date +'%Y-%m-%d')" && git push)

三、 精选实战方案库 (Projects Catalog)

可以将以下方案拆分为不同仓库,或整合在一个仓库的不同 Workflow 中。

1. 📊 个人仪表盘 (Personal Dashboard)

  • 功能:每天更新天气、Hacker News 热点、每日名言。
  • 特点:适合放在 Profile 仓库 (username/username)。
  • 核心库:requests
  • API 资源:
    • 天气:wttr.in (图片直链)
    • 新闻:hacker-news.firebaseio.com
    • 名言:api.quotable.io

2. 💰 虚拟量化交易员 (Paper Trader)

  • 功能:初始 $10,000 资金,每日根据 BTC 价格自动买卖,记录盈亏。
  • 特点:硬核技术展示,生成 CSV 交易流水和收益率报表。
  • 关键逻辑:
    • 若 current < last * 0.98 -> 买入 (Buy Dip)
    • 若 current > last * 1.02 -> 卖出 (Take Profit)
    • 注意:要在脚本开头强制创建 data/ 文件夹。

3. 🚦 网站宕机监控 (Uptime Monitor)

  • 功能:每 6 小时 Ping 关注的网站(Google, Blog, API)。
  • 特点:Serverless 监控,生成状态表格。
  • 核心库:requests (检测 status_code 是否为 200)。

4. 📘 自动背单词 (Vocabulary Builder)

  • 功能:每日抓取金山词霸/扇贝单词,更新 Markdown 并归档历史。
  • 特点:结合 Issues 功能打卡,展现学习态度。

5. 🖼️ Bing 壁纸归档 (Wallpaper Archive)

  • 功能:每日下载 Bing 高清壁纸,按月归档。
  • 特点:视觉效果极佳,仓库体积会随时间增长,变成图库。
  • API:bing.com/HPImageArchive.aspx

6. 🎮 Epic 喜加一提醒 (Game Notifier)

  • 功能:每周五检测 Epic 商城免费游戏。
  • 特点:实用工具,薅羊毛神器。

7. 📸 网页时光机 (Web Time Machine)

  • 功能:每日对指定网站(如 Apple 官网)截图保存。
  • 核心库:playwright (需要 playwright install 步骤)。

四、 避坑指南 (Troubleshooting)

在实操中容易遇到的报错及解决方案:

  1. 错误:pathspec 'data/' did not match any files
    • 原因:脚本因网络错误未运行成功,导致 data/ 文件夹未生成,git add data/ 找不到目标。
    • 解法:
      1. Python 脚本中优先执行 os.makedirs("data")。
      2. 检查脚本退出状态和输出文件,只有产物存在时才暂存指定路径。
  2. 错误:绿格子没亮
    • 原因:git config 中的邮箱与 GitHub 账户不匹配。
    • 解法:检查 Settings -> Emails,确保 YML 中的 user.email 一字不差。
  3. 错误:Permission denied (403)
    • 原因:Action 没有写入仓库的权限。
    • 解法:仓库 Settings -> Actions -> General -> Workflow permissions -> 勾选 Read and write permissions。
  4. 技巧:如何不想要很多 Commit 记录?
    • 解法:可以使用 git commit --amend 强推(不推荐,容易丢数据),或者利用 GitHub Action 的 Artifacts 只存数据不提交代码(但这不会亮绿格子)。推荐保持现状,真实的 Commit 也是一种记录。

五、 进阶技术路线图 (Roadmap)

当你玩腻了简单的 API 调用,可以向以下方向深挖:

  1. AI Agent (智能体)
    • 接入 DeepSeek/OpenAI API,让脚本具备“点评”能力(如:AI 点评今日新闻、AI 分析股价情绪)。
  2. 逆向工程 (Reverse Engineering)
    • 使用 Playwright 或 Mitmproxy 抓取有反爬策略的动态网页数据。
  3. HomeLab (家庭实验室)
    • 从云端转入本地,利用 Docker + DDNS 搭建私有服务(如 Home Assistant, NAS)。
  4. Web3 开发
    • 研究 Solidity,编写链上套利机器人或发币合约。

调度边界

示例 schedule 使用 UTC,任务可能延迟,不适合严格实时调度。权限应仅给需要写入仓库的任务;提交邮箱不必公开真实邮箱,可使用匹配账号的隐私邮箱。外部 API、配额与素材使用范围需要分别确认。