diff --git a/.androidide/editor/openedFiles.json b/.androidide/editor/openedFiles.json index 14e4213..a7cb09e 100644 --- a/.androidide/editor/openedFiles.json +++ b/.androidide/editor/openedFiles.json @@ -1,35 +1,35 @@ { "allFiles": [ { - "file": "/storage/emulated/0/铃芽の文件/Projects/FuckMaoNemo/app/src/main/res/xml/config.xml", + "file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java", "selection": { "end": { - "column": 36, - "index": 1031, - "line": 30 + "column": 59, + "index": 9189, + "line": 224 }, "start": { - "column": 36, - "index": 1031, - "line": 30 + "column": 59, + "index": 9189, + "line": 224 } } }, { - "file": "/storage/emulated/0/铃芽の文件/Projects/FuckMaoNemo/app/build.gradle", + "file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/res/xml/config.xml", "selection": { "end": { - "column": 26, - "index": 302, - "line": 15 + "column": 0, + "index": 0, + "line": 0 }, "start": { - "column": 26, - "index": 302, - "line": 15 + "column": 0, + "index": 0, + "line": 0 } } } ], - "selectedFile": "/storage/emulated/0/铃芽の文件/Projects/FuckMaoNemo/app/build.gradle" + "selectedFile": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java" } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index d0b0484..10e751c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "io.github.moonleeeaf.fuckmaonemo" minSdk 21 targetSdk 33 - versionCode 12100 - versionName "1.2.1" + versionCode 13000 + versionName "1.3.p" vectorDrawables { useSupportLibrary true diff --git a/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/ConfigActivity.java b/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/ConfigActivity.java index 93d293a..fbcdb60 100644 --- a/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/ConfigActivity.java +++ b/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/ConfigActivity.java @@ -31,6 +31,15 @@ public class ConfigActivity extends PreferenceActivity { return false; }); + + findPreference("see_miao").setOnPreferenceClickListener((p) -> { + new AlertDialog.Builder(this) + .setTitle("屏蔽词列表") + .setMessage("当期列表:\n" + Hook.MIAO_LIST) + .show(); + + return false; + }); } } diff --git a/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java b/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java index 2657dda..a1513a2 100644 --- a/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java +++ b/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java @@ -24,6 +24,11 @@ public class Hook implements IXposedHookLoadPackage { private int nohengheng; private int aaaa; + public static final String MIAO_LIST = "妈 马 操 草 傻 艹 牛 逼 P 槽 涩 色 m"; + public static final String[] MIAO = MIAO_LIST.split(" "); + + private XC_MethodHook.Unhook force_set_work_myown_unhook; + @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam param) throws Throwable { if ("com.codemao.nemo".equals(param.packageName)) { @@ -53,6 +58,13 @@ public class Hook implements IXposedHookLoadPackage { return (Application) XposedHelpers.callStaticMethod(Class.forName("android.app.ActivityThread"), "currentApplication"); } + public static String fuck屏蔽词(String str) { + for (String i : MIAO) { + str = str.replaceAll(i, "‌" + i + "‌"); + } + return str; + } + public void hook(XC_LoadPackage.LoadPackageParam param) throws Exception { if (isHooked) return; else isHooked = true; @@ -164,6 +176,96 @@ public class Hook implements IXposedHookLoadPackage { ); }); + // 强制置顶评论 + load("force_top_comment", () -> { + XposedBridge.log("[FuckMaoNemo] Hook_强制置顶评论"); + XposedBridge.hookMethod( + getMethod( + XposedHelpers.findClass("com.codemao.nemo.view.CommentOptionDialogV2", classLoader), + "checkIsSelf", + null + ), + new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam mp) throws Throwable { + XposedHelpers.setBooleanField(mp.thisObject, "isOwnWork", true); + } + } + ); + }); + + // 谋权篡位 + load("force_set_work_myown", () -> { + XposedBridge.log("[FuckMaoNemo] Hook_谋权篡位"); + XposedBridge.hookMethod( + getMethod( + XposedHelpers.findClass("com.codemao.nemo.activity.WorkDetailActivity", classLoader), + "setWorkDetailData", + null + ), + new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam mp) throws Throwable { + force_set_work_myown_unhook = XposedBridge.hookMethod( + getMethod( + XposedHelpers.findClass("com.codemao.creativecenter.utils.bcm.bean.AuthorInfo", classLoader), + "getId", + null + ), + new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam hp) throws Throwable { + Method m = getMethod(XposedHelpers.findClass("com.codemao.nemo.util.LocalUserHelper", classLoader), "getUserInfo", null); + m.setAccessible(true); + Object usrInfo = m.invoke(null, null); + + m = getMethod(usrInfo.getClass(), "getId", null); + m.setAccessible(true); + + force_set_work_myown_unhook.unhook(); // 希望人没事 + return m.invoke(usrInfo, null); // long 类型 + } + }); + } + } + ); + }); + + // 防止屏蔽屏蔽词 + load("fuck_miao", () -> { + XposedBridge.log("[FuckMaoNemo] Hook_反屏蔽"); + XC_MethodHook hook = new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam mp) throws Throwable { + XposedHelpers.setObjectField(mp.thisObject, "content", fuck屏蔽词((String) XposedHelpers.getObjectField(mp.thisObject, "content"))); + } + }; + XposedBridge.hookMethod( + getMethod( + XposedHelpers.findClass("com.codemao.nemo.fragment.WorkCommentFragment", classLoader), + "sendReply", + null + ), + hook + ); + XposedBridge.hookMethod( + getMethod( + XposedHelpers.findClass("com.codemao.nemo.fragment.WorkCommentFragment", classLoader), + "sendComment", + null + ), + hook + ); + XposedBridge.hookMethod( + getMethod( + XposedHelpers.findClass("com.codemao.nemo.activity.CommentDetailActivity", classLoader), + "send", + null + ), + hook + ); + }); + XposedBridge.log("[FuckMaoNemo] 执行完毕"); Toast.makeText(getApplication(), "[FuckMaoNemo] 加载成功 (≧▽≦)\n" + nohengheng + " 个功能加载成功, " + aaaa + " 个失败", Toast.LENGTH_LONG).show(); diff --git a/app/src/main/res/xml/config.xml b/app/src/main/res/xml/config.xml index 1e2f71b..29bb6fa 100644 --- a/app/src/main/res/xml/config.xml +++ b/app/src/main/res/xml/config.xml @@ -28,12 +28,31 @@ + android:summary="主页不会弹更新对话框,不会拦截设置里手动查看的更新" /> + android:summary="目前只发现账号相关的有反防抓包,真无法抓包就去刷原生安卓吧,亲测有效" /> + + + + + + + + + + @@ -42,15 +61,20 @@ + android:summary="滞空防沉迷检测方法的调用实现无伤速通破解防沉迷,无需 Player 链接,不支持叽叽猫砸进里面的岛3,不支持内嵌社区网页的防沉迷,那不属于我的能力范围" /> + + - + + android:summary="使作品的 再创作 按钮永远显示,即使作品并未设置为开放源代码(显示了也没啥用,服务端给你拦截了,报错信息为 作品未开源,亲测无效)" /> \ No newline at end of file