From a8c391a20c0b493b9cb122e57aef22cdc63f5332 Mon Sep 17 00:00:00 2001 From: lushunming <1357197829@qq.com> Date: Fri, 30 Aug 2024 20:49:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=B8=E5=85=8B=E7=9B=98=20=EF=BC=8Cproxy=20?= =?UTF-8?q?debug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/github/catvod/api/QuarkApi.java | 178 +++++++++++++++++- 1 file changed, 174 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/github/catvod/api/QuarkApi.java b/app/src/main/java/com/github/catvod/api/QuarkApi.java index 68ddd967..4eab348c 100644 --- a/app/src/main/java/com/github/catvod/api/QuarkApi.java +++ b/app/src/main/java/com/github/catvod/api/QuarkApi.java @@ -1,20 +1,32 @@ package com.github.catvod.api; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.SystemClock; import android.text.TextUtils; +import android.view.Gravity; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageView; import com.github.catvod.bean.Result; import com.github.catvod.bean.Vod; import com.github.catvod.bean.ali.Cache; +import com.github.catvod.bean.ali.Data; +import com.github.catvod.bean.ali.User; import com.github.catvod.bean.quark.Item; import com.github.catvod.bean.quark.ShareData; +import com.github.catvod.crawler.SpiderDebug; import com.github.catvod.net.OkHttp; import com.github.catvod.net.OkResult; import com.github.catvod.spider.Init; -import com.github.catvod.utils.Json; -import com.github.catvod.utils.Path; -import com.github.catvod.utils.ProxyVideo; -import com.github.catvod.utils.Util; +import com.github.catvod.utils.*; +import com.google.gson.JsonObject; import org.apache.commons.lang3.StringUtils; import java.io.File; @@ -25,6 +37,10 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -40,6 +56,8 @@ public class QuarkApi { private String saveDirName = "TV"; private boolean isVip = false; private final Cache cache; + private ScheduledExecutorService service; + private AlertDialog dialog; private static class Loader { static volatile QuarkApi INSTANCE = new QuarkApi(); @@ -149,6 +167,9 @@ public class QuarkApi { } else { okResult = OkHttp.post(this.apiUrl + url, Json.toJson(data), getHeaders()); } + if (leftRetry > 0 && okResult.getCode() == 401 && refreshAccessToken()) + return api(url, params, data, leftRetry - 1, method); + if (leftRetry > 0 && okResult.getCode() == 429) return api(url, params, data, leftRetry - 1, method); if (okResult.getResp().get("Set-Cookie") != null) { @@ -168,6 +189,58 @@ public class QuarkApi { return okResult.getBody(); } + private boolean refreshAccessToken() { + try { + SpiderDebug.log("refreshCookie..."); + JsonObject param = new JsonObject(); + String token = cache.getUser().getRefreshToken(); + if (token.isEmpty()) token = cookie; + + cache.setUser(User.objectFrom(json)); + + return true; + } catch (Exception e) { + cache.getUser().clean(); + e.printStackTrace(); + stopService(); + startFlow(); + return true; + } finally { + while (cache.getUser().getAccessToken().isEmpty()) SystemClock.sleep(250); + } + } + + /** + * 获取二维码登录的令牌 + * + * @return 返回包含二维码登录令牌的字符串 + */ + private String getTokenForQrcodeLogin() { + String res = OkHttp.post("https://api.quark.cn/v2/user/getTokenForQrcodeLogin", new HashMap<>()); + Map>> json = new HashMap<>(); + json = Json.parseSafe(res, json.getClass()); + if (json.get("message").equals("ok")) { + return json.get("data").get("members").get("token"); + } + return ""; + } + + + /** + * 获取二维码内容 + *

+ * 此方法用于生成二维码的URL内容该URL用于二维码登录,包含了登录所需的token和客户端信息 + * + * @return 返回包含token的二维码URL字符串 + */ + private String getQrCodeContent() { + // 获取用于二维码登录的token + String token = getTokenForQrcodeLogin(); + // 组装二维码URL,包含token和客户端标识 + return "https://su.quark.cn/4_eMHBJ?uc_param_str=&token=" + token + "&client_id=532&uc_biz_str=S%3Acustom%7COPT%3ASAREA%400%7COPT%3AIMMERSIVE%401%7COPT%3ABACK_BTN_STYLE%400"; + } + + public ShareData getShareData(String url) { Pattern pattern = Pattern.compile("https://pan\\.quark\\.cn/s/([^\\\\|#/]+)"); Matcher matcher = pattern.matcher(url); @@ -391,6 +464,103 @@ public class QuarkApi { } } + private void startFlow() { + Init.run(this::showInput); + } + + private void showInput() { + try { + int margin = ResUtil.dp2px(16); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + FrameLayout frame = new FrameLayout(Init.context()); + params.setMargins(margin, margin, margin, margin); + EditText input = new EditText(Init.context()); + frame.addView(input, params); + dialog = new AlertDialog.Builder(Init.getActivity()).setTitle("请输入cookie").setView(frame).setNeutralButton("QRCode", (dialog, which) -> onNeutral()).setNegativeButton(android.R.string.cancel, null).setPositiveButton(android.R.string.ok, (dialog, which) -> onPositive(input.getText().toString())).show(); + } catch (Exception ignored) { + } + } + + private void onNeutral() { + dismiss(); + Init.execute(this::getQRCode); + } + + private void onPositive(String text) { + dismiss(); + Init.execute(() -> { + if (text.startsWith("http")) setToken(OkHttp.string(text)); + else setToken(text); + }); + } + + private void getQRCode() { + String content = getQrCodeContent(); + Init.run(() -> openApp(content)); + } + + private void openApp(String json) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setClassName("com.alicloud.databox", "com.taobao.login4android.scan.QrScanActivity"); + intent.putExtra("key_scanParam", json); + Init.getActivity().startActivity(intent); + } catch (Exception e) { + showQRCode(json); + } finally { + Init.execute(() -> startService(new HashMap<>())); + } + } + + private void showQRCode(String content) { + try { + int size = ResUtil.dp2px(240); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(size, size); + ImageView image = new ImageView(Init.context()); + image.setScaleType(ImageView.ScaleType.CENTER_CROP); + image.setImageBitmap(QRCode.getBitmap(content, size, 2)); + FrameLayout frame = new FrameLayout(Init.context()); + params.gravity = Gravity.CENTER; + frame.addView(image, params); + dialog = new AlertDialog.Builder(Init.getActivity()).setView(frame).setOnCancelListener(this::dismiss).setOnDismissListener(this::dismiss).show(); + dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + Notify.show("请使用夸克网盘App扫描二维码"); + } catch (Exception ignored) { + } + } + + private void startService(Map params) { + service = Executors.newScheduledThreadPool(1); + service.scheduleWithFixedDelay(() -> { + String result = OkHttp.post("https://passport.aliyundrive.com/newlogin/qrcode/query.do?appName=aliyun_drive&fromSite=52&_bx-v=2.2.3", params); + Data data = Data.objectFrom(result).getContent().getData(); + if (data.hasToken()) setToken(data.getToken()); + }, 1, 1, TimeUnit.SECONDS); + } + + private void setToken(String value) { + cache.getUser().setRefreshToken(value); + SpiderDebug.log("Token:" + value); + Notify.show("Token:" + value); + refreshAccessToken(); + stopService(); + } + + private void stopService() { + if (service != null) service.shutdownNow(); + Init.run(this::dismiss); + } + + private void dismiss(DialogInterface dialog) { + stopService(); + } + + private void dismiss() { + try { + if (dialog != null) dialog.dismiss(); + } catch (Exception ignored) { + } + } }