Spaces:
Paused
Paused
Upload main.rs
Browse files- src/main.rs +60 -94
src/main.rs
CHANGED
|
@@ -1109,48 +1109,36 @@ async fn login(Json(req): Json<LoginReq>) -> impl IntoResponse {
|
|
| 1109 |
.build()
|
| 1110 |
.unwrap();
|
| 1111 |
|
| 1112 |
-
let
|
| 1113 |
-
|
| 1114 |
-
|
| 1115 |
-
|
| 1116 |
-
|
| 1117 |
-
|
| 1118 |
-
|
| 1119 |
-
|
| 1120 |
-
|
| 1121 |
-
|
| 1122 |
-
let uid = ud["USER"]["USER_ID"]
|
| 1123 |
-
.as_i64()
|
| 1124 |
-
.map(|n| n.to_string())
|
| 1125 |
-
.unwrap_or_default();
|
| 1126 |
-
|
| 1127 |
-
if let Err(e) = gw_light_call(
|
| 1128 |
-
&client,
|
| 1129 |
-
&jar,
|
| 1130 |
-
"user.checkCredentials",
|
| 1131 |
-
&token,
|
| 1132 |
-
json!({
|
| 1133 |
-
"login": email,
|
| 1134 |
-
"password": pass,
|
| 1135 |
-
"checkFormLogin": token
|
| 1136 |
-
}),
|
| 1137 |
-
)
|
| 1138 |
-
.await
|
| 1139 |
-
{
|
| 1140 |
-
return json_error(StatusCode::UNAUTHORIZED, e);
|
| 1141 |
-
}
|
| 1142 |
|
| 1143 |
-
let
|
| 1144 |
-
|
| 1145 |
-
|
| 1146 |
-
}
|
| 1147 |
|
| 1148 |
-
let
|
| 1149 |
-
|
| 1150 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1151 |
}
|
| 1152 |
|
| 1153 |
-
(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1154 |
}
|
| 1155 |
|
| 1156 |
#[derive(Clone)]
|
|
@@ -1392,79 +1380,57 @@ async fn pair_complete(State(state): State<AppState>, Form(f): Form<PairComplete
|
|
| 1392 |
.unwrap();
|
| 1393 |
|
| 1394 |
let pass_md5 = format!("{:x}", md5::compute(password.as_bytes()));
|
| 1395 |
-
let
|
| 1396 |
-
|
| 1397 |
-
|
| 1398 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1399 |
|
| 1400 |
-
let
|
| 1401 |
-
Ok(
|
| 1402 |
Err(e) => {
|
| 1403 |
let mut map = state.pair.write().await;
|
| 1404 |
if let Some(s) = map.get_mut(&code) {
|
| 1405 |
-
s.error = Some(
|
| 1406 |
}
|
| 1407 |
-
return Html(format!("<h3>Ошибка входа</h3><pre>{}</pre>", htmlesc(&
|
| 1408 |
-
.into_response();
|
| 1409 |
}
|
| 1410 |
};
|
| 1411 |
|
| 1412 |
-
let
|
| 1413 |
-
|
| 1414 |
-
|
| 1415 |
-
|
| 1416 |
-
|
| 1417 |
-
|
|
|
|
|
|
|
| 1418 |
}
|
| 1419 |
-
|
| 1420 |
-
|
| 1421 |
-
|
| 1422 |
-
|
| 1423 |
-
.as_i64()
|
| 1424 |
-
.map(|n| n.to_string())
|
| 1425 |
-
.filter(|s| !s.trim().is_empty());
|
| 1426 |
-
|
| 1427 |
-
if let Err(e) = gw_light_call(
|
| 1428 |
-
&client,
|
| 1429 |
-
&jar,
|
| 1430 |
-
"user.checkCredentials",
|
| 1431 |
-
&token,
|
| 1432 |
-
json!({
|
| 1433 |
-
"login": email,
|
| 1434 |
-
"password": pass_md5,
|
| 1435 |
-
"checkFormLogin": token
|
| 1436 |
-
}),
|
| 1437 |
-
)
|
| 1438 |
-
.await
|
| 1439 |
-
{
|
| 1440 |
let mut map = state.pair.write().await;
|
| 1441 |
if let Some(s) = map.get_mut(&code) {
|
| 1442 |
-
s.error = Some(
|
| 1443 |
}
|
| 1444 |
-
return Html(format!("<h3>Ошибка входа</h3><pre>{}</pre>", htmlesc(&
|
| 1445 |
-
.into_response();
|
| 1446 |
-
}
|
| 1447 |
-
|
| 1448 |
-
if let Ok(v) = gw_light_call(&client, &jar, "user.getArl", &token, json!({})).await {
|
| 1449 |
-
if let Some(s) = v.as_str() {
|
| 1450 |
-
if s.len() > 20 {
|
| 1451 |
-
arl_out = Some(s.to_string());
|
| 1452 |
-
}
|
| 1453 |
-
}
|
| 1454 |
-
}
|
| 1455 |
-
|
| 1456 |
-
if let Ok(t) = oauth_access_token(&client, &email, &pass_md5).await {
|
| 1457 |
-
access_token = Some(t);
|
| 1458 |
}
|
|
|
|
| 1459 |
|
| 1460 |
{
|
| 1461 |
let mut map = state.pair.write().await;
|
| 1462 |
if let Some(s) = map.get_mut(&code) {
|
| 1463 |
-
s.access_token = access_token;
|
| 1464 |
-
s.token =
|
| 1465 |
-
s.user_id = uid;
|
| 1466 |
s.email = Some(email);
|
| 1467 |
-
s.arl =
|
| 1468 |
s.error = None;
|
| 1469 |
}
|
| 1470 |
}
|
|
@@ -1479,7 +1445,7 @@ async fn pair_complete(State(state): State<AppState>, Form(f): Form<PairComplete
|
|
| 1479 |
let safe_code = htmlesc(&code);
|
| 1480 |
Html(format!(
|
| 1481 |
"<h3>Вход выполнен</h3>\
|
| 1482 |
-
<p>Токен получен, но ARL сервер автоматически не вытащил (из‑за блокировки/ошибок
|
| 1483 |
<p>Чтобы включить полные треки, вставь ARL (с телефона):</p>\
|
| 1484 |
<form method=\"POST\" action=\"/pair/arl\">\
|
| 1485 |
<input type=\"hidden\" name=\"code\" value=\"{safe_code}\">\
|
|
|
|
| 1109 |
.build()
|
| 1110 |
.unwrap();
|
| 1111 |
|
| 1112 |
+
let _ = client
|
| 1113 |
+
.get("https://www.deezer.com/")
|
| 1114 |
+
.header(ACCEPT, "*/*")
|
| 1115 |
+
.header("Accept-Language", "en-US,en;q=0.9")
|
| 1116 |
+
.header(
|
| 1117 |
+
"User-Agent",
|
| 1118 |
+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
|
| 1119 |
+
)
|
| 1120 |
+
.send()
|
| 1121 |
+
.await;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1122 |
|
| 1123 |
+
let access_token = match oauth_access_token(&client, &email, &pass).await {
|
| 1124 |
+
Ok(t) => t,
|
| 1125 |
+
Err(e) => return json_error(StatusCode::UNAUTHORIZED, e),
|
| 1126 |
+
};
|
| 1127 |
|
| 1128 |
+
let me = match api_deezer_get(&client, "/user/me", &access_token, &[]).await {
|
| 1129 |
+
Ok(v) => v,
|
| 1130 |
+
Err(e) => return json_error(StatusCode::SERVICE_UNAVAILABLE, e),
|
| 1131 |
+
};
|
| 1132 |
+
let uid = me.get("id").and_then(|x| x.as_i64()).unwrap_or(0);
|
| 1133 |
+
if uid <= 0 {
|
| 1134 |
+
return json_error(StatusCode::SERVICE_UNAVAILABLE, "api:no_user_id");
|
| 1135 |
}
|
| 1136 |
|
| 1137 |
+
(
|
| 1138 |
+
StatusCode::OK,
|
| 1139 |
+
Json(json!({ "arl": "", "token": null, "uid": uid.to_string(), "access_token": access_token })),
|
| 1140 |
+
)
|
| 1141 |
+
.into_response()
|
| 1142 |
}
|
| 1143 |
|
| 1144 |
#[derive(Clone)]
|
|
|
|
| 1380 |
.unwrap();
|
| 1381 |
|
| 1382 |
let pass_md5 = format!("{:x}", md5::compute(password.as_bytes()));
|
| 1383 |
+
let _ = client
|
| 1384 |
+
.get("https://www.deezer.com/")
|
| 1385 |
+
.header(ACCEPT, "*/*")
|
| 1386 |
+
.header("Accept-Language", "en-US,en;q=0.9")
|
| 1387 |
+
.header(
|
| 1388 |
+
"User-Agent",
|
| 1389 |
+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
|
| 1390 |
+
)
|
| 1391 |
+
.send()
|
| 1392 |
+
.await;
|
| 1393 |
|
| 1394 |
+
let access_token = match oauth_access_token(&client, &email, &pass_md5).await {
|
| 1395 |
+
Ok(t) => t,
|
| 1396 |
Err(e) => {
|
| 1397 |
let mut map = state.pair.write().await;
|
| 1398 |
if let Some(s) = map.get_mut(&code) {
|
| 1399 |
+
s.error = Some(e.clone());
|
| 1400 |
}
|
| 1401 |
+
return Html(format!("<h3>Ошибка входа</h3><pre>{}</pre>", htmlesc(&e))).into_response();
|
|
|
|
| 1402 |
}
|
| 1403 |
};
|
| 1404 |
|
| 1405 |
+
let me = match api_deezer_get(&client, "/user/me", &access_token, &[]).await {
|
| 1406 |
+
Ok(v) => v,
|
| 1407 |
+
Err(e) => {
|
| 1408 |
+
let mut map = state.pair.write().await;
|
| 1409 |
+
if let Some(s) = map.get_mut(&code) {
|
| 1410 |
+
s.error = Some(e.clone());
|
| 1411 |
+
}
|
| 1412 |
+
return Html(format!("<h3>Ошибка входа</h3><pre>{}</pre>", htmlesc(&e))).into_response();
|
| 1413 |
}
|
| 1414 |
+
};
|
| 1415 |
+
let uid = me.get("id").and_then(|x| x.as_i64()).unwrap_or(0);
|
| 1416 |
+
if uid <= 0 {
|
| 1417 |
+
let msg = "api:no_user_id".to_string();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1418 |
let mut map = state.pair.write().await;
|
| 1419 |
if let Some(s) = map.get_mut(&code) {
|
| 1420 |
+
s.error = Some(msg.clone());
|
| 1421 |
}
|
| 1422 |
+
return Html(format!("<h3>Ошибка входа</h3><pre>{}</pre>", htmlesc(&msg))).into_response();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1423 |
}
|
| 1424 |
+
let uid = uid.to_string();
|
| 1425 |
|
| 1426 |
{
|
| 1427 |
let mut map = state.pair.write().await;
|
| 1428 |
if let Some(s) = map.get_mut(&code) {
|
| 1429 |
+
s.access_token = Some(access_token);
|
| 1430 |
+
s.token = None;
|
| 1431 |
+
s.user_id = Some(uid);
|
| 1432 |
s.email = Some(email);
|
| 1433 |
+
s.arl = None;
|
| 1434 |
s.error = None;
|
| 1435 |
}
|
| 1436 |
}
|
|
|
|
| 1445 |
let safe_code = htmlesc(&code);
|
| 1446 |
Html(format!(
|
| 1447 |
"<h3>Вход выполнен</h3>\
|
| 1448 |
+
<p>Токен получен, но ARL сервер автоматически не вытащил (из‑за блокировки/ошибок на хостинге).</p>\
|
| 1449 |
<p>Чтобы включить полные треки, вставь ARL (с телефона):</p>\
|
| 1450 |
<form method=\"POST\" action=\"/pair/arl\">\
|
| 1451 |
<input type=\"hidden\" name=\"code\" value=\"{safe_code}\">\
|