diff --git a/Cargo.lock b/Cargo.lock index 0dbd647..e3c1884 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,6 +59,12 @@ version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + [[package]] name = "autocfg" version = "1.5.0" @@ -247,7 +253,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -392,6 +398,12 @@ dependencies = [ "objc2", ] +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -443,7 +455,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -495,6 +507,12 @@ version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -540,6 +558,12 @@ dependencies = [ "cc", ] +[[package]] +name = "if_chain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" + [[package]] name = "indexmap" version = "2.10.0" @@ -550,6 +574,17 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "itoa" version = "1.0.15" @@ -590,6 +625,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.27" @@ -602,6 +647,12 @@ version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -611,6 +662,16 @@ dependencies = [ "adler2", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -629,7 +690,7 @@ dependencies = [ "nyquest-interface", "serde", "serde_json", - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -686,7 +747,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -775,6 +836,35 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "os_str_bytes" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63eceb7b5d757011a87d08eb2123db15d87fb0c281f65d101ce30a1e96c3ad5c" + +[[package]] +name = "palc" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42766a89de3dda844299845bbdac37fcfc50e3fb14557be4f8c8ceb54bdceb6a" +dependencies = [ + "os_str_bytes", + "palc-derive", + "ref-cast", +] + +[[package]] +name = "palc-derive" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "204d235b8dffce6ea58c4df57a1ceb1ddf4c366fc4daac40a39aed52385ab8a9" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "paste" version = "1.0.15" @@ -840,12 +930,41 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "rustc-demangle" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "1.0.8" @@ -886,6 +1005,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "sdgb-api" version = "0.1.0" @@ -905,9 +1030,18 @@ version = "0.1.0" dependencies = [ "compio", "nyquest-preset", + "palc", + "sdgb-api", "snafu", + "spdlog-rs", ] +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + [[package]] name = "serde" version = "1.0.219" @@ -925,7 +1059,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -968,10 +1102,10 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1961e2ef424c1424204d3a5d6975f934f56b6d50ff5732382d84ebf460e147f7" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -984,6 +1118,95 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spdlog-internal" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf745ed831fe29ec1ff6cc8dfb443721c08e895c9a08fcaa1e2c6f09ec020d" +dependencies = [ + "nom", + "strum", + "strum_macros", + "thiserror 1.0.69", +] + +[[package]] +name = "spdlog-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef71587528c04b22410623a92460fbd48f346052d6db3936b636edb4bd9d707" +dependencies = [ + "nom", + "proc-macro2", + "quote", + "spdlog-internal", + "syn 2.0.104", +] + +[[package]] +name = "spdlog-rs" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ac4a32f8f953f48eb5acfeb422f8d38ecbc107c8da8e926ccd249d92da85b6" +dependencies = [ + "arc-swap", + "atomic", + "cfg-if", + "chrono", + "dyn-clone", + "if_chain", + "is-terminal", + "libc", + "once_cell", + "rustc_version", + "spdlog-macros", + "spin", + "thiserror 1.0.69", + "winapi", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.104" @@ -995,13 +1218,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", ] [[package]] @@ -1012,7 +1255,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1094,7 +1337,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -1116,7 +1359,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1136,6 +1379,28 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows" version = "0.61.3" @@ -1190,7 +1455,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1201,7 +1466,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index b286d3f..d833bc9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["sdgb-api", "sdgb-cli"] resolver = "3" [workspace.dependencies] - +sdgb-api = { path = "./sdgb-api" } snafu = { version = "0.8.6", features = ["backtrace", "rust_1_81"] } [profile.release] diff --git a/sdgb-api/src/all_net/mod.rs b/sdgb-api/src/all_net/mod.rs index e24da84..76ed079 100644 --- a/sdgb-api/src/all_net/mod.rs +++ b/sdgb-api/src/all_net/mod.rs @@ -1,24 +1,27 @@ use std::backtrace::Backtrace; -use nyquest::{AsyncClient, Body, Request}; +use nyquest::{AsyncClient, Body, Request, header::USER_AGENT}; mod model; use model::{GetResponse, GetUserId}; pub struct QRCode<'a> { - qrcode_content: &'a str, + pub qrcode_content: &'a str, } #[derive(Debug, snafu::Snafu)] pub enum QRLoginError { + #[snafu(display("QRCode expired [10mins]"))] QRCodeExpired10, + #[snafu(display("QRCode expired [30mins]"))] QRCodeExpired30, + #[snafu(display("Bad signature!"))] BadSingature, - Unknown { - error_kind: i64, - }, + #[snafu(display("unknown error: {error_kind}"))] + Unknown { error_kind: i64 }, #[snafu(context(false))] + #[snafu(display("request error: {source}"))] NyquestError { source: nyquest::Error, backtrace: Backtrace, @@ -37,7 +40,8 @@ impl QRCode<'_> { let qr_code = String::from_utf8_lossy(qr_code); let req = Request::post("http://ai.sys-allnet.cn/wc_aime/api/get_data") - .with_body(Body::json(&GetUserId::new(qr_code))?); + .with_body(Body::json(&GetUserId::new(qr_code))?) + .with_header(USER_AGENT, "WC_AIME_LIB"); let resp = client.request(req).await?; let resp: GetResponse = resp.json().await?; diff --git a/sdgb-cli/Cargo.toml b/sdgb-cli/Cargo.toml index e74d6dc..c4d8c9f 100644 --- a/sdgb-cli/Cargo.toml +++ b/sdgb-cli/Cargo.toml @@ -2,12 +2,21 @@ name = "sdgb-cli" version = "0.1.0" edition = "2024" +authors = ["mokurin000"] +description = "CLI tool for SDGB protocol" [dependencies] snafu = { workspace = true } +sdgb-api = { workspace = true } nyquest-preset = { version = "0.2.0", features = ["async"] } compio = { version = "0.15.0", default-features = false, features = [ "runtime", "macros", ] } + +palc = { version = "0.0.1", features = ["derive"] } +spdlog-rs = { version = "0.4.3", default-features = false, features = [ + "level-info", + "release-level-info", +] } diff --git a/sdgb-cli/src/commands.rs b/sdgb-cli/src/commands.rs new file mode 100644 index 0000000..0674eed --- /dev/null +++ b/sdgb-cli/src/commands.rs @@ -0,0 +1,19 @@ +use palc::Parser; +use palc::Subcommand; + +#[derive(Parser)] +#[command(about = "SDGB api tool", long_about = env!("CARGO_PKG_DESCRIPTION"))] +pub struct Cli { + #[command(subcommand)] + pub command: Commands, +} + +#[derive(Subcommand)] +pub enum Commands { + /// Login with QRCode from wechat + QRLogin { + /// content of the qrcode, only the last 64 characters were used + #[arg(short, long)] + qrcode_content: String, + }, +} diff --git a/sdgb-cli/src/main.rs b/sdgb-cli/src/main.rs index d33f2bb..444aa8e 100644 --- a/sdgb-cli/src/main.rs +++ b/sdgb-cli/src/main.rs @@ -1,6 +1,28 @@ +use nyquest_preset::nyquest::ClientBuilder; +use palc::Parser; +use sdgb_api::all_net::QRCode; +use spdlog::{error, info}; + +use crate::commands::Cli; + +mod commands; + #[compio::main] async fn main() -> Result<(), Box> { nyquest_preset::register(); + let cmd = ::parse(); + + let client = ClientBuilder::default().build_async().await?; + + match cmd.command { + commands::Commands::QRLogin { ref qrcode_content } => { + let qrcode = QRCode { qrcode_content }; + match qrcode.login(&client).await { + Ok(user_id) => info!("login succeed: {user_id}"), + Err(e) => error!("login failed: {e}"), + } + } + } Ok(()) }