跳转至

Extension bbs api

注意

  • 需要RWPP版本: 1.5.1

资源管理器 API 协议

在1.5.1版本中,RWPP提供了一套基于HTTP的资源管理器API协议,用于在网络中搜索资源。

添加

RWPP默认提供铁锈盒子的协议,你也可以通过扩展来添加其他的协议。

准备

了解 okhttp 库的使用方法。 通过net:getBbsProtocols()获取协议列表。


1. 资源类型枚举 ResourceType

定义请求的资源类型:

enum class ResourceType {
    Mod, // 模组类型
    Map  // 地图类型
}


2. 网络资源信息类 NetResourceInfo

表示从服务端返回的资源元数据:

属性名 类型 必填 默认值 描述
title String 是 无 资源标题
description String? 否 null 资源描述(可选)
bbsUrl String? 否 null 资源详情页链接
downloadUrl String? 否 null 直接下载链接
version String? 否 null 资源版本号
author String? 否 null 作者信息
imageBytes ByteArray? 否 null 预览图二进制数据

3. BBS 协议类 BBSProtocol

定义与 BBS 服务端交互的协议:

属性名 类型 描述
url String 服务端 API 地址
name String 协议名称(如 "铁锈盒子")
requestBodyProvider (page: Int, keyword: String, type: ResourceType) -> RequestBody 请求体构建函数:
- page: 分页页码
- keyword: 搜索关键词
- type: 资源类型(Mod/Map)
返回一个 RequestBody 对象
resultParser (Response) -> Array<NetResourceInfo>? 响应解析函数:
- 输入 HTTP 响应对象
- 输出 NetResourceInfo 数组(解析失败返回 null)

协议工作流程

  1. 客户端通过 requestBodyProvider 构建请求体(含分页、关键词、资源类型)
  2. 服务端返回 HTTP 响应
  3. 客户端通过 resultParser 解析响应为结构化资源数据(NetResourceInfo 数组)

下面是一项示例:

local Json = java.import('com.eclipsesource.json.Json') 

-- 绑定 Java 类

local Result = java.import('kotlin.Result')
local MultipartBody = java.import("okhttp3.MultipartBody")
local NetResourceInfo = java.import("io.github.rwpp.net.NetResourceInfo")
local ResourceType = java.import("io.github.rwpp.net.ResourceType")


local RTSBoxProtocol = BBSProtocol(
    "https://www.rtsbox.cn/api/search_bbs.php",
    "铁锈盒子",
    -- 构建请求的 Lambda(转换为 Lua 函数)
    function(page, keyword, type)
        local builder = MultipartBody.Builder()
        builder:setType(MultipartBody.FORM)
        -- 根据 type 判断 bbs_id
        local bbs_id = (type == ResourceType.Mod) and "4" or "5"
        builder:addFormDataPart("bbs_id", bbs_id)
        builder:addFormDataPart("keyword", keyword)
        builder:addFormDataPart("page", tostring(page))
        return builder:build()
    end,
    -- 解析响应的 Lambda(转换为 Lua 函数)
    function(response)
        local ok, result = pcall(function()
            local body = response.body():string() -- 获取响应体字符串
            local jsonBody = Json:parse(body):asObject() 
            local arr = jsonBody:get('data'):asArray() -- 获取 JSON 数组
            local resources = java.array(NetResourceInfo, arr:size())
            -- 遍历 JSON 数组
            for i, data in ipairs(arr) do
                resources[i] = NetResourceInfo(
                    data.title or "???",
                    data.bbsurl or "???",
                    data.downurl or "???"
                )
            end
            return resources
        end)
        return ok and Result:success(result) or Result:failure(tostring('failed'))
    end
)

net:getBbsProtocols():add(RTSBoxProtocol) -- 注册协议