mirror of
https://github.com/MoonLeeeaf/FuckMaoNemo.git
synced 2025-06-06 11:23:33 +08:00
Compare commits
7 Commits
v1.7.0
...
54117f7887
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54117f7887 | ||
|
|
7048c6be58 | ||
|
|
fc4e947691 | ||
|
|
e6370772d7 | ||
|
|
4dfc881c4a | ||
|
|
720d56bc89 | ||
|
|
3a57d0b23f |
@@ -1,65 +0,0 @@
|
|||||||
{
|
|
||||||
"allFiles": [
|
|
||||||
{
|
|
||||||
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java",
|
|
||||||
"selection": {
|
|
||||||
"end": {
|
|
||||||
"column": 101,
|
|
||||||
"index": 9409,
|
|
||||||
"line": 222
|
|
||||||
},
|
|
||||||
"start": {
|
|
||||||
"column": 101,
|
|
||||||
"index": 9409,
|
|
||||||
"line": 222
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/build.gradle",
|
|
||||||
"selection": {
|
|
||||||
"end": {
|
|
||||||
"column": 22,
|
|
||||||
"index": 272,
|
|
||||||
"line": 14
|
|
||||||
},
|
|
||||||
"start": {
|
|
||||||
"column": 22,
|
|
||||||
"index": 272,
|
|
||||||
"line": 14
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/ConfigActivity.java",
|
|
||||||
"selection": {
|
|
||||||
"end": {
|
|
||||||
"column": 8,
|
|
||||||
"index": 2261,
|
|
||||||
"line": 57
|
|
||||||
},
|
|
||||||
"start": {
|
|
||||||
"column": 8,
|
|
||||||
"index": 2261,
|
|
||||||
"line": 57
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/res/xml/config.xml",
|
|
||||||
"selection": {
|
|
||||||
"end": {
|
|
||||||
"column": 48,
|
|
||||||
"index": 2950,
|
|
||||||
"line": 86
|
|
||||||
},
|
|
||||||
"start": {
|
|
||||||
"column": 25,
|
|
||||||
"index": 2927,
|
|
||||||
"line": 86
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"selectedFile": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/ConfigActivity.java"
|
|
||||||
}
|
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,5 @@
|
|||||||
|
.androidide
|
||||||
|
|
||||||
# Built application files
|
# Built application files
|
||||||
*.apk
|
*.apk
|
||||||
*.aar
|
*.aar
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ android {
|
|||||||
applicationId "io.github.moonleeeaf.fuckmaonemo"
|
applicationId "io.github.moonleeeaf.fuckmaonemo"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 33
|
targetSdk 33
|
||||||
versionCode 17000
|
versionCode 18000
|
||||||
versionName "1.7.0"
|
versionName "1.8.0"
|
||||||
|
|
||||||
vectorDrawables {
|
vectorDrawables {
|
||||||
useSupportLibrary true
|
useSupportLibrary true
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import android.text.Spanned;
|
|||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.webkit.CookieManager;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.PopupMenu;
|
import android.widget.PopupMenu;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
@@ -27,6 +28,7 @@ import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
|||||||
import java.lang.reflect.InvocationHandler;
|
import java.lang.reflect.InvocationHandler;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.net.Proxy;
|
import java.net.Proxy;
|
||||||
|
import java.net.URLEncoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -196,6 +198,43 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 劫持分享菜单
|
||||||
|
load("long_press_share_work_to_open_more_menu", () -> {
|
||||||
|
XposedBridge.log("[FuckMaoNemo] 长按作品分享更多菜单");
|
||||||
|
XposedBridge.hookMethod(
|
||||||
|
getMethod(
|
||||||
|
XposedHelpers.findClass("com.codemao.nemo.activity.WorkDetailActivity", classLoader),
|
||||||
|
"onCreate",
|
||||||
|
Bundle.class
|
||||||
|
),
|
||||||
|
new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void afterHookedMethod(MethodHookParam mp) throws Throwable {
|
||||||
|
Activity self = (Activity) mp.thisObject;
|
||||||
|
View v = self.findViewById(
|
||||||
|
XposedHelpers.getStaticIntField(
|
||||||
|
XposedHelpers.findClass("com.codemao.nemo.R$id", classLoader),
|
||||||
|
"ll_share"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
long workId = XposedHelpers.getLongField(self, "workId");
|
||||||
|
|
||||||
|
v.setOnLongClickListener((_v) -> {
|
||||||
|
PopupMenu pop = new PopupMenu(self, v);
|
||||||
|
Menu m = pop.getMenu();
|
||||||
|
m.add("获取分享口令").setOnMenuItemClickListener((mm) -> {
|
||||||
|
openWorkShareCodeGetter(workId);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
pop.show();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
load("test", () -> {
|
load("test", () -> {
|
||||||
methodToVoid(
|
methodToVoid(
|
||||||
getMethod(
|
getMethod(
|
||||||
@@ -236,16 +275,33 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
XposedBridge.hookMethod(
|
XposedBridge.hookMethod(
|
||||||
getMethod(
|
getMethod(
|
||||||
XposedHelpers.findClass("com.codemao.nemo.bean.LatestWorks", classLoader),
|
XposedHelpers.findClass("com.codemao.nemo.bean.LatestWorks", classLoader),
|
||||||
"getItems",
|
"getLimit",
|
||||||
null
|
null //List.class
|
||||||
),
|
),
|
||||||
new XC_MethodReplacement() {
|
new XC_MethodReplacement() {
|
||||||
@Override
|
@Override
|
||||||
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
|
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
|
||||||
List ls = (List) XposedHelpers.getObjectField(mp.thisObject, "items");
|
return 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
XposedBridge.hookMethod(
|
||||||
|
getMethod(
|
||||||
|
XposedHelpers.findClass("com.codemao.nemo.bean.LatestWorks", classLoader),
|
||||||
|
"getItems",
|
||||||
|
null //List.class
|
||||||
|
),
|
||||||
|
new XC_MethodReplacement() {
|
||||||
|
@Override
|
||||||
|
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
|
||||||
|
List ls = (List) XposedHelpers.getObjectField(mp.thisObject, "items"); // mp.args[0]; //
|
||||||
|
|
||||||
ArrayList al = new ArrayList();
|
ArrayList al = new ArrayList();
|
||||||
|
|
||||||
|
int passed = 0;
|
||||||
|
|
||||||
for (Object o : ls) {
|
for (Object o : ls) {
|
||||||
String workName = (String) XposedHelpers.getObjectField(o, "work_name");
|
String workName = (String) XposedHelpers.getObjectField(o, "work_name");
|
||||||
String userId = "" + XposedHelpers.getLongField(o, "user_id");
|
String userId = "" + XposedHelpers.getLongField(o, "user_id");
|
||||||
@@ -255,6 +311,7 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
for (NewestWorksFilter filter : filters) {
|
for (NewestWorksFilter filter : filters) {
|
||||||
if (filter.matches(userId, workName)) {
|
if (filter.matches(userId, workName)) {
|
||||||
disadd = true;
|
disadd = true;
|
||||||
|
passed++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -268,7 +325,18 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
al.add(o);
|
al.add(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XposedHelpers.setObjectField(mp.thisObject, "items", al);
|
||||||
|
|
||||||
|
int offset = XposedHelpers.getIntField(mp.thisObject, "offset");
|
||||||
|
XposedHelpers.setIntField(mp.thisObject, "offset", offset + passed);
|
||||||
|
|
||||||
|
int total = XposedHelpers.getIntField(mp.thisObject, "total");
|
||||||
|
// XposedHelpers.setIntField(mp.thisObject, "total", total - passed);
|
||||||
|
|
||||||
|
XposedBridge.log("[FuckMaoNemo] 过滤完毕 原数据: offset=" + offset + " total=" + total);
|
||||||
|
|
||||||
return al;
|
return al;
|
||||||
|
// return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -601,6 +669,24 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void openWorkShareCodeGetter(long workId) {
|
||||||
|
try {
|
||||||
|
Context self = getApplication();
|
||||||
|
String cookie = CookieManager.getInstance().getCookie("https://api.codemao.cn");
|
||||||
|
int a = cookie.indexOf(";", cookie.indexOf("Bearer "));
|
||||||
|
String token = cookie.substring(cookie.indexOf("Bearer ") + "Bearer ".length(), a == -1 ? cookie.length() : a - 1);
|
||||||
|
|
||||||
|
// XposedBridge.log("cookie=" + cookie);
|
||||||
|
// XposedBridge.log("token=" + token);
|
||||||
|
self.startActivity(new Intent().setFlags(Intent.FLAG_ACTIVITY_NEW_TASK).setData(Uri.parse("nemo://com.codemao.nemo/openwith?type=5&url=" +
|
||||||
|
URLEncoder.encode("https://moonbcmtools.github.io/CodemaoNemoOneKeyBuildShareCode/?token=" + token + "&workId=" + workId, "utf-8")
|
||||||
|
)));
|
||||||
|
} catch(Exception e) {
|
||||||
|
XposedBridge.log(e);
|
||||||
|
// Toast.makeText(self, "[FuckMaoNemo] " + e, Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class NewestWorksFilter {
|
public static class NewestWorksFilter {
|
||||||
private String type;
|
private String type;
|
||||||
private String value;
|
private String value;
|
||||||
|
|||||||
@@ -78,6 +78,11 @@
|
|||||||
android:title="绕过防沉迷"
|
android:title="绕过防沉迷"
|
||||||
android:summary="滞空防沉迷检测方法的调用实现无伤速通破解防沉迷,无需 Player 链接,不支持叽叽猫砸进里面的岛3,不支持内嵌社区网页的防沉迷,那不属于我的能力范围" />
|
android:summary="滞空防沉迷检测方法的调用实现无伤速通破解防沉迷,无需 Player 链接,不支持叽叽猫砸进里面的岛3,不支持内嵌社区网页的防沉迷,那不属于我的能力范围" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:key="long_press_share_work_to_open_more_menu"
|
||||||
|
android:title="万能的长按分享菜单"
|
||||||
|
android:summary="功能如下:\n获取作品分享口令(有一定风险)" />
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:key="newest_works_filter"
|
android:key="newest_works_filter"
|
||||||
android:title="最新作品过滤"
|
android:title="最新作品过滤"
|
||||||
|
|||||||
Reference in New Issue
Block a user