用Cloudflare Worker访问NeoDB API

用Cloudflare Worker访问NeoDB API

2024-01-13
#工具箱

刚刚看到 蜗牛大佬 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' }})
},
};

加入评论