Skip to content
SALTWOOD edited this page Sep 30, 2024 · 1 revision

API 文档

GET /assets/* => RAW

获取程序目录下 assets 文件夹中的文件。

特殊权限需求

  • 需要 adminToken
  • 需要 token

示例

GET /assets/assets.zip HTTP/1.1
Host: localhost:8080

返回值

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="assets.zip"

PK.

GET / => 302

重定向到 /dashboard。

特殊权限需求

  • 需要 adminToken
  • 需要 token

GET /93AtHome/list_clusters => JSON

获取集群列表。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

GET /93AtHome/list_files => JSON

获取文件列表。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

[
    {
        "path": "/files/LxHTTHub/6.png",
        "hash": "d48c5fe3e92f1258d48ed7352deba4c2ae61bc16",
        "size": 40140,
        "lastModified": 1726494734898,
        "encodedPath": "/files/LxHTTHub/6.png"
    }
]

GET /93AtHome/dashboard/oauth_id => PLAINTEXT

获取 OAuth ID。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

1234567890

GET /93AtHome/dashboard/user/oauth => JSON

进行用户登录。

参数

  • code:OAuth 授权码

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

{
    "avatar_url": "https://avatars.githubusercontent.com/u/105980161?v=4",
    "username": "SaltWood_233",
    "id": 105980161
}

GET /93AtHome/update_files => JSON

更新文件列表。

参数

  • token:用户令牌

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

204 No Content409 Conflict,无返回值。

注:在部分版本的 Open93AtHome 中,409 Conflict 会显示一个 HTML 页面(是一个彩蛋)

GET /93AtHome/centerStatistics => JSON

获取中心统计信息。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

{
    "dailyHits": [
        182226,
        605185
        // 省略
    ],
    "dailyBytes": [
        797941969369,
        2357231726334
        // 省略
    ],
    "today": {
        "hits": 182226,
        "bytes": 797941969369
    },
    "onlines": 3,
    "sourceCount": 1,
    "totalFiles": 579141,
    "totalSize": 924432028997
}

GET /93AtHome/clusterStatistics => JSON

获取集群统计信息。

参数

  • clusterId:集群 ID

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

GET /93AtHome/rank => JSON

获取排行榜。

返回值

[
    // 想象一下这里是一个 object……(具体格式在文末)
    // 排名第二的节点……
]

GET /93AtHome/dashboard/user/profile => JSON

获取用户信息。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

{
    "id": 105980161,
    "login": "SaltWood_233",
    "avatar_url": "https://avatars.githubusercontent.com/u/105980161?v=4",
    "is_super_admin": true
}

POST /93AtHome/dashboard/user/bindCluster => JSON

绑定集群。

请求体

{
    "clusterId": "3b748fdb0191aa818bc4c007",
    "clusterSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

POST /93AtHome/dashboard/user/unbindCluster => JSON

解绑集群。

请求体

{
    "clusterId": "3b748fdb0191aa818bc4c007"
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

GET /93AtHome/dashboard/user/clusters => JSON

获取用户绑定的集群列表。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

[
    // 想象一下这里是一个 object……(具体格式在文末)
    // 绑定的第一个集群……
]

POST /93AtHome/dashboard/user/cluster/profile => JSON

更新集群信息。

请求体

{
    "clusterName": "测试",
    "bandwidth": 50,
    "sponsor": "测试",
    "sponsorUrl": "https://www.example.com"
    // 注:不写就是不改(比如不写 `bandwidth` 就不会修改带宽)
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

POST /93AtHome/dashboard/user/cluster/reset_secret => JSON

重置集群密钥。

参数

  • clusterId:集群 ID

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

{
    "clusterSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

GET /93AtHome/random => 302

重定向到随机文件。

返回值

302 Found,重定向到随机文件 URL,无响应体。

POST /93AtHome/super/cluster/create => JSON

管理员创建集群。

请求体

{
    "clusterName": "测试",
    "bandwidth": 50
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

POST /93AtHome/super/cluster/remove => JSON

管理员删除集群。

请求体

{
    "clusterId": "3b748fdb0191aa818bc4c007"
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

POST /93AtHome/super/cluster/ban => JSON

管理员封禁集群。

请求体

{
    "clusterId": "3b748fdb0191aa818bc4c007",
    "ban": true // true 为封禁,false 为解封
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

POST /93AtHome/super/cluster/kick => JSON

管理员踢节点。

参数

  • clusterId:集群 ID

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

POST /93AtHome/super/cluster/profile => JSON

管理员更新集群信息。

参数

  • clusterId:集群 ID

请求体

{
    "clusterName": "测试",
    "bandwidth": 50,
    "sponsor": "测试",
    "sponsorUrl": "https://www.example.com"
    // 注:不写就是不改(比如不写 `bandwidth` 就不会修改带宽)
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

GET /93AtHome/syncSources => JSON

获取同步源列表。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

[
    {
        "name": "McimPlugin",
        "count": 579141,
        "lastUpdated": "2024-09-30T04:38:28.897Z",
        "isFromPlugin": true
    }
]

POST /93AtHome/super/sudo => JSON

管理员切换用户。

请求体

{
    "id": 1 // 目标用户 GitHub ID
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

{
    "success": true,
    "permission": 5,
    "requirePermission": 0,
    "user": {
        "id": 105980161,
        "username": "SaltWood_233",
        "photo": "https://avatars.githubusercontent.com/u/105980161?v=4",
        "isSuperUser": 5
    },
    "targetUser": {
        "id": 68094002,
        "username": "听风",
        "photo": "https://avatars.githubusercontent.com/u/68094002?v=4",
        "isSuperUser": 0
    }
}

GET /93AtHome/super/list_users => JSON

获取用户列表。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

[
    {
        "id": 105980161,
        "username": "SaltWood_233",
        "photo": "https://avatars.githubusercontent.com/u/105980161?v=4",
        "isSuperUser": 5
    },
    {
        "id": 68094002,
        "username": "听风",
        "photo": "https://avatars.githubusercontent.com/u/68094002?v=4",
        "isSuperUser": 0
    }
]

POST /93AtHome/super/update => JSON

管理员唤起文件更新。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

204 No Content,无响应体或 409 Conflict 携带原因。

GET /93AtHome/shards => JSON

获取分片列表。

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

[
    [
        {
            "path": "/files/LxHTTHub/好辣.png",
            "hash": "219f786f26d777db834c09a5a5ba05a975cef327",
            "size": 14309,
            "lastModified": 1726494735253,
            "encodedPath": "/files/LxHTTHub/%E5%A5%BD%E8%BE%A3.png"
        }
    ],
    [
        {
            "path": "/files/LxHTTHub/我是xx.png",
            "hash": "a12a3f826846e9e4e10f9ab25c84dfded1ea450c",
            "size": 38764,
            "lastModified": 1726494735274,
            "encodedPath": "/files/LxHTTHub/%E6%88%91%E6%98%AF%E5%82%BB%E9%80%BC.png"
        }
    ]
]

POST /93AtHome/super/modify_shards => JSON

管理员修改节点分片。

参数

  • clusterId:集群 ID

请求体

{
    "shards": -1 // 使用一个特殊的方法,传入一个 bool[] 数组,表示是否使用对应分片。
    // 注:数组长度源代码中默认 32
}

补充信息

// 将布尔数组转换为整数(BigInt)
function booleansToInt(bits: boolean[]): number {
    return bits.reduce((acc, bit, index) => {
        if (bit) {
            acc |= (1 << index); // 设置第 index 位为 1
        }
        return acc;
    }, 0);
}

// 将 BigInt 整数转换为布尔数组
function intToBooleans(value: number, size: number): boolean[] {
    const bits = [];
    for (let i = 0; i < size; i++) {
        bits.push((value & (1 << i)) !== 0); // 检查第 i 位是否为 1
    }
    return bits;
}

特殊权限需求

  • 需要 adminToken
  • 需要 token

返回值

// 想象一下这里是一个 object……(具体格式在文末)

节点 object 的格式

[
    {
        "clusterId": "3b748fdb0191aa818bc4c007",
        "owner": 0,
        "clusterName": "测试"
        // 省略其他字段,具体格式无法及时更新到文档中,请参考源代码或实际返回值。
    }
]
Clone this wiki locally