feat: qrlogin command

This commit is contained in:
mokurin000
2025-07-29 20:16:04 +08:00
parent 084d4846d6
commit 097e332aa7
6 changed files with 339 additions and 20 deletions

291
Cargo.lock generated
View File

@@ -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]]

View File

@@ -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]

View File

@@ -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?;

View File

@@ -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",
] }

19
sdgb-cli/src/commands.rs Normal file
View File

@@ -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,
},
}

View File

@@ -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<dyn snafu::Error>> {
nyquest_preset::register();
let cmd = <Cli as Parser>::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(())
}