feat: 最新作品过滤
Some checks failed
Android CI / build (push) Failing after 14m57s

This commit is contained in:
MoonLeeeaf
2024-10-26 09:34:22 +08:00
parent 0d6e388ea8
commit 59c457675d
5 changed files with 218 additions and 33 deletions

View File

@@ -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"
} }

View File

@@ -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

View File

@@ -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());

View File

@@ -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;
}
}
} }

View File

@@ -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="谋权篡位"