1use crate::{BilibiliRequest, BpiClient, BpiError, BpiResponse};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Deserialize, Serialize)]
8pub struct DynamicNavAuthor {
9 pub face: String,
11 pub mid: u64,
13 pub name: String,
15}
16
17#[derive(Debug, Clone, Deserialize, Serialize)]
19pub struct DynamicNavItem {
20 pub author: DynamicNavAuthor,
22 pub cover: String,
24 pub id_str: String,
26 pub pub_time: String,
28 pub rid: u64,
30 pub title: String,
32 #[serde(rename = "type")]
34 pub type_num: u8,
35 pub visible: bool,
37}
38
39#[derive(Debug, Clone, Deserialize, Serialize)]
41pub struct DynamicNavData {
42 pub has_more: bool,
44 pub items: Vec<DynamicNavItem>,
46 pub offset: String,
48 pub update_baseline: String,
50 pub update_num: u64,
52}
53
54impl BpiClient {
55 pub async fn dynamic_nav_feed(
66 &self,
67 update_baseline: Option<&str>,
68 offset: Option<&str>,
69 ) -> Result<BpiResponse<DynamicNavData>, BpiError> {
70 let mut req = self.get("https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/nav");
71
72 if let Some(baseline) = update_baseline {
73 req = req.query(&[("update_baseline", baseline)]);
74 }
75
76 if let Some(off) = offset {
77 req = req.query(&[("offset", off)]);
78 }
79
80 req.send_bpi("获取导航栏动态列表").await
81 }
82}
83
84#[cfg(test)]
85mod tests {
86 use super::*;
87 use tracing::info;
88
89 #[tokio::test]
90
91 async fn test_get_dynamic_nav_feed() -> Result<(), BpiError> {
92 let bpi = BpiClient::new();
93 let resp = bpi.dynamic_nav_feed(None, None).await?;
94 let data = resp.into_data()?;
95
96 info!("获取到 {} 条动态", data.items.len());
97 info!("第一条动态ID: {}", data.items[0].id_str);
98
99 assert!(!data.items.is_empty());
100
101 Ok(())
102 }
103}