diff --git a/app/src/main/java/com/github/catvod/bean/ali/Biz.java b/app/src/main/java/com/github/catvod/bean/ali/Biz.java new file mode 100644 index 00000000..aa9d554f --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/ali/Biz.java @@ -0,0 +1,66 @@ +package com.github.catvod.bean.ali; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class Biz { + + @SerializedName("pds_login_result") + private Biz pdsLoginResult; + @SerializedName("role") + private String role; + @SerializedName("isFirstLogin") + private Boolean isFirstLogin; + @SerializedName("needLink") + private Boolean needLink; + @SerializedName("loginType") + private String loginType; + @SerializedName("nickName") + private String nickName; + @SerializedName("needRpVerify") + private Boolean needRpVerify; + @SerializedName("avatar") + private String avatar; + @SerializedName("accessToken") + private String accessToken; + @SerializedName("userName") + private String userName; + @SerializedName("userId") + private String userId; + @SerializedName("defaultDriveId") + private String defaultDriveId; + @SerializedName("existLink") + private List existLink; + @SerializedName("expiresIn") + private Integer expiresIn; + @SerializedName("expireTime") + private String expireTime; + @SerializedName("requestId") + private String requestId; + @SerializedName("dataPinSetup") + private Boolean dataPinSetup; + @SerializedName("state") + private String state; + @SerializedName("tokenType") + private String tokenType; + @SerializedName("dataPinSaved") + private Boolean dataPinSaved; + @SerializedName("refreshToken") + private String refreshToken; + @SerializedName("status") + private String status; + + public static Biz objectFrom(String str) { + return new Gson().fromJson(str, Biz.class); + } + + public Biz getPdsLoginResult() { + return pdsLoginResult; + } + + public String getRefreshToken() { + return refreshToken; + } +} diff --git a/app/src/main/java/com/github/catvod/bean/ali/Data.java b/app/src/main/java/com/github/catvod/bean/ali/Data.java index a6ad82e8..efb6be71 100644 --- a/app/src/main/java/com/github/catvod/bean/ali/Data.java +++ b/app/src/main/java/com/github/catvod/bean/ali/Data.java @@ -1,24 +1,31 @@ package com.github.catvod.bean.ali; +import android.util.Base64; + import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; public class Data { - @SerializedName(value = "data", alternate = "pds_login_result") + @SerializedName("data") private Data data; + @SerializedName("content") + private Data content; @SerializedName("t") private String t; @SerializedName("ck") private String ck; @SerializedName("codeContent") private String codeContent; - @SerializedName("refreshToken") - private String refreshToken; + @SerializedName("qrCodeStatus") + private String qrCodeStatus; + @SerializedName("bizExt") + private String bizExt; public static Data objectFrom(String str) { try { - return new Gson().fromJson(str, Data.class); + Data data = new Gson().fromJson(str, Data.class); + return data == null ? new Data() : data; } catch (Exception e) { return new Data(); } @@ -28,8 +35,8 @@ public class Data { return data == null ? new Data() : data; } - public boolean hasToken() { - return getData().getRefreshToken().length() > 0; + public Data getContent() { + return content == null ? new Data() : content; } public String getT() { @@ -44,7 +51,23 @@ public class Data { return codeContent == null ? "" : codeContent; } - public String getRefreshToken() { - return refreshToken == null ? "" : refreshToken; + public String getQrCodeStatus() { + return qrCodeStatus == null ? "" : qrCodeStatus; + } + + public String getBizExt() { + return bizExt == null ? "" : bizExt; + } + + public String getToken() { + return Biz.objectFrom(new String(Base64.decode(getBizExt(), Base64.DEFAULT))).getPdsLoginResult().getRefreshToken(); + } + + public boolean hasToken() { + return getQrCodeStatus().equals("CONFIRMED") && getBizExt().length() > 0; + } + + public boolean isExpired() { + return getQrCodeStatus().equals("EXPIRED"); } } diff --git a/app/src/main/java/com/github/catvod/spider/Ali.java b/app/src/main/java/com/github/catvod/spider/Ali.java index 3eefbff9..e4eef1d8 100644 --- a/app/src/main/java/com/github/catvod/spider/Ali.java +++ b/app/src/main/java/com/github/catvod/spider/Ali.java @@ -13,11 +13,10 @@ import com.github.catvod.bean.ali.Auth; import com.github.catvod.bean.ali.Data; import com.github.catvod.bean.ali.Item; import com.github.catvod.net.OkHttp; -import com.github.catvod.utils.Utils; import com.github.catvod.utils.Prefers; import com.github.catvod.utils.QRCode; import com.github.catvod.utils.Trans; -import com.google.gson.JsonObject; +import com.github.catvod.utils.Utils; import org.json.JSONArray; import org.json.JSONObject; @@ -32,6 +31,7 @@ import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -41,7 +41,6 @@ import java.util.regex.Pattern; public class Ali { public static final Pattern pattern = Pattern.compile("www.aliyundrive.com/s/([^/]+)(/folder/([^/]+))?"); - private static final String QRCODE = "https://token.cooluc.com/"; private ScheduledExecutorService service; private final Auth auth; @@ -195,7 +194,7 @@ public class Ali { auth.setRefreshToken(object.getString("refresh_token")); return true; } catch (Exception e) { - checkService(); + stopService(); auth.clean(); getQRCode(); return true; @@ -304,23 +303,32 @@ public class Ali { return result; } - private void checkService() { + private void stopService() { if (service != null) service.shutdownNow(); if (auth.getView() != null) Init.run(() -> Utils.removeView(auth.getView())); } private void getQRCode() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", Utils.CHROME); - Data data = Data.objectFrom(OkHttp.string(QRCODE + "qr", headers)); - if (data != null) Init.run(() -> showCode(data)); + AtomicInteger time = new AtomicInteger(); + Data data = Data.objectFrom(OkHttp.string("https://passport.aliyundrive.com/newlogin/qrcode/generate.do?appName=aliyun_drive&fromSite=52&appName=aliyun_drive&appEntrance=web&isMobile=false&lang=zh_CN&returnUrl=&bizParams=&_bx-v=2.0.3")).getContent().getData(); + Init.run(() -> showCode(data)); service = Executors.newScheduledThreadPool(1); - if (data != null) service.scheduleAtFixedRate(() -> { - JsonObject params = new JsonObject(); - params.addProperty("t", data.getData().getT()); - params.addProperty("ck", data.getData().getCk()); - Data result = Data.objectFrom(OkHttp.postJson(QRCODE + "ck", params.toString(), headers)); - if (result.hasToken()) setToken(result.getData().getRefreshToken()); + service.scheduleAtFixedRate(() -> { + Map params = new HashMap<>(); + params.put("t", data.getT()); + params.put("ck", data.getCk()); + params.put("appName", "aliyun_drive"); + params.put("appEntrance", "web"); + params.put("isMobile", "false"); + params.put("lang", "zh_CN"); + params.put("returnUrl", ""); + params.put("fromSite", "52"); + params.put("bizParams", ""); + params.put("navlanguage", "zh-CN"); + params.put("navPlatform", "MacIntel"); + Data result = Data.objectFrom(OkHttp.post("https://passport.aliyundrive.com/newlogin/qrcode/query.do?appName=aliyun_drive&fromSite=52&_bx-v=2.0.31", params)).getContent().getData(); + if (result.hasToken()) setToken(result.getToken()); + if (time.incrementAndGet() > 29) stopService(); }, 1, 1, TimeUnit.SECONDS); } @@ -328,14 +336,14 @@ public class Ali { Prefers.put("token", value); Init.show("請重新進入播放頁"); auth.setRefreshToken(value); - checkService(); + stopService(); } private void showCode(Data data) { FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER; - Utils.addView(create(data.getData().getCodeContent()), params); - //Init.show("請使用阿里雲盤 App 掃描二維碼"); + Utils.addView(create(data.getCodeContent()), params); + Init.show("請使用阿里雲盤 App 掃描二維碼"); } private ImageView create(String value) { diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 216ea0c1..ec6bf026 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index 7a3b9604..8065ce92 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -82faef05c014eb6446663824eb77535e +ff85cd0428496acedc5c8a4599583862