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

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

2023-12-21
#分享
💡
淦,刚刚写完去看大佬的文章,发现不知什么时候已经更新了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'

加入评论