用 Cloudflare Worker 访问 NeoDB API

用 Cloudflare Worker 访问 NeoDB API

January 13, 2024
工具箱 ,

刚刚看到 蜗牛大佬 fork 了一个 Lyunvy 大佬写的 neodb-shelf-api 用于获取 NeoDB 数据,看了一下使用、安装,比以前我参考的各位大佬通过 Github Action 缓存数据的方案可要好用太多了。

看了一下实现过程,忽然冒出了「可以通过 Cloudflare Worker 来获取吗?」

因为前几天才分享过一个用 Worker 转发 RSS 数据的脚本,当时评论区木木大佬说可以有很多用法,所以刚刚脑子里忽然就蹦出这个想法来。

遂试着用 ChatGPT 糊了一个脚本,好像很真行...?

使用方法:在 CF 里新建一个 Worker,将以下代码复制粘贴进去,并将代码里的 token 的值改成你的,然后带上对应的参数访问 Worker 的地址即可。

代码如下;

export default {
  async fetch(request, env, ctx) {
    const urlParams = new URLSearchParams(request.url.slice(request.url.indexOf('?') + 1))
    let cg = urlParams.get('cg')
    const type = urlParams.get('type')


    // 设置你的NeoDB Token
    const token= 'v02safasAqweqdDVYqUjtEm'
    
    // 检查参数是否为空,如果为空则查询所有数据
    if (!cg) {
      cg = 'book,movie,tv,music,game,podcast'
    }
    // 查询完成类型 ['wishlist', 'progress', 'complete']:
    if(!type){
      return new Response('type参数不能为空', { status: 400, headers: { 'Content-Type': 'text/plain;charset=UTF-8'}})
    }
    
    // 将分类字符串拆分为数组
    const categories = cg.split(',')
    
    // 存储获取的数据
    const responseData = {}
    
    // 循环请求每个分类的数据
    for (const category of categories) {
      const categoryData = []
      let page = 1
      
      while (true) {
        const apiUrl = `https://neodb.social/api/me/shelf/complete?category=${category}&type=${type}&page=${page}`
        try {
          // 发送请求获取数据,并添加鉴权头部
          const response = await fetch(apiUrl, {
            headers: {
              'Authorization': `Bearer ${token}`
            }
          })

          // 检查响应状态码
          if (response.status !== 200) {
            throw new Error('请求失败')
          }
          
          // 读取响应内容
          const pageData = await response.json()
          
          // 将当前页的数据添加到 categoryData 中
          categoryData.push(pageData)
          
          // 检查是否还有更多页数据
          if (page >= pageData.pages) {
            break
          } else {
            page++
          }
        } catch (err) {
          return new Response('请求错误', { status: 500, headers: { 'Content-Type': 'text/plain' }})
        }
      }
      
      // 将每个分类的完整数据添加到 responseData 中
      responseData[category] = categoryData
    }
    
    // 返回所有分类数据给原始请求
    return new Response(JSON.stringify(responseData), { status: 200, headers: { 'Content-Type': 'application/json' }})
  },
};

加入评论