use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RelationStatResponseData {
pub mid: u64,
pub following: u64,
pub whisper: u64,
pub black: u64,
pub follower: u64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct UpstatArchive {
pub view: u64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct UpstatArticle {
pub view: u64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct UpstatResponseData {
pub archive: UpstatArchive,
pub article: UpstatArticle,
pub likes: u64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct NavnumChannel {
pub master: u64,
pub guest: u64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct NavnumFavourite {
pub master: u64,
pub guest: u64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct NavnumResponseData {
pub video: u64,
pub bangumi: u64,
pub cinema: u64,
pub channel: NavnumChannel,
pub favourite: NavnumFavourite,
pub tag: u64,
pub article: u64,
pub playlist: u64,
pub album: u64,
pub audio: u64,
pub pugv: u64,
pub opus: u64,
#[serde(rename = "season_num")]
pub season_num: u64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct AlbumCountResponseData {
pub all_count: u64,
pub draw_count: u64,
pub photo_count: u64,
pub daily_count: u64,
}
impl BpiClient {
pub async fn user_relation_stat(
&self,
vmid: u64
) -> Result<BpiResponse<RelationStatResponseData>, BpiError> {
self
.get("https://api.bilibili.com/x/relation/stat")
.query(&[("vmid", &vmid.to_string())])
.send_bpi("获取用户关系状态数").await
}
pub async fn user_up_stat(
&self,
mid: u64
) -> Result<BpiResponse<UpstatResponseData>, BpiError> {
self
.get("https://api.bilibili.com/x/space/upstat")
.query(&[("mid", &mid.to_string())])
.send_bpi("获取 UP 主状态数").await
}
pub async fn user_navnum(&self, mid: u64) -> Result<BpiResponse<NavnumResponseData>, BpiError> {
self
.get("https://api.bilibili.com/x/space/navnum")
.query(&[("mid", &mid.to_string())])
.send_bpi("获取用户导航栏状态数").await
}
pub async fn user_album_count(
&self,
uid: u64
) -> Result<BpiResponse<AlbumCountResponseData>, BpiError> {
self
.get("https://api.vc.bilibili.com/link_draw/v1/doc/upload_count")
.query(&[("uid", &uid.to_string())])
.send_bpi("获取相簿投稿数").await
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::info;
const TEST_MID: u64 = 332704117;
const TEST_UP_MID: u64 = 456664753;
const TEST_NAV_MID: u64 = 645769214;
#[tokio::test]
async fn test_get_relation_stat() -> Result<(), BpiError> {
let bpi = BpiClient::new();
let resp = bpi.user_relation_stat(TEST_MID).await?;
let data = resp.into_data()?;
info!("关系状态数: {:?}", data);
assert_eq!(data.mid, TEST_MID);
Ok(())
}
#[tokio::test]
async fn test_get_up_stat() -> Result<(), BpiError> {
let bpi = BpiClient::new();
let resp = bpi.user_up_stat(TEST_UP_MID).await?;
let data = resp.into_data()?;
info!("UP主状态数: {:?}", data);
assert!(data.likes > 0);
Ok(())
}
#[tokio::test]
async fn test_get_nav_num() -> Result<(), BpiError> {
let bpi = BpiClient::new();
let resp = bpi.user_navnum(TEST_NAV_MID).await?;
let data = resp.into_data()?;
info!("用户导航栏状态数: {:?}", data);
assert!(data.video > 0);
Ok(())
}
#[tokio::test]
async fn test_get_album_count() -> Result<(), BpiError> {
let bpi = BpiClient::new();
let resp = bpi.user_album_count(TEST_NAV_MID).await?;
let data = resp.into_data()?;
info!("相簿投稿数: {:?}", data);
assert!(data.all_count > 0);
Ok(())
}
}