neodb.social 是一个致力于为联邦宇宙居民提供一个自由开放互联的书籍、电影、音乐和游戏收藏评论空间。NeoDB 的源代码来自 NiceDB,NiceDB 由里瓣社区众筹开发。

个人主页Marcus233@mastodon.social

参考@immmmm@eallion

使用方法

环境变量配置

ACCESSTOKEN

@eallion

USE_REDIS,USE_I2C

是否使用redis和提取主题色功能
true,则后几项必填

redis数据可先不填,后面有更快的方法

IMG2COLOR

@anzhiyu-c/img2color-go
填入类似于https://xxx.top/api?img=的链接

KV_URL,KV_REST_API_URL,KV_REST_API_TOKEN,KV_REST_API_READ_ONLY_TOKEN

创建数据库

然后随便填入名字

找到.env,直接复制粘贴进去

(真的可以直接粘贴,不需要一个一个输入)

直接复制粘贴

如果部署时没有填链接
链接数据库
选择项目连接

域名配置

如果需要国内访问,需添加自己的域名

访问https://xxx.top/?type=complete&category=movie&page=2&theme=true得到返回即部署成功

传入

官方

参数 是否必要 类型 默认值 可选
type str wishlist / progress / complete
category str 全部 book/movie/tv/music/game/podcast/performance
page int 1 1-最大页数

返回

官方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"data": [
{
"shelf_type": "wishlist",
"visibility": 2,
"item": {
"uuid": "string",
"url": "string",
"api_url": "string",
"category": "book",
"parent_uuid": "string",
"display_title": "string",
"external_resources": [
{
"url": "string"
}
],
"title": "string",
"brief": "string",
"cover_image_url": "string",
"rating": 0,
"rating_count": 0
},
"created_time": "2023-09-23T10:58:23.814Z",
"comment_text": "string",
"rating_grade": 10,
"tags": [
"string"
]
}
],
"pages": 0,
"count": 0
}

示例

@石姐姐

代码讲解

点击打开代码讲解(为不懂的人准备) color:cyan

app.py

  1. 导入模块和库:

    1
    2
    3
    4
    5
    6
    from flask import Flask, request
    import requests
    import json
    from os import environ
    from redis_color import get_theme_color, kv, process_item
    import threading
    • flask:导入 Flask 模块,用于创建 Web 应用程序。
    • requests:用于发送 HTTP 请求。
    • json:用于处理 JSON 数据。
    • os.environ:用于获取环境变量。
  2. 创建 Flask 应用:

    1
    app = Flask(__name__)
    • 创建了一个名为 app 的 Flask 应用。
  3. 定义了一个路由和视图函数:

    1
    2
    @app.route('/', methods=['GET'])
    def getdata():
    • 定义了一个路由为 /,并指定了请求方法为 GET。
  4. 获取环境变量中的 ACCESSTOKEN:

    1
    token = environ.get('ACCESSTOKEN')
    • 使用 environ.get() 获取环境变量中名为 ACCESSTOKEN 的值。
  5. 设置请求头:

    1
    2
    3
    4
    5
    headers = {
    'accept': 'application/json',
    'Authorization': f'Bearer {token}',
    'Referer': 'http://redish101.top',
    }
    • 定义了一个字典 headers 包含了请求头信息。
  6. 获取请求参数:

    1
    2
    3
    4
    cate = request.args.get('category')
    page = request.args.get('page')
    type = request.args.get('type')
    theme = request.args.get('theme')
    • 使用 Flask 的 request.args.get() 方法获取请求中的参数。
  7. 判断参数是否完整:

    1
    if token and type:
    • 确保 tokentype 不为空。
  8. 发起请求:

    1
    response = requests.get(f"https://neodb.social/api/me/shelf/{type}?category={cate}&page={page}", headers=headers)
    • 使用 requests.get() 发起一个 GET 请求。
  9. 解析响应:

    1
    data = json.loads(response.text)
    • 使用 json.loads() 解析响应数据。
  10. 判断是否使用缓存:

    1
    if environ.get('USE_REDIS'):
  • 确保环境变量中有 USE_REDIS
  1. 判断是否使用主题色提取:
    1
    if environ.get('USE_I2C') and theme == "true":
  • 确保环境变量中有 USE_I2C 并且请求参数中的 theme 为 “true”。
  1. 使用多线程处理提取主题色:
    1
    2
    3
    4
    5
    6
    for i in data['data']:
    thread = threading.Thread(target=process_item, args=(i,))
    threads.append(thread)
    thread.start()
    for thread in threads:
    thread.join()
  • 创建了多个线程用于处理每个数据项。
  1. 判断是否使用缓存并返回结果:

    1
    2
    3
    4
    5
    if kvdata and str(data['count']) == str(kvcount):
    return json.loads(kvdata)
    else:
    # ...(设置缓存等操作)
    return data
  2. 其他处理和返回信息。

  3. 启动应用程序:

    1
    2
    if __name__ == '__main__':
    app.run()
    • 如果当前脚本被直接执行,则启动应用程序。

redis_color.py

这段代码是一个用于处理主题颜色的功能模块。让我逐段解释:

  1. 导入模块和库
1
2
3
4
5
6
from functools import lru_cache
from vercel_kv_sdk import KV
import dotenv
import requests
import json
from os import environ

这里首先导入了需要用到的模块和库,包括了:

  • lru_cache:这是一个装饰器,用于对函数的返回值进行缓存,可以提高函数的执行效率。
  • KV:这是一个用于操作 vercel_kv 的模块,与redis相似。
  • dotenv:用于从环境变量文件(比如 .env 文件)中加载环境变量。
  • requests:用于发送 HTTP 请求。
  • json:用于处理 JSON 数据的模块。
  • os.environ:用于获取系统的环境变量。
  1. 加载环境变量
1
dotenv.load_dotenv()

这一行代码从环境变量文件中加载环境变量,使其可以在程序中使用。

  1. 初始化 KV 对象和设置请求头
1
2
3
4
5
6
7
8
9
10
kv = KV()

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Referer': 'http://redish101.top',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-GB,en;q=0.9,en-US;q=0.8,ml;q=0.7',
'Connection': 'keep-alive'
}

这部分代码初始化了一个 KV 对象,同时设置了一些用于 HTTP 请求的请求头。

  1. 定义获取主题颜色的函数
1
2
3
@lru_cache(maxsize=None)
def get_theme_color(uuid,cover_image_url):
# ...

这是一个用于获取主题颜色的函数。@lru_cache(maxsize=None) 是一个装饰器,它会缓存函数的返回值,以提高函数的执行效率。

  1. 处理获取主题颜色的逻辑
1
2
3
4
5
6
7
theme_color = kv.get(uuid)

if theme_color is not None:
return theme_color
else:
try:
# ...

这部分代码首先尝试从缓存中获取主题颜色,如果缓存中存在,就直接返回。如果不存在,就尝试从主题色api获取主题颜色。

  1. 定义处理单个项目的函数
1
2
3
4
5
def process_item(item):
uuid = item['item']['uuid']
cover_image_url = item['item']['cover_image_url']
theme_color = get_theme_color(uuid, cover_image_url)
item['item']['color'] = theme_color

这个函数接收一个项目作为参数,并从项目中提取出 UUID 和封面图片的 URL。然后使用之前定义的获取主题颜色的函数,将得到的主题颜色添加到项目的属性中。

–由ChatGPT生成–