bpi_rs/video_ranking/
ranking.rs1use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
2use serde::{ Deserialize, Serialize };
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct RankingVideoItem {
9 #[serde(flatten)]
12 pub inner: serde_json::Value,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct RankingListData {
18 pub note: String,
20 pub list: Vec<RankingVideoItem>,
22}
23
24impl BpiClient {
25 pub async fn video_ranking_list(
36 &self,
37 rid: Option<u32>,
38 type_name: Option<&str>
39 ) -> Result<BpiResponse<RankingListData>, BpiError> {
40 let mut request = self.get("https://api.bilibili.com/x/web-interface/ranking/v2");
41
42 if let Some(r) = rid {
43 request = request.query(&[("rid", r)]);
44 }
45 if let Some(t) = type_name {
46 request = request.query(&[("type", t)]);
47 }
48
49 request = request.header(
51 "User-Agent",
52 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
53 );
54
55 request.send_bpi("获取分区视频排行榜列表").await
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65 use tracing::info;
66
67 #[tokio::test]
68 async fn test_video_ranking_list() {
69 let bpi = BpiClient::new();
70 let resp = bpi.video_ranking_list(None, None).await;
72
73 info!("{:?}", resp);
74 assert!(resp.is_ok());
75
76 let resp_data = resp.unwrap();
77 info!("code: {}", resp_data.code);
78 if let Some(data) = resp_data.data {
79 info!("note: {}", data.note);
80 info!("排行榜视频数: {}", data.list.len());
81 if let Some(first_item) = data.list.first() {
82 info!("first item: {}", serde_json::to_string_pretty(&first_item).unwrap());
84 }
85 }
86 }
87
88 #[tokio::test]
89 async fn test_video_ranking_list_with_rid() {
90 let bpi = BpiClient::new();
91 let resp = bpi.video_ranking_list(Some(21), None).await;
93
94 info!("{:?}", resp);
95 assert!(resp.is_ok());
96
97 let resp_data = resp.unwrap();
98 info!("code: {}", resp_data.code);
99 if let Some(data) = resp_data.data {
100 info!("note: {}", data.note);
101 info!("排行榜视频数: {}", data.list.len());
102 }
103 }
104
105 #[tokio::test]
106 async fn test_video_ranking_list_with_type() {
107 let bpi = BpiClient::new();
108 let resp = bpi.video_ranking_list(None, Some("rookie")).await;
110
111 info!("{:?}", resp);
112 assert!(resp.is_ok());
113
114 let resp_data = resp.unwrap();
115 info!("code: {}", resp_data.code);
116 if let Some(data) = resp_data.data {
117 info!("note: {}", data.note);
118 info!("排行榜视频数: {}", data.list.len());
119 }
120 }
121}