IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    1900发表于 2023-12-21 16:04:01
    love 0
    💡
    淦,刚刚写完去看大佬的文章,发现不知什么时候已经更新了TV部分的获取和展示。

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

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

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

    • 修改Get NeoDB JSON and Count 部分,将获取movie的代码复制粘贴一份在源代码后面,并修改请求参数 movie 为 tv 。
    • 将 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'


沪ICP备19023445号-2号
友情链接