1use crate::{BilibiliRequest, BpiClient, BpiError, BpiResponse};
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
10pub struct SpaceCover {
11 pub height: u32,
13 pub url: String,
15 pub width: u32,
17}
18
19#[derive(Debug, Clone, Deserialize, Serialize)]
21pub struct SpaceStat {
22 pub like: String,
24 pub view: Option<String>,
26}
27
28#[derive(Debug, Clone, Deserialize, Serialize)]
30pub struct SpaceItem {
31 pub content: String,
33 pub cover: Option<SpaceCover>,
35 pub jump_url: String,
37 pub opus_id: String,
39 pub stat: SpaceStat,
41}
42
43#[derive(Debug, Clone, Deserialize, Serialize)]
45pub struct SpaceData {
46 pub has_more: bool,
48 pub items: Vec<SpaceItem>,
50 pub offset: String,
52 pub update_num: u32,
54}
55
56impl BpiClient {
57 pub async fn opus_space_feed(
70 &self,
71 mid: u64,
72 page: Option<u32>,
73 offset: Option<&str>,
74 typ: Option<&str>, ) -> Result<BpiResponse<SpaceData>, BpiError> {
76 let query = vec![
77 ("host_mid", mid.to_string()),
78 ("page", page.unwrap_or(0).to_string()),
79 ("offset", offset.unwrap_or("").to_string()),
80 ("type", typ.unwrap_or("all").to_string()),
81 ("web_location", "333.1387".to_string()),
82 ];
83
84 self.get("https://api.bilibili.com/x/polymer/web-dynamic/v1/opus/feed/space")
85 .query(&query)
86 .send_bpi("获取用户空间图文")
87 .await
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use super::*;
94 use tracing::info;
95
96 #[tokio::test]
97 async fn test_opus_space_feed() {
98 let bpi = BpiClient::new();
99 let resp = bpi.opus_space_feed(4279370, Some(1), None, None).await;
100 assert!(resp.is_ok());
101 if let Ok(r) = resp {
102 info!("空间图文返回: {:?}", r);
103 }
104 }
105}