Skip to main content

bpi_rs/live/
guard.rs

1use serde::{ Deserialize, Serialize };
2
3use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
4
5#[derive(Debug, Serialize, Clone, Deserialize)]
6pub struct UserInfo {
7    /// 用户UID
8    pub uid: i64,
9    /// 用户基本信息
10    pub base: UserBaseInfo,
11    /// 粉丝牌信息
12    pub medal: UserMedalInfo,
13    /// 财富信息
14    pub wealth: Option<serde_json::Value>,
15    /// 标题
16    pub title: Option<serde_json::Value>,
17    /// 大航海信息
18    pub guard: UserGuardInfo,
19    /// 头像框
20    pub uhead_frame: Option<serde_json::Value>,
21    /// 大航海队长
22    pub guard_leader: Option<serde_json::Value>,
23}
24
25#[derive(Debug, Serialize, Clone, Deserialize)]
26pub struct GuardTabInfo {
27    /// 大航海总人数
28    pub num: i32,
29    /// 总页数
30    pub page: i32,
31    /// 当前页数
32    pub now: i32,
33    /// 成就等级
34    pub achievement_level: i32,
35    /// 主播守护成就等级
36    pub anchor_guard_achieve_level: i32,
37    /// 成就图标
38    pub achievement_icon_src: String,
39    /// 购买守护图标
40    pub buy_guard_icon_src: String,
41    /// 规则文档链接
42    pub rule_doc_src: String,
43    /// 背景图片
44    pub ex_background_src: String,
45    /// 颜色开始
46    pub color_start: String,
47    /// 颜色结束
48    pub color_end: String,
49    /// 标签颜色
50    pub tab_color: Vec<String>,
51    /// 标题颜色
52    pub title_color: Vec<String>,
53}
54
55#[derive(Debug, Serialize, Clone, Deserialize)]
56pub struct UserOriginInfo {
57    /// 用户名
58    pub name: String,
59    /// 头像
60    pub face: String,
61}
62
63#[derive(Debug, Serialize, Clone, Deserialize)]
64pub struct UserOfficialInfo {
65    /// 角色
66    pub role: i32,
67    /// 标题
68    pub title: String,
69    /// 描述
70    pub desc: String,
71    /// 类型
72    pub r#type: i32,
73}
74
75#[derive(Debug, Serialize, Clone, Deserialize)]
76pub struct UserBaseInfo {
77    /// 用户名
78    pub name: String,
79    /// 头像
80    pub face: String,
81    /// 名称颜色
82    pub name_color: i32,
83    /// 是否匿名
84    pub is_mystery: bool,
85    /// 风险控制信息
86    pub risk_ctrl_info: Option<serde_json::Value>,
87    /// 原始信息
88    pub origin_info: UserOriginInfo,
89    /// 官方信息
90    pub official_info: UserOfficialInfo,
91    /// 名称颜色字符串
92    pub name_color_str: String,
93}
94
95#[derive(Debug, Serialize, Clone, Deserialize)]
96pub struct UserMedalInfo {
97    /// 粉丝牌名称
98    pub name: String,
99    /// 粉丝牌等级
100    pub level: i32,
101    /// 颜色开始
102    pub color_start: i32,
103    /// 颜色结束
104    pub color_end: i32,
105    /// 边框颜色
106    pub color_border: i32,
107    /// 颜色
108    pub color: i32,
109    /// ID
110    pub id: i32,
111    /// 类型
112    pub typ: i32,
113    /// 是否点亮
114    pub is_light: i32,
115    /// 主播UID
116    pub ruid: i64,
117    /// 大航海等级
118    pub guard_level: i32,
119    /// 亲密度
120    pub score: i32,
121    /// 大航海图标
122    pub guard_icon: String,
123    /// 荣誉图标
124    pub honor_icon: String,
125    /// V2粉丝牌颜色开始
126    pub v2_medal_color_start: String,
127    /// V2粉丝牌颜色结束
128    pub v2_medal_color_end: String,
129    /// V2粉丝牌边框颜色
130    pub v2_medal_color_border: String,
131    /// V2粉丝牌文本颜色
132    pub v2_medal_color_text: String,
133    /// V2粉丝牌等级颜色
134    pub v2_medal_color_level: String,
135    /// 用户接收数量
136    pub user_receive_count: i32,
137}
138
139#[derive(Debug, Serialize, Clone, Deserialize)]
140pub struct UserGuardInfo {
141    /// 大航海等级
142    pub level: i32,
143    /// 过期时间字符串
144    pub expired_str: String,
145}
146
147#[derive(Debug, Serialize, Clone, Deserialize)]
148pub struct GuardMember {
149    /// 主播UID
150    pub ruid: i64,
151    /// 排名
152    pub rank: i32,
153    /// 陪伴天数
154    pub accompany: i32,
155    /// 用户信息
156    pub uinfo: UserInfo,
157    /// 亲密度
158    pub score: i32,
159}
160
161#[derive(Debug, Serialize, Clone, Deserialize)]
162pub struct GuardListData {
163    /// 大航海信息
164    pub info: GuardTabInfo,
165    /// 前三名
166    pub top3: Vec<GuardMember>,
167    /// 大航海成员列表
168    pub list: Vec<GuardMember>,
169}
170
171pub type GuardListResponse = BpiResponse<GuardListData>;
172
173// ================= 实现 =================
174
175impl BpiClient {
176    /// 查询大航海成员
177    ///
178    /// room_id: 直播间号
179    /// ruid: 主播id
180    /// page: 页
181    /// page_size: 10~30 `[20]`
182    /// typ:3,4,5 周/月/总 亲密度
183
184    /// # 文档
185    /// [查看API文档](https://github.com/SocialSisterYi/bilibili-API-collect/tree/master/docs/live)
186    ///
187    /// # 参数
188    ///
189    /// | 名称 | 类型 | 说明 |
190    /// | ---- | ---- | ---- |
191    /// | `room_id` | i64 | 直播间号 |
192    /// | `ruid` | i64 | 主播 id |
193    /// | `page` | `Option<i32>` | 页码,默认 1 |
194    /// | `page_size` | `Option<i32>` | 每页 10~30,默认 20 |
195    /// | `typ` | `Option<i32>` | 3/4/5:周/月/总 亲密度 |
196    pub async fn live_guard_list(
197        &self,
198        room_id: i64,
199        ruid: i64,
200        page: Option<i32>,
201        page_size: Option<i32>,
202        typ: Option<i32>
203    ) -> Result<GuardListResponse, BpiError> {
204        let params: Vec<(&str, String)> = vec![
205            ("roomid", room_id.to_string()),
206            ("ruid", ruid.to_string()),
207            ("page", page.unwrap_or(1).to_string()),
208            ("page_size", page_size.unwrap_or(20).to_string()),
209            ("typ", typ.unwrap_or(5).to_string())
210        ];
211
212        let resp: GuardListResponse = self
213            .get("https://api.live.bilibili.com/xlive/app-room/v2/guardTab/topListNew")
214            .query(&params)
215            .send_bpi("查询大航海成员").await?;
216
217        Ok(resp)
218    }
219}
220
221#[cfg(test)]
222mod tests {
223    use super::*;
224
225    #[tokio::test]
226    async fn test_get_guard_list() -> Result<(), Box<BpiError>> {
227        let bpi = BpiClient::new();
228        let resp = bpi.live_guard_list(23174842, 504140200, None, None, None).await?;
229
230        let data = resp.data.unwrap();
231        assert!(data.list.len() > 0);
232        Ok(())
233    }
234}