bpi_rs/article/
articles.rs1use crate::article::models::{ ArticleAuthor, ArticleCategory, ArticleStats };
6use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
7use serde::{ Deserialize, Serialize };
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct ArticlesData {
12 pub list: ArticleList,
14 pub articles: Vec<ArticleItem>,
16 pub author: ArticleAuthor,
18 pub last: ArticleItem,
20 pub attention: bool,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct ArticleList {
27 pub id: i64,
29 pub mid: i64,
31 pub name: String,
33 pub image_url: String,
35 pub update_time: i64,
37 pub ctime: i64,
39 pub publish_time: i64,
41 pub summary: String,
43 pub words: i64,
45 pub read: i64,
47 pub articles_count: i32,
49 pub state: i32,
51 pub reason: String,
53 pub apply_time: String,
55 pub check_time: String,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct ArticleItem {
62 pub id: i64,
64 pub title: String,
66 pub state: i32,
68 pub publish_time: i64,
70 pub words: i64,
72 pub image_urls: Vec<String>,
74 pub category: ArticleCategory,
76 pub categories: Vec<ArticleCategory>,
78 pub summary: String,
80 pub stats: Option<ArticleStats>,
82 pub like_state: Option<i32>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct AuthorVip {
89 pub r#type: i32,
91 pub status: i32,
93 pub due_date: i64,
95 pub vip_pay_type: i32,
97 pub theme_type: i32,
99 pub label: Option<serde_json::Value>,
101}
102
103impl BpiClient {
104 pub async fn article_articles_info(
114 &self,
115 id: i64
116 ) -> Result<BpiResponse<ArticlesData>, BpiError> {
117 self
118 .get("https://api.bilibili.com/x/article/list/web/articles")
119 .query(&[("id", id.to_string())])
120 .send_bpi("获取文集基本信息").await
121 }
122}
123
124#[cfg(test)]
125mod tests {
126 use super::*;
127
128 #[tokio::test]
129 async fn test_get_articles_info() -> Result<(), Box<BpiError>> {
130 let bpi = BpiClient::new();
131
132 let rlid = 207146;
133
134 let result = bpi.article_articles_info(rlid).await?;
135 let data = result.into_data()?;
136 tracing::info!("{:#?}", data);
137
138 assert!(!data.list.name.is_empty());
139 assert!(!data.articles.is_empty());
140 assert!(!data.author.name.is_empty());
141
142 Ok(())
143 }
144}