ncm_api_rs/api/
register_anonimous.rs1use super::Query;
2use crate::error::Result;
3use crate::request::{ApiClient, ApiResponse, CryptoType};
6use crate::util::device::generate_device_id;
7use base64::{engine::general_purpose::STANDARD, Engine};
8use md5::{Digest, Md5};
9use serde_json::json;
10
11const ID_XOR_KEY_1: &str = "3go8&$8*3*3h0k(2)2";
12
13fn cloudmusic_dll_encode_id(some_id: &str) -> String {
14 let xored: Vec<u8> = some_id
15 .bytes()
16 .enumerate()
17 .map(|(i, b)| {
18 let key_byte = ID_XOR_KEY_1.as_bytes()[i % ID_XOR_KEY_1.len()];
19 b ^ key_byte
20 })
21 .collect();
22 let digest = Md5::digest(&xored);
23 STANDARD.encode(digest)
24}
25
26impl ApiClient {
27 pub async fn register_anonimous(&self, query: &Query) -> Result<ApiResponse> {
30 let device_id = generate_device_id();
31 let id_with_hash = format!("{} {}", device_id, cloudmusic_dll_encode_id(&device_id));
32 let encoded_id = STANDARD.encode(id_with_hash.as_bytes());
33 let data = json!({
34 "username": encoded_id
35 });
36 let result = self
37 .request(
38 "/api/register/anonimous",
39 data,
40 query.to_option(CryptoType::Weapi),
41 )
42 .await?;
43 Ok(result)
44 }
45}