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}