Skip to main content

bpi_rs/search/
suggest.rs

1use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
2use serde::Deserialize;
3
4/// 搜索建议结果
5#[derive(Debug, Deserialize)]
6pub struct SearchSuggest {
7    pub tag: Option<Vec<SearchSuggestItem>>,
8}
9
10/// 搜索建议项
11#[derive(Debug, Deserialize)]
12pub struct SearchSuggestItem {
13    pub value: Option<String>,
14    pub name: Option<String>,
15    #[serde(rename = "type")]
16    pub item_type: Option<String>,
17}
18
19impl BpiClient {
20    /// 获取搜索建议关键词
21    ///
22    /// # 文档
23    /// [查看API文档](https://github.com/SocialSisterYi/bilibili-API-collect/tree/master/docs/search)
24    ///
25    /// # 参数
26    /// - `term`: 搜索关键词
27    pub async fn search_suggest(&self, term: &str) -> Result<BpiResponse<SearchSuggest>, BpiError> {
28        let params = [("term", term)];
29
30        self
31            .get("https://s.search.bilibili.com/main/suggest")
32            .query(&params)
33            .send_bpi("获取搜索建议").await
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40    use tracing::info;
41
42    #[tokio::test]
43    async fn test_search_suggest() {
44        // 创建一个 BilibiliRequest 实例
45        let bpi = BpiClient::new();
46        // 传入一个搜索关键词
47        let term = "rust";
48        let resp = bpi.search_suggest(term).await;
49
50        // 验证请求是否成功
51        assert!(resp.is_ok());
52
53        if let Ok(r) = resp {
54            info!("搜索建议返回: {:?}", r);
55
56            // 检查返回码是否为0
57            if r.code == 0 {
58                // 检查 result 是否存在
59
60                // 检查搜索建议列表是否存在
61                if let Some(suggests) = r.data {
62                    // 检查 tag 数组是否不为空
63                    if let Some(tags) = suggests.tag {
64                        assert!(!tags.is_empty());
65                        info!("获取到搜索建议列表,数量:{}", tags.len());
66
67                        // 打印第一个搜索建议
68                        if let Some(first_suggest) = tags.first() {
69                            info!("第一个建议关键词: {:?}", first_suggest.value);
70                            info!("第一个建议显示内容: {:?}", first_suggest.name);
71                        }
72                    } else {
73                        info!("搜索建议列表为空。");
74                    }
75                } else {
76                    info!("返回数据中没有 'result' 字段。");
77                }
78            } else {
79                info!("API 返回码不为0,可能存在错误: {}", r.code);
80            }
81        }
82    }
83}