use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct LiveUser {
pub face: String,
pub link: String,
pub title: String,
pub uid: u64,
pub uname: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct LiveUsersData {
pub count: u64,
pub group: String,
pub items: Vec<LiveUser>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DynUpUser {
pub user_profile: UserProfile,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct UserProfile {
pub info: UserInfo,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct UserInfo {
pub uid: u64,
pub uname: String,
pub face: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DynUpUsersData {
pub button_statement: String,
pub items: Vec<DynUpUser>,
}
impl BpiClient {
pub async fn dynamic_live_users(
&self,
size: Option<u32>
) -> Result<BpiResponse<LiveUsersData>, BpiError> {
let mut req = self.get(
"https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users"
);
if let Some(s) = size {
req = req.query(&[("size", &s.to_string())]);
}
req.send_bpi("获取正在直播的已关注者").await
}
pub async fn dynamic_up_users(
&self,
teenagers_mode: Option<u8>
) -> Result<BpiResponse<DynUpUsersData>, BpiError> {
let mut req = self.get(
"https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist"
);
if let Some(mode) = teenagers_mode {
req = req.query(&[("teenagers_mode", &mode.to_string())]);
} else {
req = req.query(&[("teenagers_mode", "0")]);
}
req.send_bpi("获取发布新动态的已关注者").await
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::info;
#[tokio::test]
async fn test_get_live_users() -> Result<(), BpiError> {
let bpi = BpiClient::new();
let resp = bpi.dynamic_live_users(Some(1)).await?;
let data = resp.into_data()?;
info!("直播中的关注者数量: {}", data.count);
info!("第一位直播中的关注者: {:?}", data.items.get(0));
Ok(())
}
#[tokio::test]
async fn test_get_dyn_up_users() -> Result<(), BpiError> {
let bpi = BpiClient::new();
let resp = bpi.dynamic_up_users(None).await?;
let data = resp.into_data()?;
info!("发布新动态的关注者列表: {:?}", data.items);
assert!(!data.items.is_empty());
Ok(())
}
}