diff --git a/app/src/main/java/com/github/catvod/ali/API.java b/app/src/main/java/com/github/catvod/ali/API.java index 3f73272e..d96bc00c 100644 --- a/app/src/main/java/com/github/catvod/ali/API.java +++ b/app/src/main/java/com/github/catvod/ali/API.java @@ -6,7 +6,6 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.SystemClock; import android.text.TextUtils; -import android.util.Log; import android.view.Gravity; import android.widget.FrameLayout; import android.widget.ImageView; @@ -14,9 +13,11 @@ import android.widget.ImageView; import com.github.catvod.BuildConfig; import com.github.catvod.bean.Sub; import com.github.catvod.bean.Vod; -import com.github.catvod.bean.ali.Auth; +import com.github.catvod.bean.ali.Code; import com.github.catvod.bean.ali.Data; import com.github.catvod.bean.ali.Item; +import com.github.catvod.bean.ali.OAuth; +import com.github.catvod.bean.ali.User; import com.github.catvod.crawler.SpiderDebug; import com.github.catvod.net.OkHttp; import com.github.catvod.spider.Init; @@ -30,15 +31,12 @@ import org.json.JSONArray; import org.json.JSONObject; import java.io.ByteArrayInputStream; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; -import java.util.Locale; import java.util.Map; -import java.util.TimeZone; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -48,9 +46,11 @@ public class API { private final Map quality; private ScheduledExecutorService service; private AlertDialog dialog; + private String refreshToken; private String shareToken; - private final Auth auth; private String shareId; + private OAuth oauth; + private User user; private static class Loader { static volatile API INSTANCE = new API(); @@ -61,7 +61,8 @@ public class API { } private API() { - auth = Auth.objectFrom(Prefers.getString("aliyundrive")); + oauth = OAuth.objectFrom(Prefers.getString("aliyundrive_oauth")); + user = User.objectFrom(Prefers.getString("aliyundrive_user")); quality = new HashMap<>(); quality.put("4K", "UHD"); quality.put("2k", "QHD"); @@ -72,20 +73,13 @@ public class API { } public void setRefreshToken(String token) { - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.getDefault()); - sdf.setTimeZone(TimeZone.getTimeZone("GMT")); - long expireTime = sdf.parse(auth.getExpireTime()).getTime(); - boolean expired = expireTime < System.currentTimeMillis(); - if (expired) auth.setRefreshToken(token); - } catch (Exception e) { - auth.setRefreshToken(token); - } + this.refreshToken = token; } public void setShareId(String shareId) { this.shareId = shareId; refreshShareToken(); + checkAccessToken(); } public HashMap getHeader() { @@ -97,15 +91,14 @@ public class API { private HashMap getHeaderAuth() { HashMap headers = getHeader(); - headers.put("authorization", auth.getAccessToken()); - headers.put("x-canary", "client=web,app=share,version=v2.3.1"); + headers.put("authorization", user.getAuthorization()); headers.put("x-share-token", shareToken); return headers; } private HashMap getHeaderOpen() { HashMap headers = getHeader(); - headers.put("authorization", auth.getAccessTokenOpen()); + headers.put("authorization", oauth.getAuthorization()); return headers; } @@ -114,14 +107,9 @@ public class API { return OkHttp.postJson(url, body.toString(), getHeader()); } - private String auth(String url, JSONObject body, boolean retry) { - return auth(url, body.toString(), retry); - } - private String auth(String url, String json, boolean retry) { url = url.startsWith("https") ? url : "https://api.aliyundrive.com/" + url; String result = OkHttp.postJson(url, json, getHeaderAuth()); - Log.e("auth", result); if (retry && checkAuth(result)) return auth(url, json, false); return result; } @@ -129,7 +117,6 @@ public class API { private String oauth(String url, String json, boolean retry) { url = url.startsWith("https") ? url : "https://open.aliyundrive.com/adrive/v1.0/" + url; String result = OkHttp.postJson(url, json, getHeaderOpen()); - Log.e("oauth", result); if (retry && checkOpen(result)) return oauth(url, json, false); return result; } @@ -148,7 +135,7 @@ public class API { private boolean checkQuotaExhausted(String result) { if (!result.contains("QuotaExhausted")) return false; Init.show("容量不夠拉。"); - auth.setRefreshToken(""); + user.clean().save(); refreshAccessToken(); return false; } @@ -160,44 +147,46 @@ public class API { } public void checkAccessToken() { - if (auth.getAccessToken().isEmpty()) refreshAccessToken(); + if (user.getAccessToken().isEmpty()) refreshAccessToken(); } private boolean refreshAccessToken() { try { SpiderDebug.log("refreshAccessToken..."); JSONObject body = new JSONObject(); - String token = auth.getRefreshToken(); + String token = user.getRefreshToken(); + if (token.isEmpty()) token = refreshToken; if (token.startsWith("http")) token = OkHttp.string(token); body.put("refresh_token", token); body.put("grant_type", "refresh_token"); - JSONObject object = new JSONObject(post("https://auth.aliyundrive.com/v2/account/token", body)); - Log.e("DDD", object.toString()); - auth.setUserId(object.getString("user_id")); - auth.setDriveId(object.getString("default_drive_id")); - auth.setRefreshToken(object.getString("refresh_token")); - auth.setAccessToken(object.getString("token_type") + " " + object.getString("access_token")); - oauthRequest(); + String result = post("https://auth.aliyundrive.com/v2/account/token", body); + user = User.objectFrom(result).save(); + if (user.getAccessToken().isEmpty()) throw new Exception(result); + if (oauth.getRefreshToken().isEmpty()) oauthRequest(); return true; } catch (Exception e) { + user.clean().save(); SpiderDebug.log(e); stopService(); - auth.clean(); getQRCode(); return true; } finally { - while (auth.isEmpty()) SystemClock.sleep(250); + while (user.getAccessToken().isEmpty()) SystemClock.sleep(250); } } - private void oauthRequest() throws Exception { - SpiderDebug.log("OAuth Request..."); - JSONObject body = new JSONObject(); - body.put("authorize", 1); - body.put("scope", "user:base,file:all:read,file:all:write"); - JSONObject object = new JSONObject(auth("https://open.aliyundrive.com/oauth/users/authorize?client_id=" + BuildConfig.CLIENT_ID + "&redirect_uri=https://alist.nn.ci/tool/aliyundrive/callback&scope=user:base,file:all:read,file:all:write&state=", body, false)); - Log.e("DDD", object.toString()); - oauthRedirect(object.getString("redirectUri").split("code=")[1]); + private void oauthRequest() { + try { + SpiderDebug.log("OAuth Request..."); + JSONObject body = new JSONObject(); + body.put("authorize", 1); + body.put("scope", "user:base,file:all:read,file:all:write"); + String url = "https://open.aliyundrive.com/oauth/users/authorize?client_id=" + BuildConfig.CLIENT_ID + "&redirect_uri=https://alist.nn.ci/tool/aliyundrive/callback&scope=user:base,file:all:read,file:all:write&state="; + String result = auth(url, body.toString(), true); + oauthRedirect(Code.objectFrom(result).getCode()); + } catch (Exception e) { + SpiderDebug.log(e); + } } private void oauthRedirect(String code) { @@ -207,12 +196,8 @@ public class API { body.put("code", code); body.put("grant_type", "authorization_code"); String result = post("https://api.nn.ci/alist/ali_open/code", body); - Log.e("DDD", result); if (checkManyRequest(result)) return; - JSONObject object = new JSONObject(result); - auth.setRefreshTokenOpen(object.getString("refresh_token")); - auth.setAccessTokenOpen(object.optString("token_type") + " " + object.optString("access_token")); - auth.save(); + oauth = OAuth.objectFrom(result).save(); } catch (Exception e) { SpiderDebug.log(e); } @@ -220,17 +205,13 @@ public class API { private boolean refreshOpenToken() { try { - SpiderDebug.log("refreshAccessTokenOpen..."); + SpiderDebug.log("refreshOpenToken..."); JSONObject body = new JSONObject(); body.put("grant_type", "refresh_token"); - body.put("refresh_token", auth.getRefreshTokenOpen()); + body.put("refresh_token", oauth.getRefreshToken()); String result = post("https://api.nn.ci/alist/ali_open/token", body); - Log.e("DDD", result); if (checkManyRequest(result)) return false; - JSONObject object = new JSONObject(result); - auth.setRefreshTokenOpen(object.optString("refresh_token")); - auth.setAccessTokenOpen(object.optString("token_type") + " " + object.optString("access_token")); - auth.save(); + oauth = OAuth.objectFrom(result).save(); return true; } catch (Exception e) { SpiderDebug.log(e); @@ -291,7 +272,7 @@ public class API { body.put("order_by", "name"); body.put("order_direction", "ASC"); if (marker.length() > 0) body.put("marker", marker); - Item item = Item.objectFrom(auth("adrive/v3/file/list", body, true)); + Item item = Item.objectFrom(auth("adrive/v3/file/list", body.toString(), true)); for (Item file : item.getItems()) { if (file.getType().equals("folder")) { folders.add(file); @@ -355,7 +336,7 @@ public class API { tempId = copy(fileId); JSONObject body = new JSONObject(); body.put("file_id", tempId); - body.put("drive_id", auth.getDriveId()); + body.put("drive_id", user.getDriveId()); return new JSONObject(oauth("openFile/getDownloadUrl", body.toString(), true)).getString("url"); } catch (Exception e) { e.printStackTrace(); @@ -371,7 +352,7 @@ public class API { tempId = copy(fileId); JSONObject body = new JSONObject(); body.put("file_id", tempId); - body.put("drive_id", auth.getDriveId()); + body.put("drive_id", user.getDriveId()); body.put("category", "live_transcoding"); body.put("url_expire_sec", "14400"); String json = oauth("openFile/getVideoPreviewPlayInfo", body.toString(), true); @@ -396,17 +377,19 @@ public class API { } private String copy(String fileId) throws Exception { + SpiderDebug.log("Copy..." + fileId); String json = "{\"requests\":[{\"body\":{\"file_id\":\"%s\",\"share_id\":\"%s\",\"auto_rename\":true,\"to_parent_file_id\":\"root\",\"to_drive_id\":\"%s\"},\"headers\":{\"Content-Type\":\"application/json\"},\"id\":\"0\",\"method\":\"POST\",\"url\":\"/file/copy\"}],\"resource\":\"file\"}"; - json = String.format(json, fileId, shareId, auth.getDriveId()); + json = String.format(json, fileId, shareId, user.getDriveId()); String result = auth("adrive/v2/batch", json, true); return new JSONObject(result).getJSONArray("responses").getJSONObject(0).getJSONObject("body").getString("file_id"); } private void delete(String fileId) { try { + SpiderDebug.log("Delete..." + fileId); JSONObject body = new JSONObject(); body.put("file_id", fileId); - body.put("drive_id", auth.getDriveId()); + body.put("drive_id", user.getDriveId()); oauth("openFile/delete", body.toString(), true); } catch (Exception e) { e.printStackTrace(); @@ -455,7 +438,7 @@ public class API { private void setToken(String value) { Init.show("請重新進入播放頁"); - auth.setRefreshToken(value); + this.refreshToken = value; refreshAccessToken(); stopService(); } diff --git a/app/src/main/java/com/github/catvod/bean/ali/Auth.java b/app/src/main/java/com/github/catvod/bean/ali/Auth.java deleted file mode 100644 index d9a7f19b..00000000 --- a/app/src/main/java/com/github/catvod/bean/ali/Auth.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.github.catvod.bean.ali; - -import android.text.TextUtils; - -import com.github.catvod.utils.Prefers; -import com.google.gson.Gson; -import com.google.gson.annotations.SerializedName; - -public class Auth { - - @SerializedName("refreshToken") - private String refreshToken; - @SerializedName("refreshTokenOpen") - private String refreshTokenOpen; - @SerializedName("accessToken") - private String accessToken; - @SerializedName("accessTokenOpen") - private String accessTokenOpen; - @SerializedName("userId") - private String userId; - @SerializedName("driveId") - private String driveId; - @SerializedName("expire_time") - private String expireTime; - - public static Auth objectFrom(String str) { - Auth item = new Gson().fromJson(str, Auth.class); - return item == null ? new Auth() : item; - } - - public String getRefreshToken() { - return TextUtils.isEmpty(refreshToken) ? "" : refreshToken; - } - - public void setRefreshToken(String refreshToken) { - this.refreshToken = refreshToken; - } - - public String getRefreshTokenOpen() { - return TextUtils.isEmpty(refreshTokenOpen) ? "" : refreshTokenOpen; - } - - public void setRefreshTokenOpen(String refreshTokenOpen) { - this.refreshTokenOpen = refreshTokenOpen; - } - - public String getAccessToken() { - return TextUtils.isEmpty(accessToken) ? "" : accessToken; - } - - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - public String getAccessTokenOpen() { - return TextUtils.isEmpty(accessTokenOpen) ? "" : accessTokenOpen; - } - - public void setAccessTokenOpen(String accessTokenOpen) { - this.accessTokenOpen = accessTokenOpen; - } - - public String getDriveId() { - return TextUtils.isEmpty(driveId) ? "" : driveId; - } - - public void setDriveId(String driveId) { - this.driveId = driveId; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public String getExpireTime() { - return TextUtils.isEmpty(expireTime) ? "" : expireTime; - } - - public void setExpireTime(String expireTime) { - this.expireTime = expireTime; - } - - public boolean isEmpty() { - return getAccessToken().isEmpty(); - } - - public void clean() { - setRefreshToken(""); - setAccessToken(""); - setExpireTime(""); - save(); - } - - public void save() { - Prefers.put("aliyundrive", new Gson().toJson(this)); - } -} diff --git a/app/src/main/java/com/github/catvod/bean/ali/Code.java b/app/src/main/java/com/github/catvod/bean/ali/Code.java new file mode 100644 index 00000000..a0c0cc28 --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/ali/Code.java @@ -0,0 +1,24 @@ +package com.github.catvod.bean.ali; + +import android.text.TextUtils; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +public class Code { + + @SerializedName("redirectUri") + private String redirectUri; + + public static Code objectFrom(String str) { + return new Gson().fromJson(str, Code.class); + } + + public String getRedirectUri() { + return TextUtils.isEmpty(redirectUri) ? "" : redirectUri; + } + + public String getCode() { + return getRedirectUri().split("code=")[1]; + } +} diff --git a/app/src/main/java/com/github/catvod/bean/ali/OAuth.java b/app/src/main/java/com/github/catvod/bean/ali/OAuth.java new file mode 100644 index 00000000..901728ed --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/ali/OAuth.java @@ -0,0 +1,43 @@ +package com.github.catvod.bean.ali; + +import android.text.TextUtils; + +import com.github.catvod.utils.Prefers; +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +public class OAuth { + + @SerializedName("token_type") + private String tokenType; + @SerializedName("access_token") + private String accessToken; + @SerializedName("refresh_token") + private String refreshToken; + + public static OAuth objectFrom(String str) { + OAuth item = new Gson().fromJson(str, OAuth.class); + return item == null ? new OAuth() : item; + } + + public String getTokenType() { + return TextUtils.isEmpty(tokenType) ? "" : tokenType; + } + + public String getAccessToken() { + return TextUtils.isEmpty(accessToken) ? "" : accessToken; + } + + public String getRefreshToken() { + return TextUtils.isEmpty(refreshToken) ? "" : refreshToken; + } + + public String getAuthorization() { + return getTokenType() + " " + getAccessToken(); + } + + public OAuth save() { + Prefers.put("aliyundrive_oauth", new Gson().toJson(this)); + return this; + } +} diff --git a/app/src/main/java/com/github/catvod/bean/ali/User.java b/app/src/main/java/com/github/catvod/bean/ali/User.java new file mode 100644 index 00000000..1e6e935b --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/ali/User.java @@ -0,0 +1,61 @@ +package com.github.catvod.bean.ali; + +import android.text.TextUtils; + +import com.github.catvod.utils.Prefers; +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +public class User { + + @SerializedName("default_drive_id") + private String driveId; + @SerializedName("user_id") + private String userId; + @SerializedName("token_type") + private String tokenType; + @SerializedName("access_token") + private String accessToken; + @SerializedName("refresh_token") + private String refreshToken; + + public static User objectFrom(String str) { + User item = new Gson().fromJson(str, User.class); + return item == null ? new User() : item; + } + + public String getDriveId() { + return TextUtils.isEmpty(driveId) ? "" : driveId; + } + + public String getUserId() { + return TextUtils.isEmpty(userId) ? "" : userId; + } + + public String getTokenType() { + return TextUtils.isEmpty(tokenType) ? "" : tokenType; + } + + public String getAccessToken() { + return TextUtils.isEmpty(accessToken) ? "" : accessToken; + } + + public String getRefreshToken() { + return TextUtils.isEmpty(refreshToken) ? "" : refreshToken; + } + + public String getAuthorization() { + return getTokenType() + " " + getAccessToken(); + } + + public User clean() { + this.refreshToken = ""; + this.accessToken = ""; + return this; + } + + public User save() { + Prefers.put("aliyundrive_user", new Gson().toJson(this)); + return this; + } +} 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 3d18cd43..11781bd0 100644 --- a/app/src/main/java/com/github/catvod/spider/Ali.java +++ b/app/src/main/java/com/github/catvod/spider/Ali.java @@ -36,7 +36,6 @@ public class Ali extends Spider { @Override public String playerContent(String flag, String id, List vipFlags) { - API.get().checkAccessToken(); String[] ids = id.split("\\+"); String url = flag.equals("原畫") ? API.get().getDownloadUrl(ids[0]) : API.get().getPreviewUrl(ids[0], flag); return Result.get().url(url).subs(API.get().getSub(ids)).header(API.get().getHeader()).parse(0).string(); diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 76655a90..f5b4ccd3 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 fa47b68e..a22c5a2e 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -9dad9b968f26436fc4e681d0dc372d55 +b43f60b1459104200b5f30007df2b306