bpi_rs/dynamic/
content.rs1use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
2use serde::{ Deserialize, Serialize };
3
4#[derive(Debug, Clone, Deserialize, Serialize)]
6pub struct LiveUser {
7 pub face: String,
9 pub link: String,
11 pub title: String,
13 pub uid: u64,
15 pub uname: String,
17}
18
19#[derive(Debug, Clone, Deserialize, Serialize)]
21pub struct LiveUsersData {
22 pub count: u64,
24 pub group: String,
26 pub items: Vec<LiveUser>,
28}
29
30#[derive(Debug, Clone, Deserialize, Serialize)]
32pub struct DynUpUser {
33 pub user_profile: UserProfile,
34}
35#[derive(Debug, Clone, Deserialize, Serialize)]
36pub struct UserProfile {
37 pub info: UserInfo,
38}
39
40#[derive(Debug, Clone, Deserialize, Serialize)]
41pub struct UserInfo {
42 pub uid: u64,
43 pub uname: String,
44 pub face: String,
45}
46
47#[derive(Debug, Clone, Deserialize, Serialize)]
49pub struct DynUpUsersData {
50 pub button_statement: String,
52 pub items: Vec<DynUpUser>,
54}
55
56impl BpiClient {
57 pub async fn dynamic_live_users(
68 &self,
69 size: Option<u32>
70 ) -> Result<BpiResponse<LiveUsersData>, BpiError> {
71 let mut req = self.get(
72 "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users"
73 );
74
75 if let Some(s) = size {
76 req = req.query(&[("size", &s.to_string())]);
77 }
78
79 req.send_bpi("获取正在直播的已关注者").await
80 }
81
82 pub async fn dynamic_up_users(
93 &self,
94 teenagers_mode: Option<u8>
95 ) -> Result<BpiResponse<DynUpUsersData>, BpiError> {
96 let mut req = self.get(
97 "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist"
98 );
99
100 if let Some(mode) = teenagers_mode {
101 req = req.query(&[("teenagers_mode", &mode.to_string())]);
102 } else {
103 req = req.query(&[("teenagers_mode", "0")]);
105 }
106
107 req.send_bpi("获取发布新动态的已关注者").await
108 }
109}
110
111#[cfg(test)]
112mod tests {
113 use super::*;
114 use tracing::info;
115
116 #[tokio::test]
120 async fn test_get_live_users() -> Result<(), BpiError> {
121 let bpi = BpiClient::new();
122 let resp = bpi.dynamic_live_users(Some(1)).await?;
123 let data = resp.into_data()?;
124
125 info!("直播中的关注者数量: {}", data.count);
126 info!("第一位直播中的关注者: {:?}", data.items.get(0));
127
128 Ok(())
129 }
130
131 #[tokio::test]
132 async fn test_get_dyn_up_users() -> Result<(), BpiError> {
133 let bpi = BpiClient::new();
134 let resp = bpi.dynamic_up_users(None).await?;
135 let data = resp.into_data()?;
136
137 info!("发布新动态的关注者列表: {:?}", data.items);
138 assert!(!data.items.is_empty());
139
140 Ok(())
141 }
142}