#分享
一直用的蜗牛大佬的 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
-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'
加入评论