From 73a02dded9e5d82e3f47864c3fa601ee21eb9586 Mon Sep 17 00:00:00 2001 From: "pansong291@sina.com" Date: Fri, 26 Jul 2019 18:30:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=9A=82=E8=9A=81=E5=BA=84?= =?UTF-8?q?=E5=9B=AD=E5=A4=9A=E9=A1=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../xposed/quickenergy/AntFarm.java | 516 ++++++++++++++++++ ...CollectEnergyUtils.java => AntForest.java} | 86 +-- .../xposed/quickenergy/ClassMember.java | 18 + .../pansong291/xposed/quickenergy/Config.java | 26 +- .../xposed/quickenergy/FileUtils.java | 2 +- .../pansong291/xposed/quickenergy/Log.java | 8 +- .../xposed/quickenergy/RpcCall.java | 51 ++ .../xposed/quickenergy/XposedHook.java | 46 +- 9 files changed, 653 insertions(+), 104 deletions(-) create mode 100644 app/src/main/java/pansong291/xposed/quickenergy/AntFarm.java rename app/src/main/java/pansong291/xposed/quickenergy/{AliMobileAutoCollectEnergyUtils.java => AntForest.java} (74%) create mode 100644 app/src/main/java/pansong291/xposed/quickenergy/ClassMember.java create mode 100644 app/src/main/java/pansong291/xposed/quickenergy/RpcCall.java diff --git a/app/build.gradle b/app/build.gradle index 1754df5..5714995 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "pansong291.xposed.quickenergy" minSdkVersion 14 targetSdkVersion 21 - versionCode 20190715 - versionName "1.0.6" + versionCode 20190726 + versionName "1.0.7-alpha.1" } buildTypes { release { diff --git a/app/src/main/java/pansong291/xposed/quickenergy/AntFarm.java b/app/src/main/java/pansong291/xposed/quickenergy/AntFarm.java new file mode 100644 index 0000000..ea1c1e4 --- /dev/null +++ b/app/src/main/java/pansong291/xposed/quickenergy/AntFarm.java @@ -0,0 +1,516 @@ +package pansong291.xposed.quickenergy; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import java.util.List; +import java.util.ArrayList; + +public class AntFarm +{ + private static final String TAG = AntFarm.class.getCanonicalName(); + private static String cityAdCode; + private static String districtAdCode; + private static String version; + private static String ownerFarmId; + private static String ownerAnimalId; + private static int foodStock; + private static int foodStockLimit; + public enum AnimalBuff + { ACCELERATING, INJURED, NONE }; + private static String animalBuff; + public enum AnimalFeedStatus + { HUNGRY, EATING }; + private static String animalFeedStatus; + public enum AnimalInteractStatus + { HOME, GOTOSTEAL, STEALING }; + private static String animalInteractStatus; + public enum TaskStatus + { TODO, FINISHED, RECEIVED }; + public enum ToolType + { STEALTOOL, ACCELERATETOOL, SHARETOOL, FENCETOOL, NEWEGGTOOL }; + private static int pageStartSum = 0; + private static List firendIdList = new ArrayList<>(); + + public static void start(ClassLoader loader, String args0, String args1, String response) + { + if(isEnterFarmAndHasNull(args0)) + try + { + JSONArray ja = new JSONArray(args1); + JSONObject jo = ja.getJSONObject(0); + cityAdCode = jo.optString("cityAdCode"); + districtAdCode = jo.optString("districtAdCode"); + version = jo.optString("version"); + }catch(JSONException e) + { + Log.i(TAG, "start err: "+e.getMessage()+", args1="+args1); + } + + if(isEnterOwnerFarm(response)) + { + try + { + JSONObject jo = new JSONObject(response); + JSONObject joFarmVO = jo.optJSONObject("farmVO"); + foodStock = joFarmVO.optInt("foodStock"); + foodStockLimit = joFarmVO.optInt("foodStockLimit"); + joFarmVO.optDouble("harvestBenevolenceScore"); + JSONObject joSubFarmVO = joFarmVO.optJSONObject("subFarmVO"); + ownerFarmId = joSubFarmVO.optString("farmId"); + JSONArray jaAnimals = joSubFarmVO.optJSONArray("animals"); + String goToStealFarmId = ""; + for(int i = 0; i < jaAnimals.length(); i++) + { + jo = jaAnimals.optJSONObject(i); + String animalId = jo.optString("animalId"); + String currentFarmId = jo.optString("currentFarmId"); + String masterFarmId = jo.optString("masterFarmId"); + JSONObject joAnimalStatusVO = jo.optJSONObject("animalStatusVO"); + if(joAnimalStatusVO + .optString("animalInteractStatus").equals(AnimalInteractStatus.STEALING.name())) + { + // 赶鸡 + sendBackAnimal(loader, animalId, currentFarmId, masterFarmId); + } + + if(masterFarmId.equals(ownerFarmId)) + { + // 自己的鸡 + animalBuff = jo.optString("animalBuff"); + animalFeedStatus = joAnimalStatusVO + .optString("animalFeedStatus"); + animalInteractStatus = joAnimalStatusVO + .optString("animalInteractStatus"); + ownerAnimalId = animalId; + goToStealFarmId = currentFarmId; + } + } + if(animalInteractStatus.equals(AnimalInteractStatus.GOTOSTEAL.name())) + { + //if(animalFeedStatus.equals(AnimalFeedStatus.HUNGRY.name())) + recallAnimal(loader,ownerAnimalId,goToStealFarmId,ownerFarmId); + } + + if(animalFeedStatus.equals(AnimalFeedStatus.HUNGRY.name())) + { + if(foodStock < 180) + { + // 答题或领取饲料 + answerQuestion(loader); + receiveFarmTaskAward(loader); + } + // 喂鸡 + feedAnimal(loader, ownerFarmId); + } + + if(!animalBuff.equals(AnimalBuff.ACCELERATING.name())) + { + // 加速卡 + useAccelerateTool(loader); + } + }catch(Exception e) + { + Log.i(TAG, "start err: "+e.getMessage()); + } + + + } + + } + + private static boolean isEnterFarmAndHasNull(String args0) + { + return cityAdCode == null || districtAdCode == null + || version == null && args0.equals("com.alipay.antfarm.enterFarm"); + } + + private static boolean isEnterOwnerFarm(String resp) + { + return resp.contains("\"relation\":\"OWNER\""); + } + + private static void recallAnimal(ClassLoader loader, String animalId, String currentFarmId, String masterFarmId) + { + try + { + Object o = rpcCall_RecallAnimal(loader, animalId, currentFarmId, masterFarmId); + String s = RpcCall.getResponse(o); + JSONObject jo = new JSONObject(s); + double foodHaveStolen = jo.optDouble("foodHaveStolen"); + Log.showDialogAndRecordLog("唤回小鸡,并偷吃了"+Config.getNameById(farmId2UserId(currentFarmId))+"["+foodHaveStolen+"克]饲料",""); + }catch(Exception e) + { + Log.i(TAG, "recallAnimal err: "+e.getMessage()); + } + } + + private static void sendBackAnimal(ClassLoader loader, String animalId, String currentFarmId, String masterFarmId) + { + try + { + Object o = rpcCall_SendBackAnimal(loader, animalId, currentFarmId, masterFarmId); + String s = RpcCall.getResponse(o); + JSONObject jo = new JSONObject(s); + if(jo.has("hitLossFood")) + { + s = "胖揍了"+Config.getNameById(farmId2UserId(masterFarmId))+"的小鸡,掉落["+jo.optInt("hitLossFood")+"克]饲料"; + foodStock += jo.optInt("saveFoodNum"); + if(foodStock > foodStockLimit) foodStock = foodStockLimit; + }else + s = Config.getNameById(farmId2UserId(masterFarmId))+"的小鸡在手底下溜走了"; + Log.showDialogAndRecordLog(s,""); + }catch(Exception e) + { + Log.i(TAG, "sendBackAnimal err: "+e.getMessage()); + } + } + + private static void answerQuestion(ClassLoader loader) + { + try + { + Object o = rpcCall_ListFarmTask(loader); + String s = RpcCall.getResponse(o); + JSONObject jo = new JSONObject(s); + JSONArray jaFarmTaskList = jo.optJSONArray("farmTaskList"); + for(int i = 0; i < jaFarmTaskList.length(); i++) + { + jo = jaFarmTaskList.optJSONObject(i); + if(jo.optString("title").equals("庄园小课堂")&& + jo.optString("taskStatus").equals(TaskStatus.TODO.name())) + { + o = rpcCall_getAnswerInfo(loader); + s = RpcCall.getResponse(o); + jo = new JSONObject(s); + jo = jo.optJSONArray("answerInfoVOs").optJSONObject(0); + Log.showDialogAndRecordLog(jo.optString("questionContent"),""); + Log.showDialogAndRecordLog(jo.optString("rightReply"),""); + int answer = jo.optInt("answerNum"); + String questionId = jo.optString("questionId"); + o = rpcCall_AnswerQuestion(loader, questionId, answer); + s = RpcCall.getResponse(o); + jo = new JSONObject(s); + s = jo.optBoolean("rightAnswer")? "正确":"错误"; + Log.showDialogAndRecordLog("答题"+s+",可领取["+jo.optInt("awardCount",0)+"克]饲料", ""); + break; + } + } + }catch(Exception e) + { + Log.i(TAG, "answerQuestion err: "+e.getMessage()); + } + } + + private static void receiveFarmTaskAward(ClassLoader loader) + { + try + { + Object o = rpcCall_ListFarmTask(loader); + String s = RpcCall.getResponse(o); + JSONObject jo = new JSONObject(s); + JSONArray jaFarmTaskList = jo.optJSONArray("farmTaskList"); + for(int i = 0; i < jaFarmTaskList.length(); i++) + { + jo = jaFarmTaskList.optJSONObject(i); + if(jo.optString("taskStatus").equals(TaskStatus.FINISHED.name())) + { + if(jo.optInt("awardCount") + foodStock > foodStockLimit) + { + Log.showDialogAndRecordLog("领取饲料后将超过上限,已终止领取饲料",""); + break; + } + o = rpcCall_ReceiveFarmTaskAward(loader, jo.optString("taskId")); + s = RpcCall.getResponse(o); + jo = new JSONObject(s); + foodStock = jo.optInt("foodStock"); + Log.showDialogAndRecordLog("已领取["+jo.optInt("haveAddFoodStock")+"克]饲料",""); + } + } + }catch(Exception e) + { + Log.i(TAG, "receiveFarmTaskAward err: "+e.getMessage()); + } + } + + private static void feedAnimal(ClassLoader loader, String farmId) + { + try + { + Object o = rpcCall_FeedAnimal(loader, farmId); + String s = RpcCall.getResponse(o); + JSONObject jo = new JSONObject(s); + int feedFood = foodStock - jo.optInt("foodStock"); + foodStock -= feedFood; + Log.showDialogAndRecordLog("喂了小鸡["+feedFood+"克]饲料",""); + }catch(Exception e) + { + Log.i(TAG, "feedAnimal err: "+e.getMessage()); + } + } + + private static void useAccelerateTool(ClassLoader loader) + { + try + { + Object o = rpcCall_ListFarmTool(loader); + String s = RpcCall.getResponse(o); + JSONObject jo = new JSONObject(s); + JSONArray jaToolList = jo.optJSONArray("toolList"); + for(int i = 0; i < jaToolList.length(); i++) + { + jo = jaToolList.optJSONObject(i); + if(jo.optString("toolType").equals(ToolType.ACCELERATETOOL.name())) + { + if(jo.optInt("toolCount") > 0) + { + o = rpcCall_UseFarmTool(loader, ownerFarmId, jo.optString("toolId"), ToolType.ACCELERATETOOL.name()); + s = RpcCall.getResponse(o); + if(s.contains("\"memo\":\"SUCCESS\"")) + Log.showDialogAndRecordLog("加速卡使用成功",""); + }else + { + Log.showDialogAndRecordLog("没有加速卡可用",""); + } + break; + } + } + }catch(Exception e) + { + Log.i(TAG, "useAccelerateCard err: "+e.getMessage()); + } + } + + private static void helpFriend() + { + + } + + private static void notifyFriend() + { + + } + + private static void feedFriendAnimal() + { + + } + + private static Object rpcCall_RecallAnimal(ClassLoader loader, String animalId, String currentFarmId, String masterFarmId) + { + /* + com.alipay.antfarm.recallAnimal + [{\"animalId\":\"20181101172642012088022401920420\",\"currentFarmId\":\"10170908084649012088422804385848\",\"masterFarmId\":\"10181101172642012088022401920420\", + \"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"version\":\"1.0.1907111732.11\"}] + */ + try + { + String args1 = "[{\"animalId\":\""+animalId+"\",\"currentFarmId\":\"" + +currentFarmId+"\",\"masterFarmId\":\""+masterFarmId+ + "\",\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"version\":\"" + +version+"\"}]"; + return RpcCall.invoke(loader, "com.alipay.antfarm.recallAnimal", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_RecallAnimal err: "+e.getMessage()); + } + return null; + } + + private static Object rpcCall_SendBackAnimal(ClassLoader loader, String animalId, String currentFarmId, String masterFarmId) + { + /* + [ + { + "animalId":"20171230000402012088922385376474", + "currentFarmId":"10181101172642012088022401920420", + "masterFarmId":"10171230000402012088922385376474", + "requestType":"NORMAL", + "sceneCode":"ANTFARM", + "sendType":"HIT", + "source":"H5", + "version":"1.0.1907111732.11" + } + ] + */ + try + { + String args1 = "[{\"animalId\":\""+animalId+"\",\"currentFarmId\":\"" + +currentFarmId+"\",\"masterFarmId\":\""+masterFarmId+ + "\",\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"sendType\":\"HIT\",\"source\":\"H5\",\"version\":\"" + +version+"\"}]"; + return RpcCall.invoke(loader, "com.alipay.antfarm.sendBackAnimal", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_SendBackAnimal err: "+e.getMessage()); + } + return null; + } + + private static Object rpcCall_ListFarmTask(ClassLoader loader) + { + try + { + String args1 = "[{\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"version\":\"" + +version+"\"}]"; + return RpcCall.invoke(loader, "com.alipay.antfarm.listFarmTask", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_ListFarmTask err: "+e.getMessage()); + } + return null; + } + + private static Object rpcCall_getAnswerInfo(ClassLoader loader) + { + /* + [{"answerSource":"foodTask","requestType":"NORMAL","sceneCode":"ANTFARM","source":"H5","version":"1.0.1907111732.11"}] + */ + try + { + String args1 = "[{\"answerSource\":\"foodTask\",\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"version\":\"" + +version+"\"}]"; + + return RpcCall.invoke(loader, "com.alipay.antfarm.getAnswerInfo", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_getAnswerInfo err: "+e.getMessage()); + } + return null; + } + + private static Object rpcCall_AnswerQuestion(ClassLoader loader, String quesId, int answer) + { + /* + [{"answers":"[{\"questionId\":\"farm0369\",\"answers\":[1]}]","bizkey":"ANSWER","requestType":"NORMAL","sceneCode":"ANTFARM","source":"H5","version":"1.0.1907111732.11"}] + */ + try + { + String args1 = "[{\"answers\":\"[{\\\"questionId\\\":\\\""+quesId+"\\\",\\\"answers\\\":["+answer+ + "]}]\",\"bizkey\":\"ANSWER\",\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"version\":\"" + +version+"\"}]"; + + return RpcCall.invoke(loader, "com.alipay.antfarm.doFarmTask", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_AnswerQuestion err: "+e.getMessage()); + } + return null; + } + + private static Object rpcCall_ReceiveFarmTaskAward(ClassLoader loader, String taskId) + { + try + { + String args1 = "[{\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"taskId\":\"" + +taskId+"\",\"version\":\""+version+"\"}]"; + return RpcCall.invoke(loader, "com.alipay.antfarm.listFarmTool", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_ReceiveFarmTaskAward err: "+e.getMessage()); + } + return null; + } + + private static Object rpcCall_FeedAnimal(ClassLoader loader, String farmId) + { + try + { + String args1 = "[{\"animalType\":\"CHICK\",\"canMock\":true,\"farmId\":\""+farmId+ + "\",\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"version\":\"" + +version+"\"}]"; + return RpcCall.invoke(loader, "com.alipay.antfarm.feedAnimal", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_FeedAnimal err: "+e.getMessage()); + } + return null; + } + + private static Object rpcCall_ListFarmTool(ClassLoader loader) + { + try + { + String args1 = "[{\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"version\":\"" + +version+"\"}]"; + return RpcCall.invoke(loader, "com.alipay.antfarm.listFarmTool", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_ListFarmTool err: "+e.getMessage()); + } + return null; + } + + private static Object rpcCall_UseFarmTool(ClassLoader loader, String targetFarmId, String toolId, String toolType) + { + /* + [{"requestType":"NORMAL","sceneCode":"ANTFARM","source":"H5","targetFarmId":"10181101172642012088022401920420","toolId":"501562732868401ACCELERATETOOL2088022401920420","toolType":"ACCELERATETOOL","version":"1.0.1907111732.11"}] + */ + try + { + String args1 = "[{\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"targetFarmId\":\"" + +targetFarmId+"\",\"toolId\":\""+toolId+"\",\"toolType\":\""+toolType+"\",\"version\":\""+version+"\"}]"; + return RpcCall.invoke(loader, "com.alipay.antfarm.useFarmTool", args1); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_UseFarmTool err: "+e.getMessage()); + } + return null; + } + + private static void rpcCall_RankingList(ClassLoader loader) + { + /* + [{"pageSize":20,"requestType":"NORMAL","sceneCode":"ANTFARM","source":"H5","startNum":0,"version":"1.0.1907111732.11"}] + */ + try + { + String args1 = "[{\"pageSize\":20,\"requestType\":\"NORMAL\",\"sceneCode\":\"ANTFARM\",\"source\":\"H5\",\"startNum\":" + +pageStartSum+",\"version\":\""+version+"\"}]"; + pageStartSum += 20; + + RpcCall.invoke(loader, "com.alipay.antfarm.rankingList", args1); + + }catch(Exception e) + { + Log.i(TAG, "rpcCall_RankingList err: "+e.getMessage()); + } + } + + private static boolean parseFrienRankPageDataResponse(String resp) + { + boolean hasNext = false; + try + { + JSONObject jo = new JSONObject(resp); + hasNext = jo.optBoolean("hasNext"); + JSONArray jaRankingList = jo.optJSONArray("rankingList"); + if(jaRankingList == null) + return true; + for(int i = 0; i < jaRankingList.length(); i++) + { + jo = jaRankingList.optJSONObject(i); + String userId = jo.optString("userId"); + boolean b = jo.optBoolean("stealingAnimal") || jo.has("actionType") && + jo.optString("actionType").equals("starve_action"); + if(b && !firendIdList.contains(userId)) + { + firendIdList.add(userId); + } + } + if(jaRankingList.length() == 0) + return false; + }catch(Exception e) + { + Log.i(TAG, "parseFrienRankPageDataResponse err: " + e.getMessage()); + } + return hasNext; + } + + private static String farmId2UserId(String farmId) + { + int l = farmId.length() / 2; + return farmId.substring(l); + } + +} diff --git a/app/src/main/java/pansong291/xposed/quickenergy/AliMobileAutoCollectEnergyUtils.java b/app/src/main/java/pansong291/xposed/quickenergy/AntForest.java similarity index 74% rename from app/src/main/java/pansong291/xposed/quickenergy/AliMobileAutoCollectEnergyUtils.java rename to app/src/main/java/pansong291/xposed/quickenergy/AntForest.java index e786761..374c381 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/AliMobileAutoCollectEnergyUtils.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/AntForest.java @@ -8,18 +8,13 @@ import org.json.JSONArray; import org.json.JSONObject; -public class AliMobileAutoCollectEnergyUtils +public class AntForest { - - private static String TAG = AliMobileAutoCollectEnergyUtils.class.getCanonicalName(); + private static final String TAG = AntForest.class.getCanonicalName(); private static ArrayList friendsRankUseridList = new ArrayList(); - private static boolean isWebViewRefresh; private static Integer collectedEnergy = 0; private static Integer helpCollectedEnergy = 0; private static Integer pageCount = 0; - private static Object curH5PageImpl; - public static Object curH5Fragment; - public static Activity h5Activity; /** @@ -30,13 +25,6 @@ public class AliMobileAutoCollectEnergyUtils */ public static void autoGetCanCollectUserIdList(final ClassLoader loader, String response) { - /** - if (isWebViewRefresh) - { - // 如果已经刷新了,这里又回来response了,就表示这里是我们刷新webview结束来到的逻辑 - finishWork(); - return; - }/**/ // 开始解析好友信息,循环把所有有能量的好友信息都解析完 boolean hasMore = parseFrienRankPageDataResponse(response); if (hasMore) @@ -145,25 +133,6 @@ public static boolean isUserDetail(String response) return !TextUtils.isEmpty(response) && response.contains("userEnergy"); } - /** - * 刷新页面 - */ - private static void refreshWebView() - { - Log.i(TAG, "一共收取了" + collectedEnergy + "g能量"); - isWebViewRefresh = true; - } - - /** - * 结束工作 - */ - private static void finishWork() - { - isWebViewRefresh = false; - // 打印收取了多少能量 - Log.i(TAG, "一共收取了" + collectedEnergy + "g能量"); - } - /** * 解析好友信息 * @@ -209,7 +178,6 @@ private static void rpcCall_FriendRankList(final ClassLoader loader) { try { - Method rpcCallMethod = getRpcCallMethod(loader); JSONArray jsonArray = new JSONArray(); JSONObject json = new JSONObject(); json.put("av", "5"); @@ -220,8 +188,7 @@ private static void rpcCall_FriendRankList(final ClassLoader loader) jsonArray.put(json); Log.i(TAG, "call friendranklist params:" + jsonArray); - rpcCallMethod.invoke(null, "alipay.antmember.forest.h5.queryEnergyRanking", jsonArray.toString(), - "", true, null, null, false, curH5PageImpl, 0, "", false, -1); + RpcCall.invoke(loader, "alipay.antmember.forest.h5.queryEnergyRanking", jsonArray.toString()); } catch (Exception e) { @@ -239,7 +206,6 @@ private static void rpcCall_CanCollectEnergy(final ClassLoader loader, String us { try { - Method rpcCallMethod = getRpcCallMethod(loader); JSONArray jsonArray = new JSONArray(); JSONObject json = new JSONObject(); json.put("av", "5"); @@ -250,11 +216,9 @@ private static void rpcCall_CanCollectEnergy(final ClassLoader loader, String us jsonArray.put(json); Log.i(TAG, "call cancollect energy params:" + jsonArray); - rpcCallMethod.invoke(null, "alipay.antmember.forest.h5.queryNextAction", jsonArray.toString(), - "", true, null, null, false, curH5PageImpl, 0, "", false, -1); + RpcCall.invoke(loader, "alipay.antmember.forest.h5.queryNextAction", jsonArray.toString()); - rpcCallMethod.invoke(null, "alipay.antmember.forest.h5.pageQueryDynamics", jsonArray.toString(), - "", true, null, null, false, curH5PageImpl, 0, "", false, -1); + RpcCall.invoke(loader, "alipay.antmember.forest.h5.pageQueryDynamics", jsonArray.toString()); } catch (Exception e) { @@ -273,7 +237,6 @@ private static void rpcCall_CollectEnergy(final ClassLoader loader, String userI { try { - Method rpcCallMethod = getRpcCallMethod(loader); JSONArray jsonArray = new JSONArray(); JSONArray bubbleAry = new JSONArray(); bubbleAry.put(bubbleId); @@ -285,9 +248,8 @@ private static void rpcCall_CollectEnergy(final ClassLoader loader, String userI jsonArray.put(json); Log.i(TAG, "call collect energy params:" + jsonArray); - Object resp = rpcCallMethod.invoke(null, "alipay.antmember.forest.h5.collectEnergy", jsonArray.toString(), - "", true, null, null, false, curH5PageImpl, 0, "", false, -1); - String response = (String)resp.getClass().getMethod("getResponse").invoke(resp); + Object resp = RpcCall.invoke(loader, "alipay.antmember.forest.h5.collectEnergy", jsonArray.toString()); + String response = RpcCall.getResponse(resp); int collect = parseCollectEnergyResponse(response, false); if(collect > 0) { @@ -313,7 +275,6 @@ private static void rpcCall_ForFriendCollectEnergy(ClassLoader loader, String ta { try { - Method rpcCallMethod = getRpcCallMethod(loader); JSONArray jsonArray = new JSONArray(); JSONArray bubbleAry = new JSONArray(); bubbleAry.put(bubbleId); @@ -322,9 +283,8 @@ private static void rpcCall_ForFriendCollectEnergy(ClassLoader loader, String ta json.put("targetUserId", targetUserId); jsonArray.put(json); Log.i(TAG, "call help collect energy params:" + jsonArray); - Object resp = rpcCallMethod.invoke(null, "alipay.antmember.forest.h5.forFriendCollectEnergy", jsonArray.toString(), - "", true, null, null, false, curH5PageImpl, 0, "", false, -1); - String response = (String)resp.getClass().getMethod("getResponse").invoke(resp); + Object resp = RpcCall.invoke(loader, "alipay.antmember.forest.h5.forFriendCollectEnergy", jsonArray.toString()); + String response = RpcCall.getResponse(resp); int helped = parseCollectEnergyResponse(response, true); if (helped > 0) { @@ -340,34 +300,6 @@ private static void rpcCall_ForFriendCollectEnergy(ClassLoader loader, String ta } - private static Method getRpcCallMethod(ClassLoader loader) - { - try - { - Field aF = curH5Fragment.getClass().getDeclaredField("a"); - aF.setAccessible(true); - Object viewHolder = aF.get(curH5Fragment); - Field hF = viewHolder.getClass().getDeclaredField("h"); - hF.setAccessible(true); - curH5PageImpl = hF.get(viewHolder); - Class h5PageClazz = loader.loadClass("com.alipay.mobile.h5container.api.H5Page"); - Class jsonClazz = loader.loadClass("com.alibaba.fastjson.JSONObject"); - Class rpcClazz = loader.loadClass("com.alipay.mobile.nebulaappproxy.api.rpc.H5RpcUtil"); - if (curH5PageImpl != null) - { - Method callM = rpcClazz.getMethod("rpcCall", String.class, String.class, String.class, - boolean.class, jsonClazz, String.class, boolean.class, h5PageClazz, - int.class, String.class, boolean.class, int.class); - return callM; - - } - } catch (Exception e) - { - Log.i(TAG, "getRpcCallMethod err: " + e.getMessage()); - } - return null; - } - private static int parseCollectEnergyResponse(String response, boolean isForFriend) { if(!TextUtils.isEmpty(response) && response.contains("failedBubbleIds")) diff --git a/app/src/main/java/pansong291/xposed/quickenergy/ClassMember.java b/app/src/main/java/pansong291/xposed/quickenergy/ClassMember.java new file mode 100644 index 0000000..dc48f61 --- /dev/null +++ b/app/src/main/java/pansong291/xposed/quickenergy/ClassMember.java @@ -0,0 +1,18 @@ +package pansong291.xposed.quickenergy; + +public class ClassMember +{ + public static final String + com_eg_android_AlipayGphone = "com.eg.android.AlipayGphone", + a = "a", h = "h", + com_alipay_mobile_h5container_api_H5Page = "com.alipay.mobile.h5container.api.H5Page", + com_alibaba_fastjson_JSONObject = "com.alibaba.fastjson.JSONObject", + com_alipay_mobile_nebulaappproxy_api_rpc_H5RpcUtil = "com.alipay.mobile.nebulaappproxy.api.rpc.H5RpcUtil", + rpcCall = "rpcCall", + com_alipay_mobile_nebulacore_ui_H5FragmentManager = "com.alipay.mobile.nebulacore.ui.H5FragmentManager", + com_alipay_mobile_nebulacore_ui_H5Fragment = "com.alipay.mobile.nebulacore.ui.H5Fragment", + pushFragment = "pushFragment", + com_alipay_mobile_nebulacore_ui_H5Activity = "com.alipay.mobile.nebulacore.ui.H5Activity", + onResume = "onResume", + getResponse = "getResponse"; +} diff --git a/app/src/main/java/pansong291/xposed/quickenergy/Config.java b/app/src/main/java/pansong291/xposed/quickenergy/Config.java index f0e327e..f36d3eb 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/Config.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/Config.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; public class Config { @@ -11,7 +12,7 @@ public enum ShowMode dialog, toast } - public static final String TAG = Config.class.getCanonicalName(); + private static final String TAG = Config.class.getCanonicalName(); public boolean defInit; public boolean helpFriend; public ShowMode showMode; @@ -22,6 +23,7 @@ public enum ShowMode private static Config config; private static Map idMap; private static boolean hasIdMapChanged = false; + private static String selfId; public static boolean helpFriend() { @@ -78,6 +80,28 @@ public static boolean saveIdMap() return hasIdMapChanged; } + public static String getSelfId() + { + if(selfId == null) + { + Set idSet = getIdMap().entrySet(); + for(Map.Entry entry: idSet) + if(!entry.getValue().toString().contains("*")) + { + selfId = entry.getKey().toString(); + break; + } + } + return selfId; + } + + public static String getNameById(String id) + { + if(getIdMap().containsKey(id)) + return getIdMap().get(id).toString(); + return id; + } + private static Map getIdMap() { if(idMap == null) diff --git a/app/src/main/java/pansong291/xposed/quickenergy/FileUtils.java b/app/src/main/java/pansong291/xposed/quickenergy/FileUtils.java index 0120910..4dcfb4a 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/FileUtils.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/FileUtils.java @@ -15,7 +15,7 @@ public class FileUtils { - public static final String TAG = FileUtils.class.getCanonicalName(); + private static final String TAG = FileUtils.class.getCanonicalName(); private static File directory; private static File configFile; private static File friendIdMapFile; diff --git a/app/src/main/java/pansong291/xposed/quickenergy/Log.java b/app/src/main/java/pansong291/xposed/quickenergy/Log.java index 9872a96..2ae17a2 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/Log.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/Log.java @@ -9,7 +9,7 @@ public class Log { - private static String TAG = Log.class.getCanonicalName(); + private static final String TAG = Log.class.getCanonicalName(); private static AlertDialog dlg; private static StringBuffer sb; /* @@ -48,7 +48,7 @@ public static void showToast(final String str, String str2) if(Config.showMode() != Config.ShowMode.toast) return; Log.i(TAG, str + str2); - final Activity activity = AliMobileAutoCollectEnergyUtils.h5Activity; + final Activity activity = RpcCall.h5Activity; if(activity != null) { try @@ -80,7 +80,7 @@ public static void showDialog(final String str, String str2) if(Config.showMode() != Config.ShowMode.dialog) return; Log.i(TAG, str + str2); - Activity activity = AliMobileAutoCollectEnergyUtils.h5Activity; + Activity activity = RpcCall.h5Activity; if(activity != null) { try @@ -116,7 +116,7 @@ public void run() private static AlertDialog createNewDialog() { - Activity activity = AliMobileAutoCollectEnergyUtils.h5Activity; + Activity activity = RpcCall.h5Activity; return new AlertDialog.Builder(activity) .setTitle("XQuickEnergy") .setMessage("") diff --git a/app/src/main/java/pansong291/xposed/quickenergy/RpcCall.java b/app/src/main/java/pansong291/xposed/quickenergy/RpcCall.java new file mode 100644 index 0000000..79be4da --- /dev/null +++ b/app/src/main/java/pansong291/xposed/quickenergy/RpcCall.java @@ -0,0 +1,51 @@ +package pansong291.xposed.quickenergy; + +import android.app.Activity; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class RpcCall +{ + private static final String TAG = RpcCall.class.getCanonicalName(); + private static Method rpcCallMethod; + private static Method getResponseMethod; + public static Object curH5Fragment; + private static Object curH5PageImpl; + public static Activity h5Activity; + + public static Object invoke(ClassLoader loader, String args0, String args1) throws Exception + { + if(rpcCallMethod == null) + try + { + Field aF = curH5Fragment.getClass().getDeclaredField(ClassMember.a); + aF.setAccessible(true); + Object viewHolder = aF.get(curH5Fragment); + Field hF = viewHolder.getClass().getDeclaredField(ClassMember.h); + hF.setAccessible(true); + curH5PageImpl = hF.get(viewHolder); + Class h5PageClazz = loader.loadClass(ClassMember.com_alipay_mobile_h5container_api_H5Page); + Class jsonClazz = loader.loadClass(ClassMember.com_alibaba_fastjson_JSONObject); + Class rpcClazz = loader.loadClass(ClassMember.com_alipay_mobile_nebulaappproxy_api_rpc_H5RpcUtil); + if(curH5PageImpl != null) + { + rpcCallMethod = rpcClazz.getMethod(ClassMember.rpcCall, String.class, String.class, String.class, + boolean.class, jsonClazz, String.class, boolean.class, h5PageClazz, + int.class, String.class, boolean.class, int.class); + } + }catch(Exception e) + { + Log.i(TAG, "get RpcCallMethod err: " + e.getMessage()); + } + return rpcCallMethod.invoke(null, args0, args1, + "", true, null, null, false, curH5PageImpl, 0, "", false, -1); + } + + public static String getResponse(Object resp) throws Exception + { + if(getResponseMethod == null) + getResponseMethod = resp.getClass().getMethod(ClassMember.getResponse); + return (String) getResponseMethod.invoke(resp); + } + +} diff --git a/app/src/main/java/pansong291/xposed/quickenergy/XposedHook.java b/app/src/main/java/pansong291/xposed/quickenergy/XposedHook.java index 6f0abc0..021c6cd 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/XposedHook.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/XposedHook.java @@ -14,12 +14,12 @@ public class XposedHook implements IXposedHookLoadPackage { - private static String TAG = XposedHook.class.getCanonicalName(); + private static final String TAG = XposedHook.class.getCanonicalName(); @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { - if("com.eg.android.AlipayGphone".equals(lpparam.packageName)) + if(ClassMember.com_eg_android_AlipayGphone.equals(lpparam.packageName)) { Log.i(TAG, lpparam.packageName); //hookSecurity(lpparam); @@ -60,20 +60,20 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable private void hookRpcCall(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { final ClassLoader loader = lpparam.classLoader; - Class clazz = loader.loadClass("com.alipay.mobile.nebulacore.ui.H5FragmentManager"); + Class clazz = loader.loadClass(ClassMember.com_alipay_mobile_nebulacore_ui_H5FragmentManager); if(clazz != null) { - Class h5FragmentClazz = loader.loadClass("com.alipay.mobile.nebulacore.ui.H5Fragment"); + Class h5FragmentClazz = loader.loadClass(ClassMember.com_alipay_mobile_nebulacore_ui_H5Fragment); if(h5FragmentClazz != null) { - XposedHelpers.findAndHookMethod(clazz, "pushFragment", h5FragmentClazz, + XposedHelpers.findAndHookMethod(clazz, ClassMember.pushFragment, h5FragmentClazz, boolean.class, Bundle.class, boolean.class, boolean.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { Log.i(TAG, "cur fragment: " + param.args[0]); - AliMobileAutoCollectEnergyUtils.curH5Fragment = param.args[0]; + RpcCall.curH5Fragment = param.args[0]; } }); Log.i(TAG, "hook pushFragment successfully"); @@ -86,16 +86,16 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable Log.i(TAG, "hook出错:\ncouldn't find class com.alipay.mobile.nebulacore.ui.H5FragmentManager"); } - clazz = loader.loadClass("com.alipay.mobile.nebulacore.ui.H5Activity"); + clazz = loader.loadClass(ClassMember.com_alipay_mobile_nebulacore_ui_H5Activity); if(clazz != null) { - XposedHelpers.findAndHookMethod(clazz, "onResume", new XC_MethodHook() + XposedHelpers.findAndHookMethod(clazz, ClassMember.onResume, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { Log.i(TAG, "cur activity: " + param.thisObject); - AliMobileAutoCollectEnergyUtils.h5Activity = (Activity) param.thisObject; + RpcCall.h5Activity = (Activity) param.thisObject; } }); Log.i(TAG, "hook onResume successfully"); @@ -104,16 +104,16 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable Log.i(TAG, "hook出错:\ncouldn't find class com.alipay.mobile.nebulacore.ui.H5Activity"); } - clazz = loader.loadClass("com.alipay.mobile.nebulaappproxy.api.rpc.H5RpcUtil"); + clazz = loader.loadClass(ClassMember.com_alipay_mobile_nebulaappproxy_api_rpc_H5RpcUtil); if(clazz != null) { - Class h5PageClazz = loader.loadClass("com.alipay.mobile.h5container.api.H5Page"); - Class jsonClazz = loader.loadClass("com.alibaba.fastjson.JSONObject"); + Class h5PageClazz = loader.loadClass(ClassMember.com_alipay_mobile_h5container_api_H5Page); + Class jsonClazz = loader.loadClass(ClassMember.com_alibaba_fastjson_JSONObject); if(h5PageClazz != null && jsonClazz != null) { try { - XposedHelpers.findAndHookMethod(clazz, "rpcCall", String.class, String.class, String.class, + XposedHelpers.findAndHookMethod(clazz, ClassMember.rpcCall, String.class, String.class, String.class, boolean.class, jsonClazz, String.class, boolean.class, h5PageClazz, int.class, String.class, boolean.class, int.class, String.class, new XC_MethodHook() { @@ -126,25 +126,33 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { + String args0 = (String)param.args[0]; + if(args0 == null || !args0.contains("forest") && !args0.contains("antfarm")) + { + return; + } + Log.i(TAG, args0); Object resp = param.getResult(); if(resp != null) { - Method method = resp.getClass().getMethod("getResponse"); - String response = (String) method.invoke(resp); + String response = RpcCall.getResponse(resp); Log.i(TAG, "response: " + response); - if(AliMobileAutoCollectEnergyUtils.isRankList(response)) + if(AntForest.isRankList(response)) { Log.i(TAG, "autoGetCanCollectUserIdList"); - AliMobileAutoCollectEnergyUtils.autoGetCanCollectUserIdList(loader, response); + AntForest.autoGetCanCollectUserIdList(loader, response); } // 第一次是自己的能量,比上面的获取用户信息还要早,所有这里需要记录当前自己的userid值 - if(AliMobileAutoCollectEnergyUtils.isUserDetail(response)) + if(AntForest.isUserDetail(response)) { Log.i(TAG, "autoGetCanCollectBubbleIdList"); - AliMobileAutoCollectEnergyUtils.autoGetCanCollectBubbleIdList(loader, response); + AntForest.autoGetCanCollectBubbleIdList(loader, response); } + + AntFarm.start(loader, args0, (String)param.args[1], response); + } } });