recycleactor commited on
Commit
70909b9
·
verified ·
1 Parent(s): 7cfd555

Upload main.rs

Browse files
Files changed (1) hide show
  1. 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 ud = match gw_light_call(&client, &jar, "deezer.getUserData", "null", json!({})).await {
1113
- Ok(v) => v,
1114
- Err(e) => return json_error(StatusCode::BAD_GATEWAY, e),
1115
- };
1116
-
1117
- let token = ud["checkForm"].as_str().unwrap_or("").to_string();
1118
- if token.is_empty() {
1119
- return json_error(StatusCode::BAD_GATEWAY, "no checkForm");
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 mut arl: String = String::new();
1144
- if let Ok(v) = gw_light_call(&client, &jar, "user.getArl", &token, json!({})).await {
1145
- arl = v.as_str().unwrap_or("").to_string();
1146
- }
1147
 
1148
- let mut access_token_out: Option<String> = None;
1149
- if let Ok(access_token) = oauth_access_token(&client, &email, &pass).await {
1150
- access_token_out = Some(access_token);
 
 
 
 
1151
  }
1152
 
1153
- (StatusCode::OK, Json(json!({ "arl": arl, "token": token, "uid": uid, "access_token": access_token_out }))).into_response()
 
 
 
 
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 mut access_token: Option<String> = None;
1396
- let mut uid: Option<String> = None;
1397
- let mut arl_out: Option<String> = None;
1398
- let mut gw_token: Option<String> = None;
 
 
 
 
 
 
1399
 
1400
- let ud = match gw_light_call(&client, &jar, "deezer.getUserData", "null", json!({})).await {
1401
- Ok(v) => v,
1402
  Err(e) => {
1403
  let mut map = state.pair.write().await;
1404
  if let Some(s) = map.get_mut(&code) {
1405
- s.error = Some(format!("gw:getUserData:{e}"));
1406
  }
1407
- return Html(format!("<h3>Ошибка входа</h3><pre>{}</pre>", htmlesc(&format!("gw:getUserData:{e}"))))
1408
- .into_response();
1409
  }
1410
  };
1411
 
1412
- let token = ud["checkForm"].as_str().unwrap_or("").to_string();
1413
- if token.is_empty() {
1414
- let msg = "gw:no_checkForm";
1415
- let mut map = state.pair.write().await;
1416
- if let Some(s) = map.get_mut(&code) {
1417
- s.error = Some(msg.to_string());
 
 
1418
  }
1419
- return Html(format!("<h3>Ошибка входа</h3><pre>{}</pre>", htmlesc(msg))).into_response();
1420
- }
1421
- gw_token = Some(token.clone());
1422
- uid = ud["USER"]["USER_ID"]
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(format!("gw:checkCredentials:{e}"));
1443
  }
1444
- return Html(format!("<h3>Ошибка входа</h3><pre>{}</pre>", htmlesc(&format!("gw:checkCredentials:{e}"))))
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 = gw_token;
1465
- s.user_id = uid;
1466
  s.email = Some(email);
1467
- s.arl = arl_out;
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 сервер автоматически не вытащил (из‑за блокировки/ошибок gw-light на хостинге).</p>\
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}\">\