use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DynamicNavAuthor {
pub face: String,
pub mid: u64,
pub name: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DynamicNavItem {
pub author: DynamicNavAuthor,
pub cover: String,
pub id_str: String,
pub pub_time: String,
pub rid: u64,
pub title: String,
#[serde(rename = "type")]
pub type_num: u8,
pub visible: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DynamicNavData {
pub has_more: bool,
pub items: Vec<DynamicNavItem>,
pub offset: String,
pub update_baseline: String,
pub update_num: u64,
}
impl BpiClient {
pub async fn dynamic_nav_feed(
&self,
update_baseline: Option<&str>,
offset: Option<&str>
) -> Result<BpiResponse<DynamicNavData>, BpiError> {
let mut req = self.get("https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/nav");
if let Some(baseline) = update_baseline {
req = req.query(&[("update_baseline", baseline)]);
}
if let Some(off) = offset {
req = req.query(&[("offset", off)]);
}
req.send_bpi("获取导航栏动态列表").await
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::info;
#[tokio::test]
async fn test_get_dynamic_nav_feed() -> Result<(), BpiError> {
let bpi = BpiClient::new();
let resp = bpi.dynamic_nav_feed(None, None).await?;
let data = resp.into_data()?;
info!("获取到 {} 条动态", data.items.len());
info!("第一条动态ID: {}", data.items[0].id_str);
assert!(!data.items.is_empty());
Ok(())
}
}