Skip to main content

bpi_rs/login/
exit.rs

1//! 退出登录 (Web端)
2//!
3//! [文档](https://socialsisteryi.github.io/bilibili-API-collect/docs/login/exit.html#退出登录-web端)
4
5use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
6use serde::{ Deserialize, Serialize };
7
8/// 退出登录成功后的数据体
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct LogoutData {
11    /// 重定向 URL
12    #[serde(rename = "redirectUrl")]
13    pub redirect_url: String,
14}
15
16/// 退出登录响应结构体
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct LogoutResponse {
19    /// 返回码
20    /// - 0:成功
21    /// - 2202:csrf 请求非法
22    pub code: i32,
23    /// 返回状态,成功为 true
24    pub status: bool,
25    /// 时间戳
26    pub ts: u64,
27    /// 错误信息(成功时不存在)
28    pub message: Option<String>,
29    /// 有效时的 data
30    pub data: Option<LogoutData>,
31}
32
33impl BpiClient {
34    /// 退出登录 (Web端)
35    ///
36    /// # 参数
37    /// - `gourl`:成功后跳转的 URL,可选,默认 `javascript:history.go(-1)`
38    pub async fn logout_web(
39        &self,
40        gourl: Option<&str>
41    ) -> Result<BpiResponse<LogoutData>, BpiError> {
42        let csrf = self.csrf()?;
43
44        let form = vec![
45            ("biliCSRF", csrf),
46            ("gourl", gourl.unwrap_or("javascript:history.go(-1)").to_string())
47        ];
48
49        let result = self
50            .post("https://passport.bilibili.com/login/exit/v2")
51            .form(&form)
52            .send_bpi("退出登录 (Web端)").await?;
53
54        Ok(result)
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[tokio::test]
63    async fn test_logout_web() -> Result<(), Box<BpiError>> {
64        // let bpi = BpiClient::new();
65        //
66        // match bpi.logout_web(None).await {
67        //     Ok(resp) => {
68        //         if resp.code == 0 {
69        //             let data = resp.data.unwrap();
70        //             tracing::info!("退出登录成功,重定向 URL: {}", data.redirect_url);
71        //         } else {
72        //             tracing::info!(
73        //                 "退出登录失败: code={}, message={:?}",
74        //                 resp.code,
75        //                 resp.message
76        //             );
77        //         }
78        //     }
79        //     Err(err) => {
80        //         panic!("请求出错: {}", err);
81        //     }
82        // }
83        Ok(())
84    }
85}