Skip to main content

bpi_rs/activity/
info.rs

1//! 活动主题信息
2//!
3//! [查看 API 文档](https://github.com/Yuelioi/bilibili-API-collect/tree/cfc5fddcc8a94b74d91970bb5b4eaeb349addc47/docs/activity/info.md)
4use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
5use serde::{ Deserialize, Serialize };
6
7/// 活动主题信息数据
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct ActivityInfoData {
10    /// 活动 id
11    pub id: u64,
12    /// 开始时间 UNIX 秒级时间戳
13    pub stime: i64,
14    /// 结束时间 UNIX 秒级时间戳
15    pub etime: i64,
16    /// 创建时间 UNIX 秒级时间戳
17    pub ctime: i64,
18    /// 修改时间 UNIX 秒级时间戳
19    pub mtime: i64,
20    /// 活动名称
21    pub name: String,
22    /// 活动链接
23    pub act_url: String,
24    /// 封面图片
25    pub cover: String,
26    /// 简介
27    pub dic: String,
28    /// H5 封面
29    pub h5_cover: String,
30    /// Android 端活动链接
31    pub android_url: String,
32    /// iOS 端活动链接
33    pub ios_url: String,
34    /// 子活动 id?
35    pub child_sids: String,
36    /// 仅在传入 bvid 时存在
37    pub lid: Option<i64>,
38}
39
40impl BpiClient {
41    /// 获取活动主题信息
42    ///
43    /// # 参数
44    /// | 名称   | 类型   | 说明       |
45    /// | ------ | ------ | ---------- |
46    /// | `sid`  | u64    | 活动 ID    |
47    /// | `bvid` | String | 来源视频号 |
48    ///
49    /// # 文档
50    /// [查看API文档](<https://github.com/Yuelioi/bilibili-API-collect/tree/cfc5fddcc8a94b74d91970bb5b4eaeb349addc47/docs/activity/info.md#主题信息>)
51    pub async fn activity_info(
52        &self,
53        sid: u64,
54        bvid: Option<&str>
55    ) -> Result<BpiResponse<ActivityInfoData>, BpiError> {
56        let mut params = vec![("sid", sid.to_string())];
57
58        if let Some(bvid) = bvid {
59            params.push(("bvid", bvid.to_string()));
60        }
61
62        let result = self
63            .get("https://api.bilibili.com/x/activity/subject/info")
64            .query(&params)
65            .send_bpi("获取活动主题信息").await?;
66
67        Ok(result)
68    }
69}
70
71#[cfg(test)]
72mod tests {
73    use super::*;
74
75    #[tokio::test]
76    async fn test_activity_info() -> Result<(), Box<BpiError>> {
77        let bpi = BpiClient::new();
78        let sid = 4017552;
79        let bvid = Some("BV1mKY4e8ELy");
80
81        let result = bpi.activity_info(sid, bvid).await?;
82        let data = result.into_data()?;
83        tracing::info!("{:#?}", data);
84
85        Ok(())
86    }
87
88    #[tokio::test]
89    async fn test_activity_info_without_bvid() -> Result<(), Box<BpiError>> {
90        let bpi = BpiClient::new();
91        let sid = 4017552;
92
93        let result = bpi.activity_info(sid, None).await?;
94        let data = result.into_data()?;
95        tracing::info!("{:#?}", data);
96
97        assert_eq!(data.id, sid);
98
99        Ok(())
100    }
101}