获取更多博主的动态,欢迎加入我的 Telegram 频道:Fatesinger

使用 Cloudflare Worker 获取豆瓣书影音记录

本功能直接解决豆瓣书影音记录两大痛点,自动同步和封面本地化,对于普通用户来说,Cloudflare 的免费版足够了,非常推荐使用。

之前我自己用 nodejs + mysql 写了一个同步豆瓣书影音的服务,但只在一个很隐蔽的地方公开了,主要是流量和数据库压力太大,提供公共服务成本实在是太高,最近在研究 Cloudflare Worker,试着把服务迁移过去,过程中发现几个问题。

  • D1 单次请求操作次数是有限制的,最多一千次,读写都算。
  • Worker 子请求数最多就是 50 次,下载图片是占用这个次数的,初始化的时候如果下载图片基本都会超限失败。
  • Worker 直接读取 R2 输出图片的话速度很慢。

不过多次测试之后还是找到了使用方法,虽然免费版有各种限制,但限制的都是单次请求,初始化的时候数据比较多,只需要在本地分页之后调用初始化接口就行了,后续使用定时任务同步不会因为请求过多而超限,除非在短时间内标记了大量内容。

为了简化数据库使用单表、所以电影不再支持类型了。新的单条目引用不会在标记列表中展示,后续如果该条目被标记则会自动更新,取消标记不会被同步

自动同步使用了 Cloudflare 的 cron 触发器,实测还是比较好用的。同步时间可以根据自己的需求设置,默认配置是每 30 分钟同步一次。

crons = ["*/30 * * * *"]

如果未进行初始化直接进行同步,可能会因为 D1 操作次数过多报错而无法同步老数据,这时需要清空数据重新初始化,建议 worker 部署后第一时间初始化。

项目地址

演示地址

有使用问题大家可以在评论区、Github、电报频道联系我,看到我会回复。

配置文件

Worker 配置文件 wrangler.toml

[vars]
DOMAIN = "https://bigfa.github.io" // 跨域域名
DBID = 54529369 // 你的豆瓣ID
R2DOMAIN = "https://db.wpista.com" // R2 绑定域名
WOKRERDOMAIN = "https://dbapi.wpista.com" // worker 绑定域名
PAGESIZE = 40 // 每页显示数量
TYPES = "movie,book,music,game,drama" //初始化数据类型,支持五种,根据你的需要自行设置
STATUSES = "done,mark,doing" // 状态类型
TOKEN = "richiscool" // 初始化密钥,为了避免有人恶意调用同步接口,增加了一个token 验证

[[r2_buckets]]
binding = "DOUBAN_BUCKET"
bucket_name = "douban"

[[d1_databases]]
binding = "DB"
database_name = "douban"
database_id = "c3f4fe6b-4fb2-4513-b7e9-3b264d3e3634"

[triggers]
crons = ["*/30 * * * *"] // 自动同步任务设置规则

变量部分写了注释,r2 和 d1 绑定信息可在 Cloudflare 后台自行查看。

部署方法

安装依赖

npm install

初始化数据库,也可在后台创建。

npx wrangler d1 create douban

本地

npx wrangler d1 execute douban --local --file=./schema.sql

远程

npx wrangler d1 execute douban --remote --file=./schema.sql

修改配置文件后部署

npm run deploy

Github Action 自动部署

进入 Github 项目的设置,Settings->Secrets and variables->Actions->Repository secret,新增一个secret,命名为 CLOUDFLARE_API_TOKEN。如果需要修改数据库名需要编辑.github/workflows/deploy.yml,douban 就是数据库名。

wrangler d1 execute douban --file=./schema.sql

密钥设置地址,注意要给 D1 的编辑权限。

这样 main 分支有更新的时候就会自动部署了,部署前记得修改wrangler.toml配置文件。

初始化方法

即使自动部署,初始化还是需要在本地完成,除非你的数据比较少,等着定时任务自动同步就好了。

初始化配置文件scripts/config.env

DOUBAN_ID=54529369 // 你的豆瓣ID
TYPES=movie,music,book,game,drama //初始化数据类型,支持五种,根据你的需要自行设置
WORKER_URL=https://dbapi.wpista.com // worker 绑定域名
TOKEN=richiscool // 初始化密钥,为了避免有人恶意调用同步接口,增加了一个token 验证
STATUSES = done,mark,doing // 状态类型

命令

npm run init

等待完成即可。

接口

Worker 对外提供了 3 个接口,标记条目列表、单个条目信息、本地化条目封面。

  • 条目列表/list,支持两个参数 typepaged,type 为条目类型,status 为状态类型,paged 为页码,get 请求。
  • 单个条目为/:type/:id,type 为类型,id 为条目 id
  • 本地化封面接口无序主动调用,在调用上面两个接口时会根据具体情况自动调用。

前端展示

和以前一样,强烈建议使用本人全家桶,如果想自行调用则可以参考主题目录下 assets/ts/db.ts 和样式assets/scss/modules/_db.scss 的文件。或者直接用 worker 接口自行开发。

db.ts 已经被我封装成一个类,调用方法。

new Douban({
    baseAPI: '', // Worker api
    container: ".db--container", // 容器名
});

现在html只需要如下结构

<div class="db--container"></div>

我自己测试了一阵子,使用上没啥大问题,比较稳定,偶尔有一直图片下载失败手动调用下接口重新下载即可。

Responses

发表留言

人生在世,错别字在所难免,无需纠正。

:mrgreen::neutral::twisted::arrow::shock::smile::???::cool::evil::grin::idea::oops::razz::roll::wink::cry::eek::lol::mad::sad::!::?: Smilies powered by wp-alu

Post Comment