Skip to main content

bpi_rs/activity/
info.rs

1//! 活动主题信息
2//!
3//! [查看 API 文档](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/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/SocialSisterYi/bilibili-API-collect/blob/master/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("获取活动主题信息")
66            .await?;
67
68        Ok(result)
69    }
70}
71
72#[cfg(test)]
73mod tests {
74    use super::*;
75
76    #[tokio::test]
77    async fn test_activity_info() -> Result<(), Box<BpiError>> {
78        let bpi = BpiClient::new();
79        let sid = 4017552;
80        let bvid = Some("BV1mKY4e8ELy");
81
82        let result = bpi.activity_info(sid, bvid).await?;
83        let data = result.into_data()?;
84        tracing::info!("{:#?}", data);
85
86        Ok(())
87    }
88
89    #[tokio::test]
90    async fn test_activity_info_without_bvid() -> Result<(), Box<BpiError>> {
91        let bpi = BpiClient::new();
92        let sid = 4017552;
93
94        let result = bpi.activity_info(sid, None).await?;
95        let data = result.into_data()?;
96        tracing::info!("{:#?}", data);
97
98        assert_eq!(data.id, sid);
99
100        Ok(())
101    }
102}