Skip to main content

Python alist proxy and monitor.

Project description

Python alist proxy and monitor.

安装

你可以从 pypi 安装

pip install -U alist_proxy

用法

作为模块使用

>>> import alist_proxy
>>> help(alist_proxy)
Help on package alist_proxy:

NAME
    alist_proxy - # encoding: utf-8

PACKAGE CONTENTS
    __main__

FUNCTIONS
    make_application(base_url: str = 'http://localhost:5244', collect: None | collections.abc.Callable[[dict], typing.Any] = None, project: None | collections.abc.Callable[[dict], typing.Any] = None, methods: list[str] = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH', 'MKCOL', 'COPY', 'MOVE', 'PROPFIND', 'PROPPATCH', 'LOCK', 'UNLOCK', 'REPORT', 'ACL'], threaded: bool = False) -> blacksheep.server.application.Application
        创建一个 blacksheep 应用用于反向代理 alist并持续收集每个请求事件的消息

        :param base_url: alist  base_url
        :param collect: 调用以收集 alist 请求事件的消息 project 调用之后),如果为 None则输出到日志
        :param webhooks: 一组 webhook 的链接事件会用 POST 请求发送给每一个链接响应头为 {"Content-type": "application/json; charset=utf-8"}
        :param project: 调用以对请求事件的消息进行映射处理如果结果为 None则丢弃此消息
        :param methods: 需要监听的 HTTP 方法集
        :param threaded: collect  project如果不是 async 函数就放到单独的线程中运行

        :return: 一个 blacksheep 应用你可以二次扩展并用 uvicorn 运行

    make_application_with_fs_event_stream(alist_token: str, base_url: str = 'http://localhost:5244', db_uri: str = 'sqlite')
        只收集和文件系统操作有关的事件存储到 redis streams并且可以通过 websocket 拉取
        
        :param alist_token: alist  token用来追踪后台任务列表若不提供则不追踪任务列表
        :param base_url: alist  base_url
        :param db_uri: 数据库连接的 URI格式为 "{dbtype}://{host}:{port}/{path}

            - dbtype: 数据库类型目前仅支持 "sqlite""mongodb"  "redis"
            - host:  "sqlite"ip  hostname如果忽略则用 "localhost"
            - port:  "sqlite"端口号如果忽略则自动使用此数据库的默认端口号
            - path:  "sqlite"文件路径如果忽略则为 ""会使用一个临时文件

            如果你只输入 dbtype 的名字则视为 "{dbtype}://"
            如果你输入了值但不能被视为 dbtype则自动视为 path "sqlite:///{path}"
        :param webhooks: 一组 webhook 的链接事件会用 POST 请求发送给每一个链接响应头为 {"Content-type": "application/json; charset=utf-8"}

        :return: 一个 blacksheep 应用你可以二次扩展并用 uvicorn 运行

    make_application_with_fs_events(alist_token: str, base_url: str = 'http://localhost:5244', collect: None | collections.abc.Callable[[dict], typing.Any] = None, threaded: bool = False) -> blacksheep.server.application.Application
        只收集和文件系统操作有关的事件
        
        :param alist_token: alist  token用来追踪后台任务列表若不提供则不追踪任务列表
        :param base_url: alist  base_url
        :param collect: 调用以收集 alist 请求事件的消息 project 调用之后),如果为 None则输出到日志
        :param webhooks: 一组 webhook 的链接事件会用 POST 请求发送给每一个链接响应头为 {"Content-type": "application/json; charset=utf-8"}
        :param threaded: collect 如果不是 async 函数就放到单独的线程中运行

        :return: 一个 blacksheep 应用你可以二次扩展并用 uvicorn 运行

DATA
    __all__ = ['make_application', 'make_application_with_fs_events', 'make_application_with_fs_event_stream']

VERSION
    (0, 0, 8)

AUTHOR
    ChenyangGao <https://chenyanggao.github.io>

命令行使用

$ alist-proxy -h
usage: alist-proxy [-h] [-H HOST] [-P PORT] [-b BASE_URL] [-t TOKEN] [-u DB_URI] [-d] [-v]

		🌍🚢 alist 网络代理抓包 🕷️🕸️

options:
  -h, --help            show this help message and exit
  -H HOST, --host HOST  ip 或 hostname,默认值:'0.0.0.0'
  -P PORT, --port PORT  端口号,默认值:5245
  -b BASE_URL, --base-url BASE_URL
                        被代理的 alist 服务的 base_url,默认值:'http://localhost:5244'
  -t TOKEN, --token TOKEN
                        alist 的 token,用来追踪后台任务列表(若不提供,则不追踪任务列表)
  -u DB_URI, --db-uri DB_URI
                        数据库连接的 URI,格式为 "{dbtype}://{host}:{port}/{path}"
                            - dbtype: 数据库类型,目前仅支持 "sqlite"、"mongodb" 和 "redis"
                            - host: (非 "sqlite")ip 或 hostname,如果忽略,则用 "localhost"
                            - port: (非 "sqlite")端口号,如果忽略,则自动使用此数据库的默认端口号
                            - path: (限 "sqlite")文件路径,如果忽略,则为 ""(会使用一个临时文件)
                        如果你只输入 dbtype 的名字,则视为 "{dbtype}://"
                        如果你输入了值,但不能被视为 dbtype,则自动视为 path,即 "sqlite:///{path}"
  -w [webhook ...], --webhooks [webhook ...]
                        一组 webhook 的链接,事件会用 POST 请求发送给每一个链接,响应头为 {"Content-type": "application/json; charset=utf-8"}
  -d, --debug           启用 debug 模式(会输出更详细的信息)
  -v, --version         输出版本号

$ alist-proxy
INFO:     Started server process [64373]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:5245 (Press CTRL+C to quit)

启动准备

首先要求有一个正在运行中的 alist 服务,假设地址为 http://localhost:5244

然后在命令行中运行

alist-proxy --base-url http://localhost:5244

就可以开始代理监听了。如果 --base-url 就是默认地址 http://localhost:5244,是可以省略的。

如果你还需要监听后台的 复制上传离线下载转存 事件,则需要在命令行中提供 alist 的 token。

ALIST_TOKEN='alist-xxxx'
alist-proxy --token "$ALIST_TOKEN"

如果你需要使用 webhook,则需要指定 -w/--webhooks 参数。

如果你需要使用 websocket,则需要指定 --db-uri 参数,以将数据存储到数据库,目前只支持 sqlite、mongodb 和 redis。

webhook 接口

如果你指定了 -w/--webhooks 参数,就会发送事件到指定的这组链接上

alist-proxy -w http://localhost:8888/webhook

客户端代码

from flask import request, Flask

app = Flask(__name__)

@app.route("/webhook", methods=["POST"])
def handle_post():
    data = request.get_json()
    print(f"Received: {data}")
    return "", 200

app.run(port=8888, threaded=True)

websocket 接口

如果你指定了 -u/--db-uri 参数,就可以使用 websocket 接口 /pull

alist-proxy -u sqlite

客户端代码

from asyncio import run
from json import loads

import websockets

async def pull():
    uri = "ws://localhost:5245/pull"
    async with websockets.connect(uri) as websocket:
        while True:
            data = loads(await websocket.recv())
            print(f"Received: {data}")

run(pull())
redis

/pull 接口支持 3 个查询参数,均可省略,省略则从当前开始拉取最新数据

  • lastid: 从这个 id(不含)开始读取。省略时,如果指定了非空的 group,则继续这个组的读取进度,否则从当前开始(不管以前)读取。如果要从头开始读取,指定 '0' 即可
  • group: 组名称。如果组不存在,则自动创建。
  • name: 消费者名称。
mongodb

/pull 接口支持 3 个查询参数,均可省略,省略则从当前开始拉取最新数据

  • lastid: 从这个 id(不含)开始读取,是一个字符串,表示 UUID。
  • from_datetime: 从这个时间点开始,是一个字符串。
sqlite

/pull 接口支持 3 个查询参数,均可省略,省略则从当前开始拉取最新数据

  • lastid: 从这个 id(不含)开始读取,是一个整数,表示自增主键。
  • from_datetime: 从这个时间点开始,是一个字符串。

事件说明

命令行程序只采集和文件系统操作有关的事件消息

你可以从 /pull 接口拉取 json 格式的数据。这些数据有几个共同的字段

  1. category: 任务类别。有 3 个可能的值:
    • web: 由网页直接调用接口成功后产生
    • dav: 通过 webdav 的成功操作产生
    • task: 监控后台任务,由执行成功的任务产生
  2. type: 任务类型。可能的取值如下:
    • upload: 上传/创建 文件
    • rename: 文件或目录的改名
    • move: 移动文件或目录(webdav 还包括改名)
    • remove: 删除文件或目录
    • copy: 复制文件或目录
    • mkdir: 创建空目录
    • find: 查询文件或目录的信息,或罗列目录
  3. method: 具体的操作方法
  4. payload: 和路径有关的数据,每组(由 (method, category, type) 一起确定)都有所不同

同一种 category 的各个 method 的 payload 的字段构成近似。

  • web: payload 收集了相关的查询参数,详见 https://alist.nn.ci/guide/api/fs.html

  • dav: 一般包含

    • path: 被操作的路径
    • is_dir: 是否目录

    可能包含

    • to_path: 操作后的路径(COPY 或 MOVE)
  • task: 目前有 3 种情况

    • method 为 copy,即复制,包含
      • src_path: 源路径
      • dst_path: 目标路径
      • src_storage: 源所在存储
      • dst_storage: 目标所在存储
      • src_dir: 源所在目录
      • dst_dir: 目标所在目录
      • name: 名字
      • is_dir: 是否目录
    • method 为 upload,即上传,包含
      • path: 目标路径
      • dst_storage: 目标所在存储
      • dst_dir: 目标所在目录
      • name: 名字
      • is_dir: 是否目录,必为 False
    • method 为 transfer,即离线下载后上传,包含
      • path: 目标路径
      • dst_dir: 目标所在目录
      • name: 名字
      • is_dir: 是否目录,必为 False

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

alist_proxy-0.0.8.tar.gz (13.0 kB view details)

Uploaded Source

Built Distribution

alist_proxy-0.0.8-py2.py3-none-any.whl (16.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file alist_proxy-0.0.8.tar.gz.

File metadata

  • Download URL: alist_proxy-0.0.8.tar.gz
  • Upload date:
  • Size: 13.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.0 CPython/3.11.8 Darwin/23.5.0

File hashes

Hashes for alist_proxy-0.0.8.tar.gz
Algorithm Hash digest
SHA256 647bb6233048ff1e0fd98e822ebbb66096be72f2f552ab1bc1440a31fc3fd1e3
MD5 f30f3044c7f6751a908ffb9c1e4f09c9
BLAKE2b-256 d1411b02d7f2850e95a1c6f697c5a581f3986303cf27edef9d30c09d3b42c9a1

See more details on using hashes here.

File details

Details for the file alist_proxy-0.0.8-py2.py3-none-any.whl.

File metadata

  • Download URL: alist_proxy-0.0.8-py2.py3-none-any.whl
  • Upload date:
  • Size: 16.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.0 CPython/3.11.8 Darwin/23.5.0

File hashes

Hashes for alist_proxy-0.0.8-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 faf0de4013fc92c0ece39d195d68e476b1d5d0f2bdf193d4d626d69758ceb214
MD5 3b06d675b2771af8f6cdb8e9409cd931
BLAKE2b-256 a0cdf830806a6754aa04430cd130db9c2d19b1f2d419ff831279ab0a5b05e8ea

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page