Skip to main content

ncm_api_rs/api/
register_anonimous.rs

1use super::Query;
2use crate::error::Result;
3/// 匿名注册
4/// 对应 Node.js module/register_anonimous.js
5use 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    /// 匿名注册
28    /// 对应 /register/anonimous
29    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}