From 322b85ed659588511cebd6b46b06390658d1ab3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=AF=E5=87=9B?= Date: Thu, 8 Jan 2026 00:18:01 +0800 Subject: [PATCH] todo: prepare for 1.53 API support --- sdgb-api/src/title/encryption/mod.rs | 20 +++++++++++++++++++- sdgb-api/src/title/mod.rs | 18 ++++++++++++++++-- sdgb-cli/src/main.rs | 9 ++++++++- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/sdgb-api/src/title/encryption/mod.rs b/sdgb-api/src/title/encryption/mod.rs index 3fd51d4..d6593a3 100644 --- a/sdgb-api/src/title/encryption/mod.rs +++ b/sdgb-api/src/title/encryption/mod.rs @@ -9,7 +9,7 @@ use flate2::write::{ZlibDecoder, ZlibEncoder}; use spdlog::debug; use crate::error::ApiError; -use crate::title::{MaiVersion, MaiVersionExt, Sdgb1_50}; +use crate::title::{MaiVersion, MaiVersionExt, Sdgb1_50, Sdgb1_53}; impl MaiVersionExt for Sdgb1_50 { fn decode(mut data: impl AsMut<[u8]>) -> Result, ApiError> { @@ -29,6 +29,24 @@ impl MaiVersionExt for Sdgb1_50 { } } +impl MaiVersionExt for Sdgb1_53 { + fn decode(mut data: impl AsMut<[u8]>) -> Result, ApiError> { + if data.as_mut().is_empty() { + return Err(ApiError::EmptyResponse); + } + + debug!("data size: {}", data.as_mut().len()); + let decrypted = decrypt(&mut data, Self::AES_KEY, Self::AES_IV)?; + Ok(decompress(decrypted)) + } + + fn encode(data: impl AsRef<[u8]>) -> Result, ApiError> { + let compressed = compress(data)?; + let enc = encrypt(compressed, Self::AES_KEY, Self::AES_IV)?; + Ok(enc) + } +} + type Aes256CbcEnc = cbc::Encryptor; type Aes256CbcDec = cbc::Decryptor; diff --git a/sdgb-api/src/title/mod.rs b/sdgb-api/src/title/mod.rs index cc60918..364f2d4 100644 --- a/sdgb-api/src/title/mod.rs +++ b/sdgb-api/src/title/mod.rs @@ -13,7 +13,7 @@ use super::ApiError; use nyquest::{ AsyncClient, Body, r#async::Request, - header::{ACCEPT_ENCODING, CONTENT_ENCODING, EXPECT, USER_AGENT}, + header::{ACCEPT_ENCODING, CONTENT_ENCODING, COOKIE, EXPECT, USER_AGENT}, }; use serde::{Deserialize, Serialize}; use spdlog::debug; @@ -48,7 +48,7 @@ pub trait MaiVersionExt: MaiVersion { let payload = Self::encode(json)?; let api_hash = Self::api_hash(api); - let req = Request::post(format!( + let mut req = Request::post(format!( "https://maimai-gm.wahlap.com:42081/Maimai2Servlet/{api_hash}" )) .with_body(Body::json_bytes(payload)) @@ -59,6 +59,11 @@ pub trait MaiVersionExt: MaiVersion { .with_header(CONTENT_ENCODING, "deflate") .with_header(EXPECT, "100-continue"); + // TODO: userid, token + if Self::VERSION >= "1.53" { + req = req.with_header(COOKIE, format!("")) + } + debug!("request: {req:?}"); Ok(req) @@ -122,6 +127,7 @@ pub trait MaiVersionExt: MaiVersion { } pub struct Sdgb1_50; +pub struct Sdgb1_53; impl MaiVersion for Sdgb1_50 { const AES_KEY: &[u8; 32] = b"a>32bVP7v<63BVLkY[xM>daZ1s9MBP"; + const AES_IV: &[u8; 16] = b"AL Result<(), Box> { "sdgb 1.50 resp: {decoded}, {}ms", time.elapsed().unwrap_or_default().as_millis() ); + + let decoded: PingResp = + Sdgb1_53::request(&client, APIMethod::Ping, "", Ping {}).await?; + info!( + "sdgb 1.53 resp: {decoded}, {}ms", + time.elapsed().unwrap_or_default().as_millis() + ); } Commands::QRLogin { ref qrcode_content } => { let qrcode = QRCode { qrcode_content };