diff --git a/sdgb-api/src/all_net/mod.rs b/sdgb-api/src/all_net/mod.rs index 15e3f94..e57ffa2 100644 --- a/sdgb-api/src/all_net/mod.rs +++ b/sdgb-api/src/all_net/mod.rs @@ -1,10 +1,16 @@ use std::backtrace::Backtrace; -use nyquest::{AsyncClient, Body, Request, header::USER_AGENT}; +use nyquest::{ + AsyncClient, Body, Request, + header::{SET_COOKIE, USER_AGENT}, +}; mod model; -use model::{GetResponse, GetUserId}; +use model::GetUserId; use serde::Serialize; +use spdlog::debug; + +pub use model::GetResponse; pub struct QRCode<'a> { pub qrcode_content: &'a str, @@ -40,7 +46,7 @@ pub enum QRLoginError { } impl QRCode<'_> { - pub async fn login(self, client: &AsyncClient) -> Result { + pub async fn login(self, client: &AsyncClient) -> Result { let qr_code = &self.qrcode_content.as_bytes()[self.qrcode_content.len() - 64..]; let qr_code = String::from_utf8_lossy(qr_code); @@ -49,12 +55,14 @@ impl QRCode<'_> { .with_header(USER_AGENT, "WC_AIME_LIB"); let resp = client.request(req).await?; + + let cookie = resp.get_header(SET_COOKIE)?; let resp: GetResponse = resp.json().await?; - let user_id = resp.user_id; + debug!("Set-Cookie: {cookie:?}"); match resp.error_id { - 0 => return Ok(user_id), + 0 => return Ok(resp), 2 => Err(QRLoginError::QRCodeExpired10), 1 => Err(QRLoginError::QRCodeExpired30), 50 => Err(QRLoginError::BadSingature), diff --git a/sdgb-api/src/all_net/model.rs b/sdgb-api/src/all_net/model.rs index 2668e7b..1b880d8 100644 --- a/sdgb-api/src/all_net/model.rs +++ b/sdgb-api/src/all_net/model.rs @@ -15,7 +15,7 @@ pub struct GetUserId { pub timestamp: String, } -#[derive(Default, Debug, Clone, PartialEq, Deserialize)] +#[derive(Default, Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetResponse { pub key: String, @@ -24,6 +24,7 @@ pub struct GetResponse { pub error_id: i64, #[serde(rename = "userID")] pub user_id: i64, + pub token: String, } impl GetUserId { diff --git a/sdgb-cli/src/main.rs b/sdgb-cli/src/main.rs index 21574f4..079af08 100644 --- a/sdgb-cli/src/main.rs +++ b/sdgb-cli/src/main.rs @@ -11,7 +11,7 @@ use palc::Parser; use spdlog::{Level, LevelFilter::MoreSevereEqual, sink::StdStreamSink, terminal_style::StyleMode}; use sdgb_api::{ - all_net::QRCode, + all_net::{GetResponse, QRCode}, auth_lite::{SDGB, SDHJ, delivery_raw}, title::{ MaiVersionExt, Sdgb1_50, Sdgb1_53, @@ -197,7 +197,9 @@ async fn main() -> Result<(), Box> { let resp = qrcode.login(&client).await; match &resp { - Ok(user_id) => info!("login succeed: {user_id}"), + Ok(GetResponse { user_id, token, .. }) => { + info!("login succeed: {user_id}, {token:?}") + } Err(e) => error!("login failed: {e}"), }