Skip to main content

bpi_rs/manga/
user.rs

1//! 漫画用户信息
2//!
3//! [查看 API 文档](https://github.com/Yuelioi/bilibili-API-collect/tree/cfc5fddcc8a94b74d91970bb5b4eaeb349addc47/docs/manga/User.md)
4
5use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
6use serde::{ Deserialize, Serialize };
7
8/// 漫读券信息
9#[derive(Debug, Serialize, Clone, Deserialize)]
10pub struct UserCoupon {
11    /// 漫读券id
12    #[serde(rename = "ID")]
13    pub id: i32,
14    /// 漫读券剩余数
15    pub remain_amount: i32,
16    /// 漫读券总数
17    pub total_amount: u32,
18}
19
20/// 漫读券信息数据
21#[derive(Debug, Serialize, Clone, Deserialize)]
22pub struct CouponsData {
23    /// 总剩余数量
24    pub total_remain_amount: i32,
25    /// 用户漫读券列表
26    pub user_coupons: Vec<UserCoupon>,
27    /// 漫读券信息
28    pub coupon_info: CouponInfo,
29}
30
31#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
32pub struct CouponInfo {
33    /// 拥有的漫读券数量
34    pub remain_coupon: i64,
35    /// 拥有的通用券数量
36    pub remain_silver: i64,
37    /// 拥有的商城优惠券数量
38    pub remain_shop_coupon: i64,
39}
40
41/// 获取漫读券列表请求参数
42#[derive(Debug, Clone, Serialize)]
43pub struct GetCouponsRequest {
44    /// 页数
45    #[serde(rename = "pageNum")]
46    pub page_num: i32,
47
48    /// 分页大小,默认20,取值范围`[1,100]`
49    #[serde(rename = "pageSize")]
50    pub page_size: i32,
51
52    /// 是否未过期
53    #[serde(rename = "notExpired", skip_serializing_if = "Option::is_none")]
54    pub not_expired: Option<bool>,
55
56    /// 标签类型
57    #[serde(rename = "tabType", skip_serializing_if = "Option::is_none")]
58    pub tab_type: Option<i32>,
59
60    /// 类型
61    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
62    pub r#type: Option<i32>,
63}
64
65// ================= 实现 =================
66
67impl BpiClient {
68    /// 获取拥有的漫读券列表
69    ///
70    /// # 文档
71    /// [查看API文档](https://github.com/SocialSisterYi/bilibili-API-collect/tree/master/docs/manga)
72    ///
73    /// # 参数
74    ///
75    /// | 名称 | 类型 | 说明 |
76    /// | ---- | ---- | ---- |
77    /// | `page_num` | i32 | 页码 |
78    /// | `page_size` | i32 | 分页大小,默认 20,`[1,100]` |
79    pub async fn manga_coupons(
80        &self,
81        page_num: i32,
82        page_size: i32
83    ) -> Result<BpiResponse<CouponsData>, BpiError> {
84        let params = GetCouponsRequest {
85            page_num: page_num,
86            page_size: page_size,
87            not_expired: Some(true),
88            tab_type: Some(1),
89            r#type: Some(0),
90        };
91
92        self
93            .post("https://manga.bilibili.com/twirp/user.v1.User/GetCoupons")
94            .json(&params)
95            .send_bpi("获取漫读券列表").await
96    }
97}
98
99#[cfg(test)]
100mod tests {
101    use super::*;
102
103    #[tokio::test]
104    async fn test_get_manga_coupons() -> Result<(), Box<BpiError>> {
105        let bpi = BpiClient::new();
106
107        let result = bpi.manga_coupons(1, 20).await?;
108
109        tracing::info!("{:#?}", result.data.unwrap());
110
111        Ok(())
112    }
113}