译:利用 GitHub Actions 监控 API 响应(或网页)变更并接收通知

7 阅读2分钟

核心摘要

这是一个可自定义的 GitHub Action 工作流,通过 cURLjq 和 Twilio 工具,当网页或 API 响应发生变更时,以短信形式向你发送通知。

配置步骤(Setup)

若要配置 “变更通知”(notify-on-changes)GitHub Action,以监控你指定的 API 或网页响应变更,请遵循以下步骤:

  1. 将下方代码片段保存为 YAML 文件,并放入 GitHub 仓库的 .github/workflows/ 文件夹中(例如,保存为 .github/workflows/check.yml),公开仓库或私有仓库均可。

  2. 将占位符 <URL YOU WANT TO CHECK HERE> 替换为你要监控的实际 API 端点或网页 URL。²

  3. 若需解析 JSON 响应,以便在通知中包含响应中的特定字段,可修改 jq 查询语句;若无需解析,可直接删除 “Parse data”(解析数据)步骤。

  4. 若使用 Twilio 接收短信通知,请按照配置说明操作,将密钥和电话号码保存为仓库 “密钥”(secrets),并根据你的使用场景自定义短信内容;若使用其他通知方式,只需将 “Notify if data has changed”(数据变更时通知)步骤替换为你所需的通知机制即可。³

  5. 提交代码后,每当 API 或网页响应发生变更,你都会自动收到通知。

示例工作流(Example workflow)

以下是我使用的完整工作流注释版 YAML 代码:

on:
  schedule:
    # 每小时整点运行一次,可自定义为最短每 5 分钟检查一次
    - cron:  '0 * * * *'

name: Check for changes

jobs:
  check:
    runs-on: ubuntu-latest
    steps:

      # 使用 cURL 获取指定 URL,并将响应保存为 data.json
      - name: Fetch data
        run: curl "<URL YOU WANT TO CHECK HERE>" -o data.json

      # 可选:使用 jq 从 JSON 中提取字段,以便在短信中展示
      - name: Parse data
        id: parse_data
        run: echo '::set-output name=someField::'$(jq -r '.someField' data.json)

      # 通过响应内容的哈希值作为缓存键,与上一次运行结果比对
      - name: Fetch Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: data.json
          key: ${{ hashFiles('data.json') }}

      # 若缓存未命中(即响应内容有变化),则通过短信通知
      # 详见 https://github.com/twilio-labs/actions-sms 获取配置说明
      # 也可替换为其他通知方式,但需保留下方的 if 条件
      - name: Notify if data has changed
        uses: twilio-labs/actions-sms@v1
        if: steps.cache.outputs.cache-hit != 'true'
        env:
          TWILIO_ACCOUNT_SID: ${{ secrets.TWILIO_ACCOUNT_SID }}
          TWILIO_API_KEY: ${{ secrets.TWILIO_API_KEY }}
          TWILIO_API_SECRET: ${{ secrets.TWILIO_API_SECRET }}
        with:
          fromPhoneNumber: ${{ secrets.from_phone }}
          toPhoneNumber: ${{ secrets.to_phone }}
          message: "There's been a change! someField is now ${{ steps.parse_data.outputs.someField }}."

结语(Conclusion)

监控需鉴权的接口时,把 API 密钥存为仓库 secret 即可,勿硬编码。

若使用其他通知机制,请务必保留 if: steps.cache.outputs.cache-hit != 'true' 这个条件判断,确保仅在响应内容变更时才发送通知。

原文链接:ben.balter.com/2021/12/15/…