use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SpaceCover {
pub height: u32,
pub url: String,
pub width: u32,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SpaceStat {
pub like: String,
pub view: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SpaceItem {
pub content: String,
pub cover: Option<SpaceCover>,
pub jump_url: String,
pub opus_id: String,
pub stat: SpaceStat,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SpaceData {
pub has_more: bool,
pub items: Vec<SpaceItem>,
pub offset: String,
pub update_num: u32,
}
impl BpiClient {
pub async fn opus_space_feed(
&self,
mid: u64,
page: Option<u32>,
offset: Option<&str>,
typ: Option<&str> ) -> Result<BpiResponse<SpaceData>, BpiError> {
let query = vec![
("host_mid", mid.to_string()),
("page", page.unwrap_or(0).to_string()),
("offset", offset.unwrap_or("").to_string()),
("type", typ.unwrap_or("all").to_string()),
("web_location", "333.1387".to_string())
];
self
.get("https://api.bilibili.com/x/polymer/web-dynamic/v1/opus/feed/space")
.query(&query)
.send_bpi("获取用户空间图文").await
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::info;
#[tokio::test]
async fn test_opus_space_feed() {
let bpi = BpiClient::new();
let resp = bpi.opus_space_feed(4279370, Some(1), None, None).await;
assert!(resp.is_ok());
if let Ok(r) = resp {
info!("空间图文返回: {:?}", r);
}
}
}