bpi_rs/manga/
user.rs

1//! 漫画用户信息
2//!
3//! https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/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    /// 文档: https://github.com/SocialSisterYi/bilibili-API-collect/tree/master/docs/manga
71    ///
72    /// 参数
73    ///
74    /// | 名称 | 类型 | 说明 |
75    /// | ---- | ---- | ---- |
76    /// | `page_num` | i32 | 页码 |
77    /// | `page_size` | i32 | 分页大小,默认 20,[1,100] |
78    pub async fn manga_coupons(
79        &self,
80        page_num: i32,
81        page_size: i32
82    ) -> Result<BpiResponse<CouponsData>, BpiError> {
83        let params = GetCouponsRequest {
84            page_num: page_num,
85            page_size: page_size,
86            not_expired: Some(true),
87            tab_type: Some(1),
88            r#type: Some(0),
89        };
90
91        self
92            .post("https://manga.bilibili.com/twirp/user.v1.User/GetCoupons")
93            .json(&params)
94            .send_bpi("获取漫读券列表").await
95    }
96}
97
98#[cfg(test)]
99mod tests {
100    use super::*;
101
102    #[tokio::test]
103    async fn test_get_manga_coupons() -> Result<(), Box<BpiError>> {
104        let bpi = BpiClient::new();
105
106        let result = bpi.manga_coupons(1, 20).await?;
107
108        tracing::info!("{:#?}", result.data.unwrap());
109
110        Ok(())
111    }
112}