use openssl::hash::{MessageDigest, hash};
use reqwest::Method;
use serde_json::{Value, json};
use crate::request::{request, CRYPTO_WEAPI, USER_AGENT_PC, CACHE_PATH, CACHE_CSRF_TOKEN_KEY, CACHE_TOKEN_KEY};
pub async fn login_by_token(csrf_token: &str, token: &str) -> Result<Value, Box<dyn std::error::Error>> {
cacache::write(CACHE_PATH, CACHE_TOKEN_KEY, token).await?;
cacache::write(CACHE_PATH, CACHE_CSRF_TOKEN_KEY, csrf_token).await?;
let url = "https://music.163.com/weapi/w/nuser/account/get";
let data = json!({});
let option = json!({
"crypto": CRYPTO_WEAPI,
"ua": USER_AGENT_PC,
"cookie": {
}
});
request(Method::POST, url, data, option).await
}
pub async fn login_by_email(email: &str, password:&str) -> Result<Value, Box<dyn std::error::Error>> {
let url = "https://music.163.com/weapi/login";
let password_md5 = hex::encode(hash(MessageDigest::md5(), password.as_bytes()).unwrap());
let data = json!({
"username": email,
"password": password_md5,
"rememberLogin": true,
});
let option = json!({
"crypto": CRYPTO_WEAPI,
"ua": USER_AGENT_PC,
"cookie": {
"appver": "2.9.7",
"os": USER_AGENT_PC
}
});
request(Method::POST, url, data, option).await
}
pub async fn get_login_status() ->Result<Value, Box<dyn std::error::Error>> {
let url = "https://music.163.com/weapi/w/nuser/account/get";
let data = json!({});
let option = json!({
"crypto": CRYPTO_WEAPI,
"ua": USER_AGENT_PC,
"cookie": {
}
});
request(Method::POST, url, data, option).await
}
pub async fn refresh_login_status() ->Result<Value, Box<dyn std::error::Error>> {
let url = "https://music.163.com/weapi/login/token/refresh";
let data = json!({});
let option = json!({
"crypto": CRYPTO_WEAPI,
"ua": USER_AGENT_PC,
"cookie": {
"appver": "2.9.7",
"os": USER_AGENT_PC
}
});
request(Method::POST, url, data, option).await
}
pub async fn logout() ->Result<Value, Box<dyn std::error::Error>> {
let url = "https://music.163.com/weapi/logout";
let data = json!({});
let option = json!({
"crypto": CRYPTO_WEAPI,
"ua": USER_AGENT_PC,
"cookie": {
"appver": "2.9.7",
"os": USER_AGENT_PC
}
});
request(Method::POST, url, data, option).await
}