Skip to main content

bpi_rs/electric/
bcoin.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{BilibiliRequest, BpiClient, BpiError, BpiResponse};
4
5#[derive(Debug, Clone, Serialize)]
6pub struct BcoinQuickPayForm<'a> {
7    pub bp_num: i32,
8    pub is_bp_remains_prior: bool,
9    pub up_mid: i64,
10    pub otype: &'a str, // "up" | "archive"
11    pub oid: i64,
12    pub csrf: &'a str,
13}
14
15#[derive(Debug, Serialize, Clone, Deserialize)]
16pub struct BcoinQuickPayData {
17    /// 本用户 mid
18    pub mid: i64,
19    /// 目标用户 mid
20    pub up_mid: i64,
21    /// 留言 token(用于添加充电留言)
22    pub order_no: String,
23    /// 充电贝壳数(字符串)
24    pub bp_num: String,
25    /// 获得经验数
26    pub exp: u32,
27    /// 返回结果
28    /// - `4`:成功
29    /// - `-2`:低于 20 电池下限
30    /// - `-4`:B 币不足
31    pub status: i32,
32    /// 错误信息(默认为空)
33    pub msg: String,
34}
35
36impl BpiClient {
37    /// 新版本B币充电
38    /// # 参数
39    /// - `bp_num`: 贝壳数量,必须在 2-9999 之间
40    /// - `is_bp_remains_prior`: 是否优先扣除 B 币余额
41    ///   - `true`: B 币充电时请选择 true
42    ///   - `false`: 否则从贝壳余额中扣除
43    /// - `up_mid`: 充电对象用户的 mid
44    /// - `otype`: 充电来源
45    ///   - `"up"`: 空间充电
46    ///   - `"archive"`: 视频充电
47    /// - `oid`: 充电来源代码
48    ///   - 空间充电:传充电对象用户 mid
49    ///   - 视频充电:传稿件 avid
50    pub async fn electric_bcoin_quick_pay(
51        &self,
52        bp_num: i32,
53        is_bp_remains_prior: bool,
54        up_mid: i64,
55        otype: &str,
56        oid: i64,
57    ) -> Result<BpiResponse<BcoinQuickPayData>, BpiError> {
58        let csrf_owned = self.csrf()?;
59        let form = BcoinQuickPayForm {
60            bp_num,
61            is_bp_remains_prior,
62            up_mid,
63            otype,
64            oid,
65            csrf: &csrf_owned,
66        };
67
68        self.post("https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick")
69            .form(&form)
70            .send_bpi("新版本B币充电")
71            .await
72    }
73}
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78
79    #[tokio::test]
80    async fn test_electric_bcoin_quick_pay_min() {
81        let bpi = BpiClient::new();
82        let resp = bpi
83            .electric_bcoin_quick_pay(2, true, 107997089, "up", 107997089)
84            .await;
85        assert!(resp.is_ok());
86        tracing::info!("{:?}", resp);
87    }
88}