mirror of
https://github.com/MoonLeeeaf/FuckMaoNemo.git
synced 2025-06-06 11:23:33 +08:00
This commit is contained in:
@@ -4,29 +4,14 @@
|
|||||||
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java",
|
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java",
|
||||||
"selection": {
|
"selection": {
|
||||||
"end": {
|
"end": {
|
||||||
"column": 30,
|
"column": 101,
|
||||||
"index": 4201,
|
"index": 9409,
|
||||||
"line": 112
|
"line": 222
|
||||||
},
|
},
|
||||||
"start": {
|
"start": {
|
||||||
"column": 30,
|
"column": 101,
|
||||||
"index": 4201,
|
"index": 9409,
|
||||||
"line": 112
|
"line": 222
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/res/xml/config.xml",
|
|
||||||
"selection": {
|
|
||||||
"end": {
|
|
||||||
"column": 27,
|
|
||||||
"index": 461,
|
|
||||||
"line": 13
|
|
||||||
},
|
|
||||||
"start": {
|
|
||||||
"column": 27,
|
|
||||||
"index": 461,
|
|
||||||
"line": 13
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -44,7 +29,37 @@
|
|||||||
"line": 14
|
"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/build.gradle"
|
"selectedFile": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/ConfigActivity.java"
|
||||||
}
|
}
|
||||||
@@ -12,8 +12,8 @@ android {
|
|||||||
applicationId "io.github.moonleeeaf.fuckmaonemo"
|
applicationId "io.github.moonleeeaf.fuckmaonemo"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 33
|
targetSdk 33
|
||||||
versionCode 16000
|
versionCode 17000
|
||||||
versionName "1.6.0"
|
versionName "1.7.0"
|
||||||
|
|
||||||
vectorDrawables {
|
vectorDrawables {
|
||||||
useSupportLibrary true
|
useSupportLibrary true
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.os.Bundle;
|
|||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.EditText;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
@@ -43,6 +44,23 @@ public class ConfigActivity extends PreferenceActivity {
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
findPreference("set_newest_works_filter").setOnPreferenceClickListener((p) -> {
|
||||||
|
EditText edit = new EditText(this);
|
||||||
|
|
||||||
|
edit.setText(getPreferenceManager().getSharedPreferences().getString("newest_works_filter_rule_shared", "userId 823651139"));
|
||||||
|
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle("最新作品过滤规则")
|
||||||
|
.setView(edit)
|
||||||
|
.setPositiveButton("保存", (d, w) -> {
|
||||||
|
getPreferenceManager().getSharedPreferences().edit().putString("newest_works_filter_rule_shared", edit.getText().toString()).apply();
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", (d, w) -> {})
|
||||||
|
.show();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
FileOutputStream fos = openFileOutput("fuck_miao.txt", MODE_WORLD_READABLE);
|
FileOutputStream fos = openFileOutput("fuck_miao.txt", MODE_WORLD_READABLE);
|
||||||
String s = new String(getAssets().open("屏蔽词.txt").readAllBytes());
|
String s = new String(getAssets().open("屏蔽词.txt").readAllBytes());
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.AssetManager;
|
import android.content.res.AssetManager;
|
||||||
import android.content.res.loader.AssetsProvider;
|
import android.content.res.loader.AssetsProvider;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.InputFilter;
|
import android.text.InputFilter;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
@@ -23,6 +24,7 @@ import de.robv.android.xposed.XSharedPreferences;
|
|||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
import de.robv.android.xposed.XposedHelpers;
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||||
|
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.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -30,6 +32,7 @@ import java.util.Arrays;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class Hook implements IXposedHookLoadPackage {
|
public class Hook implements IXposedHookLoadPackage {
|
||||||
private static boolean isHooked = false;
|
private static boolean isHooked = false;
|
||||||
@@ -134,6 +137,21 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
c.startActivity(new Intent().setComponent(new ComponentName("io.github.moonleeeaf.fuckmaonemo", ConfigActivity.class.getName())));
|
c.startActivity(new Intent().setComponent(new ComponentName("io.github.moonleeeaf.fuckmaonemo", ConfigActivity.class.getName())));
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
m.add("打开内置浏览器").setOnMenuItemClickListener((mm) -> {
|
||||||
|
EditText edit = new EditText(c);
|
||||||
|
new AlertDialog.Builder(c)
|
||||||
|
.setTitle("打开内置浏览器")
|
||||||
|
.setIcon(android.R.drawable.ic_dialog_info)
|
||||||
|
.setView(edit)
|
||||||
|
.setPositiveButton("打开", (d, w) -> {
|
||||||
|
c.startActivity(new Intent().setData(Uri.parse("nemo://com.codemao.nemo/openwith?type=5&url=" + edit.getText())));
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", (d, w) -> {})
|
||||||
|
.create()
|
||||||
|
.show();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
pop.show();
|
pop.show();
|
||||||
|
|
||||||
mp.setResult(null);
|
mp.setResult(null);
|
||||||
@@ -198,6 +216,64 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
));
|
));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 最新作品过滤
|
||||||
|
load("newest_works_filter", () -> {
|
||||||
|
XposedBridge.log("[FuckMaoNemo] Hook_最新作品过滤");
|
||||||
|
|
||||||
|
final String[] rules = xsp.getString("newest_works_filter_rule_shared", "userId 823651139").split("\n");
|
||||||
|
|
||||||
|
final ArrayList<NewestWorksFilter> filters = new ArrayList<NewestWorksFilter>();
|
||||||
|
|
||||||
|
for (String s : rules) {
|
||||||
|
String type = s.split(" ")[0];
|
||||||
|
String value = s.split(" ")[1];
|
||||||
|
|
||||||
|
NewestWorksFilter nwf = new NewestWorksFilter(type, value);
|
||||||
|
|
||||||
|
filters.add(nwf);
|
||||||
|
}
|
||||||
|
|
||||||
|
XposedBridge.hookMethod(
|
||||||
|
getMethod(
|
||||||
|
XposedHelpers.findClass("com.codemao.nemo.bean.LatestWorks", classLoader),
|
||||||
|
"getItems",
|
||||||
|
null
|
||||||
|
),
|
||||||
|
new XC_MethodReplacement() {
|
||||||
|
@Override
|
||||||
|
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
|
||||||
|
List ls = (List) XposedHelpers.getObjectField(mp.thisObject, "items");
|
||||||
|
|
||||||
|
ArrayList al = new ArrayList();
|
||||||
|
|
||||||
|
for (Object o : ls) {
|
||||||
|
String workName = (String) XposedHelpers.getObjectField(o, "work_name");
|
||||||
|
String userId = "" + XposedHelpers.getLongField(o, "user_id");
|
||||||
|
|
||||||
|
boolean disadd = false;
|
||||||
|
|
||||||
|
for (NewestWorksFilter filter : filters) {
|
||||||
|
if (filter.matches(userId, workName)) {
|
||||||
|
disadd = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disadd) {
|
||||||
|
XposedBridge.log("[FuckMaoNemo] 过滤用户 " + userId + " 的作品 " + workName);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
al.add(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
return al;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
// 修复KN作品播放
|
// 修复KN作品播放
|
||||||
load("fix_kn_player", () -> {
|
load("fix_kn_player", () -> {
|
||||||
XposedBridge.log("[FuckMaoNemo] Hook_修复KN作品播放");
|
XposedBridge.log("[FuckMaoNemo] Hook_修复KN作品播放");
|
||||||
@@ -278,19 +354,64 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
load("fuck_box3recommend", () -> {
|
load("fuck_box3recommend", () -> {
|
||||||
XposedBridge.log("[FuckMaoNemo] Hook_岛3我推荐你吗");
|
XposedBridge.log("[FuckMaoNemo] Hook_岛3我推荐你吗");
|
||||||
|
|
||||||
Object mgr = XposedHelpers.findClass("com.giu.xzz.http.RetrofitManager",classLoader).getDeclaredMethod("get", null).invoke(null, null);
|
XposedBridge.hookMethod(
|
||||||
Object example = mgr.getClass().getDeclaredMethod("create", new Class[] { Class.class }).invoke(mgr, XposedHelpers.findClass("com.codemao.nemo.retrofit.api.DiscoveryService", classLoader));
|
getMethod(
|
||||||
|
XposedHelpers.findClass("retrofit2.Retrofit$1", classLoader),
|
||||||
XposedBridge.hookAllMethods(
|
"invoke",
|
||||||
example.getClass(),
|
new Class[] {
|
||||||
"getRecommendBoxData",
|
Object.class,
|
||||||
new XC_MethodReplacement() {
|
Method.class,
|
||||||
|
Object[].class
|
||||||
|
}
|
||||||
|
),
|
||||||
|
new XC_MethodHook() {
|
||||||
@Override
|
@Override
|
||||||
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
|
protected void beforeHookedMethod(MethodHookParam mp) throws Throwable {
|
||||||
return XposedHelpers.findClass("io.reactivex.Observable", classLoader).getConstructor(null).newInstance(null);
|
switch (((Method) mp.args[1]).getName()) {
|
||||||
|
case "getRecommendBoxData":
|
||||||
|
mp.setResult(XposedHelpers.callMethod(mp.args[0], "getRecommendPageData", new Object[] {}));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
XposedBridge.hookMethod(
|
||||||
|
getMethod(
|
||||||
|
XposedHelpers.findClass("com.giu.xzz.http.RetrofitManager",classLoader),
|
||||||
|
"create",
|
||||||
|
Class.class
|
||||||
|
),
|
||||||
|
new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void afterHookedMethod(MethodHookParam mp) throws Throwable {
|
||||||
|
Object s = mp.getResult();
|
||||||
|
|
||||||
|
XposedBridge.hookAllMethods(
|
||||||
|
s.getClass(),
|
||||||
|
"getRecommendBoxData",
|
||||||
|
new XC_MethodReplacement() {
|
||||||
|
@Override
|
||||||
|
protected Object replaceHookedMethod(MethodHookParam arg0) throws Throwable {
|
||||||
|
InvocationHandler handler = new InvocationHandler() {
|
||||||
|
@Override
|
||||||
|
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return java.lang.reflect.Proxy.newProxyInstance(
|
||||||
|
classLoader,
|
||||||
|
new Class[] { XposedHelpers.findClass("io.reactivex.Observable", classLoader) },
|
||||||
|
hanlder
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
*/
|
||||||
});
|
});
|
||||||
|
|
||||||
// 强制显示再创作按钮
|
// 强制显示再创作按钮
|
||||||
@@ -480,4 +601,25 @@ public class Hook implements IXposedHookLoadPackage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class NewestWorksFilter {
|
||||||
|
private String type;
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
public NewestWorksFilter(String type, String value) {
|
||||||
|
this.type = type;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean matches(String userId, String workName) {
|
||||||
|
if ("workName".equals(this.type)) {
|
||||||
|
return Pattern.matches(value, workName);
|
||||||
|
} else if ("userId".equals(this.type)) {
|
||||||
|
return userId.equals(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,16 @@
|
|||||||
android:title="绕过防沉迷"
|
android:title="绕过防沉迷"
|
||||||
android:summary="滞空防沉迷检测方法的调用实现无伤速通破解防沉迷,无需 Player 链接,不支持叽叽猫砸进里面的岛3,不支持内嵌社区网页的防沉迷,那不属于我的能力范围" />
|
android:summary="滞空防沉迷检测方法的调用实现无伤速通破解防沉迷,无需 Player 链接,不支持叽叽猫砸进里面的岛3,不支持内嵌社区网页的防沉迷,那不属于我的能力范围" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:key="newest_works_filter"
|
||||||
|
android:title="最新作品过滤"
|
||||||
|
android:summary="发你吗个逼的广告这他妈谁看你那臭几把玩意 欢迎殴打我手机号 15675696451" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="set_newest_works_filter"
|
||||||
|
android:title="最新作品过滤列表"
|
||||||
|
android:summary="可以对上面功能进行配置 支持使用作品名称 用户ID等过滤" />
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:key="force_set_work_myown"
|
android:key="force_set_work_myown"
|
||||||
android:title="谋权篡位"
|
android:title="谋权篡位"
|
||||||
|
|||||||
Reference in New Issue
Block a user