蜗牛大佬 NeoDB 数据获取方案修复

蜗牛大佬 NeoDB 数据获取方案修复

December 21, 2023
分享 ,
💡
淦,刚刚写完去看大佬的文章,发现不知什么时候已经更新了 TV 部分的获取和展示。

一直用的蜗牛大佬的 NeoDB API 创建观影页面 方案渲染的豆瓣页面的数据,之前偶然间发现自己在 NeoDB 中给胆小鬼点了完了已看,但是博客豆瓣页面的数据一直没发生变化,起初以为是数据更新延迟问题,但是过了个把星期发现好像还是没有出现。

去仔细检查了 Github 上的数据后才发现,大佬的代码好像只获取了 NeoDB 中的 Movie 部分的数据,因为 NeoDB 的分类有 book , movie , tv , music , game , podcastperformance ,其中 MovieTV 部分是分开的,只获取电影自然就不会有 TV 数据的出现。

遂研究起了大佬写的 Github Action 代码,发现大佬使用 jq 这个终端 json 库对数据做的处理,自己通过 ChatGPT 适当对原始代码做了一些更改后终于可以下载 TV 数据了,以下是修改后的文件。

  • 修改 Get NeoDB JSON and Count 部分,将获取 movie 的代码复制粘贴一份在源代码后面,并修改请求参数 movietv
  • REMOTE_COUNT() 的函数体修改为 jq -s '.[0].count + .[1].count' file1.json file2.json 意思是获取最近的 Movie 和 TV 条目数之和。

    - name: Get NeoDB JSON and Count
      run: |
        curl -X 'GET' \
        'https://neodb.social/api/me/shelf/complete?category=movie&page=1' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer ${{ secrets.NEODB_ACCESS_TOKEN }}' > movie1.json
        
        curl -X 'GET' \
        'https://neodb.social/api/me/shelf/complete?category=tv&page=1' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer ${{ secrets.NEODB_ACCESS_TOKEN }}' > tv1.json
        
        # 获取 NeoDB 上的标记数
        REMOTE_COUNT() {
          jq -s '.[0].count + .[1].count' movie1.json tv1.json
        }
        echo "REMOTE_COUNT=$(REMOTE_COUNT)" >> $GITHUB_ENV
  • 修改 Get All NeoDB Count 部分
  • 增加 tvpages=$(jq '.pages' tv1.json)
  • 复制 movie部分for 开始至 done 结束的代码体粘贴在后面
  • 修改粘贴的代码的循环计数为上面增加的 tvpages
  • 修改请求链接中的分类参数为 tv
  • 将最后的合并代码修改为 jq -c -s '{data: map(.data[]) | unique | sort_by(.created_time) | reverse, pages: map(.pages)[0], count: map(.count)[0]}' *.json > movie.json
    • 这段代码使用 jq 命令对输入的多个 json 文件进行处理,并将结果保存到 movie.json 文件中。
    • -c -s 选项表示对输入进行压缩和合并处理。
    • {data: map(.data[]) | unique | sort_by(.created_time) | reverse, pages: map(.pages)[0], count: map(.count)[0]} 是 jq 的过滤器,用于对输入数据进行处理。其中包含以下几个部分:
    • map(.data[]) 遍历输入中的每个元素的 data 数组。
    • unique 去除重复的元素。
    • sort_by(.created_time) 按照每个元素的 created_time 字段进行排序。
    • reverse 倒序排列。
    • map(.pages)[0] 获取输入中的第一个元素的 pages 字段。
    • map(.count)[0] 获取输入中的第一个元素的 count 字段。
    • *.json 表示匹配当前目录下所有以.json 结尾的文件。
    • > movie.json 表示将结果输出到 movie.json 文件中。

最后完整代码如下:

# .github/workflows/douban.yml
name: Sync NeoDB Data
on:
  schedule:
  - cron: "0 17 * * *"
#  watch:
#    types: [started]

  workflow_dispatch:

jobs:
  douban:
    name: Sync NeoDB Movie Data
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v3

    # 检查是否安装了 JQ
    - name: Check JQ
      run: |
        if ! command -v jq &> /dev/null; then
          echo "jq is not installed. Installing..."
          sudo apt-get update
          sudo apt-get install -y jq
        else
          echo "jq is already installed."
        fi
        # 把当前目录保存到环境变量中
        echo "WORK_DIR=$(pwd)" >> $GITHUB_ENV

    # 获取本地现有文件的标记数
    - name: Get Current Count
      run: |
        CURRENT_COUNT() {
          jq '.count' data/neodb/movie.json
        }
        echo "CURRENT_COUNT=$(CURRENT_COUNT)" >> $GITHUB_ENV

    - name: Get NeoDB JSON and Count
      run: |
        curl -X 'GET' \
        'https://neodb.social/api/me/shelf/complete?category=movie&page=1' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer ${{ secrets.NEODB_ACCESS_TOKEN }}' > movie1.json
        
        curl -X 'GET' \
        'https://neodb.social/api/me/shelf/complete?category=tv&page=1' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer ${{ secrets.NEODB_ACCESS_TOKEN }}' > tv1.json
        
        # 获取 NeoDB 上的标记数
        REMOTE_COUNT() {
          jq -s '.[0].count + .[1].count' file1.json file2.json
        }
        echo "REMOTE_COUNT=$(REMOTE_COUNT)" >> $GITHUB_ENV

    # 对比本地的标记数和远程标记数,相等就跳过,不相等就下载新数据
    - name: Count Compare
      run: |
        if [ "${{ env.REMOTE_COUNT }}" = "${{ env.CURRENT_COUNT }}" ]; then
          echo "Variables are equal. Skipping the next steps."
          exit 0
        else
          echo "Variables are not equal. Running the next steps."
        fi

    # 下载所有数据
    - name: Get All NeoDB Count
      if: ${{ env.REMOTE_COUNT != env.CURRENT_COUNT }}
      run: |
        #从 movie1.json 中提取 pages 字段的值
        pages=$(jq '.pages' movie1.json)
        tvpages=$(jq '.pages' tv1.json)

        # 个人使用,新建 WorkDIR ,排除 vercel.json 和 package.json 等
        mkdir neodb
        cd neodb

        # 循环下载文件,因为 page 1 已经下载过了,从 2 开始
        for ((i=1; i<=$pages; i++)); do
          url="https://neodb.social/api/me/shelf/complete?category=movie&page=$i"
          filename="movie$i.json"

        # 下载文件并保存为对应的文件名
        curl -X 'GET' "$url" \
          -H 'accept: application/json' \
          -H 'Authorization: Bearer ${{ secrets.NEODB_ACCESS_TOKEN }}' > "$filename"
        done


        # 循环下载文件,因为 page 1 已经下载过了,从 2 开始
        for ((i=1; i<=$tvpages; i++)); do
          url="https://neodb.social/api/me/shelf/complete?category=tv&page=$i"
          filename="tv$i.json"

        # 下载文件并保存为对应的文件名
        curl -X 'GET' "$url" \
          -H 'accept: application/json' \
          -H 'Authorization: Bearer ${{ secrets.NEODB_ACCESS_TOKEN }}' > "$filename"
        done

        # 把所有数据合并成一个文件
        jq -c -s '{data: map(.data[]) | unique | sort_by(.created_time) | reverse, pages: map(.pages)[0], count: map(.count)[0]}' *.json > movie.json

        # 更新 NeoDB 数据
        cp -f movie.json ${{ env.WORK_DIR }}/data/neodb/



    # 把修改后的数据提交到 GitHub 仓库
    - name: Git Add and Commit
      if: ${{ env.REMOTE_COUNT != env.CURRENT_COUNT }}
      uses: EndBug/add-and-commit@v9
      with:
        message: 'chore(data): update neodb data'
        add: './data/neodb'

  douban-book:
    name: Sync NeoDB Book Data
    runs-on: ubuntu-latest
    steps:
    
    - name: Checkout
      uses: actions/checkout@v3

    # 检查是否安装了 JQ
    - name: Check JQ
      run: |
        if ! command -v jq &> /dev/null; then
          echo "jq is not installed. Installing..."
          sudo apt-get update
          sudo apt-get install -y jq
        else
          echo "jq is already installed."
        fi
        # 把当前目录保存到环境变量中
        echo "WORK_DIR=$(pwd)" >> $GITHUB_ENV

    # 获取本地现有文件的标记数
    - name: Get Current Count
      run: |
        CURRENT_COUNT() {
          jq '.count' data/neodb/book.json
        }
        echo "CURRENT_COUNT=$(CURRENT_COUNT)" >> $GITHUB_ENV

    - name: Get NeoDB JSON and Count
      run: |
        curl -X 'GET' \
        'https://neodb.social/api/me/shelf/complete?category=book&page=1' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer ${{ secrets.NEODB_ACCESS_TOKEN }}' > book.json

        # 获取 NeoDB 上的标记数
        REMOTE_COUNT() {
          jq '.count' book.json
        }
        echo "REMOTE_COUNT=$(REMOTE_COUNT)" >> $GITHUB_ENV

    # 对比本地的标记数和远程标记数,相等就跳过,不相等就下载新数据
    - name: Count Compare
      run: |
        if [ "${{ env.REMOTE_COUNT }}" = "${{ env.CURRENT_COUNT }}" ]; then
          echo "Variables are equal. Skipping the next steps."
          exit 0
        else
          echo "Variables are not equal. Running the next steps."
        fi

    # 下载所有数据
    - name: Get All NeoDB Count
      if: ${{ env.REMOTE_COUNT != env.CURRENT_COUNT }}
      run: |
        #从 book.json 中提取 pages 字段的值
        pages=$(jq '.pages' book.json)

        # 个人使用,新建 WorkDIR ,排除 vercel.json 和 package.json 等
        mkdir neodb
        cd neodb

        # 循环下载文件,因为 page 1 已经下载过了,从 2 开始
        for ((i=1; i<=$pages; i++)); do
          url="https://neodb.social/api/me/shelf/complete?category=book&page=$i"
          filename="book$i.json"

        # 下载文件并保存为对应的文件名
        curl -X 'GET' "$url" \
          -H 'accept: application/json' \
          -H 'Authorization: Bearer ${{ secrets.NEODB_ACCESS_TOKEN }}' > "$filename"
        done

        # 把所有数据合并成一个文件
        jq -c -s '{data: map(.data[]) | unique | sort_by(.created_time) | reverse, pages: map(.pages)[0], count: map(.count)[0]}' *.json > book.json

        # 更新 NeoDB 数据
        cp -f book.json ${{ env.WORK_DIR }}/data/neodb/



    # 把修改后的数据提交到 GitHub 仓库
    - name: Git Add and Commit
      if: ${{ env.REMOTE_COUNT != env.CURRENT_COUNT }}
      uses: EndBug/add-and-commit@v9
      with:
        message: 'chore(data): update neodb data'
        add: './data/neodb'

加入评论