mirror of
https://github.com/MoonLeeeaf/FuckMaoNemo.git
synced 2025-06-06 11:23:33 +08:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d6e388ea8 | ||
|
|
525f842bea | ||
|
|
47828c8dce | ||
|
|
0cc18595e4 | ||
|
|
375d7819d9 | ||
|
|
248cca908f |
@@ -4,14 +4,14 @@
|
||||
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java",
|
||||
"selection": {
|
||||
"end": {
|
||||
"column": 59,
|
||||
"index": 9189,
|
||||
"line": 224
|
||||
"column": 30,
|
||||
"index": 4201,
|
||||
"line": 112
|
||||
},
|
||||
"start": {
|
||||
"column": 59,
|
||||
"index": 9189,
|
||||
"line": 224
|
||||
"column": 30,
|
||||
"index": 4201,
|
||||
"line": 112
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -19,17 +19,32 @@
|
||||
"file": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/res/xml/config.xml",
|
||||
"selection": {
|
||||
"end": {
|
||||
"column": 0,
|
||||
"index": 0,
|
||||
"line": 0
|
||||
"column": 27,
|
||||
"index": 461,
|
||||
"line": 13
|
||||
},
|
||||
"start": {
|
||||
"column": 0,
|
||||
"index": 0,
|
||||
"line": 0
|
||||
"column": 27,
|
||||
"index": 461,
|
||||
"line": 13
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"selectedFile": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java"
|
||||
"selectedFile": "/storage/emulated/0/MoonLeaf/Projects/FuckMaoNemo/app/build.gradle"
|
||||
}
|
||||
BIN
.github/6.png
vendored
Normal file
BIN
.github/6.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 87 KiB |
@@ -12,8 +12,8 @@ android {
|
||||
applicationId "io.github.moonleeeaf.fuckmaonemo"
|
||||
minSdk 21
|
||||
targetSdk 33
|
||||
versionCode 13000
|
||||
versionName "1.3.p"
|
||||
versionCode 16000
|
||||
versionName "1.6.0"
|
||||
|
||||
vectorDrawables {
|
||||
useSupportLibrary true
|
||||
|
||||
11
app/src/main/assets/屏蔽词.txt
Normal file
11
app/src/main/assets/屏蔽词.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
我操 我操
|
||||
他妈 他妈
|
||||
你妈 你妈
|
||||
妈的 妈的
|
||||
傻逼 傻逼
|
||||
智障 智障
|
||||
傻子 傻子
|
||||
CP CP
|
||||
NM NM
|
||||
TM TM
|
||||
MD MD
|
||||
@@ -8,7 +8,9 @@ import android.preference.PreferenceManager;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Toast;
|
||||
import android.widget.Toolbar;
|
||||
import java.io.FileOutputStream;
|
||||
|
||||
public class ConfigActivity extends PreferenceActivity {
|
||||
|
||||
@@ -35,11 +37,19 @@ public class ConfigActivity extends PreferenceActivity {
|
||||
findPreference("see_miao").setOnPreferenceClickListener((p) -> {
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle("屏蔽词列表")
|
||||
.setMessage("当期列表:\n" + Hook.MIAO_LIST)
|
||||
.setMessage("当期列表:\n" + getPreferenceManager().getSharedPreferences().getString("MIAO_LIST_SHARED", "获取失败!"))
|
||||
.show();
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
try {
|
||||
FileOutputStream fos = openFileOutput("fuck_miao.txt", MODE_WORLD_READABLE);
|
||||
String s = new String(getAssets().open("屏蔽词.txt").readAllBytes());
|
||||
getPreferenceManager().getSharedPreferences().edit().putString("MIAO_LIST_SHARED", s).apply();
|
||||
} catch(Exception e) {
|
||||
Toast.makeText(this, "更新屏蔽词列表失败!" + e, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
package io.github.moonleeeaf.fuckmaonemo;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Application;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.AssetManager;
|
||||
import android.content.res.loader.AssetsProvider;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputFilter;
|
||||
import android.text.Spanned;
|
||||
import android.util.Pair;
|
||||
import android.view.Menu;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
import android.widget.PopupMenu;
|
||||
import android.widget.Toast;
|
||||
import de.robv.android.xposed.IXposedHookLoadPackage;
|
||||
import de.robv.android.xposed.XC_MethodHook;
|
||||
@@ -14,7 +25,10 @@ import de.robv.android.xposed.XposedHelpers;
|
||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.Proxy;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class Hook implements IXposedHookLoadPackage {
|
||||
@@ -24,14 +38,24 @@ 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(" ");
|
||||
public static String MIAO_LIST;
|
||||
public static String[][] MIAO;
|
||||
|
||||
private XC_MethodHook.Unhook force_set_work_myown_unhook;
|
||||
|
||||
private static String[][] demo(String[] array, String split) {
|
||||
ArrayList<String[]> ls = new ArrayList<>();
|
||||
for (String i : array) {
|
||||
String[] b = i.split(split);
|
||||
ls.add(new String[] {b[0], b[1]});
|
||||
}
|
||||
return ls.toArray(new String[][]{});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam param) throws Throwable {
|
||||
if ("com.codemao.nemo".equals(param.packageName)) {
|
||||
xsp = new XSharedPreferences("io.github.moonleeeaf.fuckmaonemo", "config");
|
||||
if ("com.codemao.nemo".equals(param.packageName) || xsp.getBoolean("force_enable", false)) {
|
||||
XposedBridge.log("[FuckMaoNemo] 开始注入...");
|
||||
// 感谢 安宁 提供取加固程序的 ClassLoader 的代码
|
||||
XposedBridge.hookAllMethods(
|
||||
@@ -58,11 +82,16 @@ 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 + "");
|
||||
public static Pair<String, String> fuck屏蔽词(String str) {
|
||||
String after = str;
|
||||
String a = "";
|
||||
for (String[] i : MIAO) {
|
||||
after = str.replaceAll(i[0], i[1]);
|
||||
if (!after.equals(str))
|
||||
a += i[0];
|
||||
str = after;
|
||||
}
|
||||
return str;
|
||||
return new Pair<>(str, a);
|
||||
}
|
||||
|
||||
public void hook(XC_LoadPackage.LoadPackageParam param) throws Exception {
|
||||
@@ -71,11 +100,49 @@ public class Hook implements IXposedHookLoadPackage {
|
||||
|
||||
nohengheng = 0;
|
||||
aaaa = 0;
|
||||
|
||||
xsp = new XSharedPreferences("io.github.moonleeeaf.fuckmaonemo", "config");
|
||||
|
||||
|
||||
XposedBridge.log("[FuckMaoNemo] 注入中...");
|
||||
|
||||
// 劫持设置按钮的点击事件
|
||||
load("inject_settings_button", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_注入设置菜单");
|
||||
XposedBridge.hookMethod(
|
||||
getMethod(
|
||||
XposedHelpers.findClass("com.codemao.nemo.fragment.MineFragment", classLoader),
|
||||
"onClick",
|
||||
View.class
|
||||
),
|
||||
new XC_MethodHook() {
|
||||
@Override
|
||||
protected void beforeHookedMethod(MethodHookParam mp) throws Throwable {
|
||||
View v = (View) mp.args[0];
|
||||
if (v.getId() == 2131297099)
|
||||
v.setId(11451419);
|
||||
}
|
||||
@Override
|
||||
protected void afterHookedMethod(MethodHookParam mp) throws Throwable {
|
||||
View v = (View) mp.args[0];
|
||||
Context c = v.getContext();
|
||||
if (v.getId() == 11451419) {
|
||||
PopupMenu pop = new PopupMenu(c, v);
|
||||
Menu m = pop.getMenu();
|
||||
m.add("Nemo设置").setOnMenuItemClickListener((mm) -> {
|
||||
c.startActivity(new Intent(c, XposedHelpers.findClass("com.codemao.nemo.activity.SettingActivity", classLoader)));
|
||||
return false;
|
||||
});
|
||||
m.add("模块设置").setOnMenuItemClickListener((mm) -> {
|
||||
c.startActivity(new Intent().setComponent(new ComponentName("io.github.moonleeeaf.fuckmaonemo", ConfigActivity.class.getName())));
|
||||
return false;
|
||||
});
|
||||
pop.show();
|
||||
|
||||
mp.setResult(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}, true);
|
||||
|
||||
// 拦截40x码
|
||||
load("fuck_40x", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_拦截40x码");
|
||||
@@ -111,6 +178,16 @@ public class Hook implements IXposedHookLoadPackage {
|
||||
);
|
||||
});
|
||||
|
||||
load("test", () -> {
|
||||
methodToVoid(
|
||||
getMethod(
|
||||
XposedHelpers.findClass("com.codemao.nemo.bean.AuthorInfo", classLoader),
|
||||
"setFork_user",
|
||||
boolean.class
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
// 绕过防沉迷
|
||||
load("fuck_fcm", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_绕过防沉迷");
|
||||
@@ -121,6 +198,101 @@ public class Hook implements IXposedHookLoadPackage {
|
||||
));
|
||||
});
|
||||
|
||||
// 修复KN作品播放
|
||||
load("fix_kn_player", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_修复KN作品播放");
|
||||
XposedBridge.hookMethod(
|
||||
getMethod(
|
||||
XposedHelpers.findClass("com.codemao.nemo.view.X5DWebView", classLoader),
|
||||
"loadUrl",
|
||||
String.class
|
||||
),
|
||||
new XC_MethodHook() {
|
||||
@Override
|
||||
protected void beforeHookedMethod(MethodHookParam mp) throws Throwable {
|
||||
String url = (String) mp.args[0];
|
||||
if (url != null && url.contains("kn.codemao.cn"))
|
||||
url = url.substring(0, url.lastIndexOf("?")) + "&is_nemo_player=true";
|
||||
mp.args[0] = url;
|
||||
XposedBridge.log("KN作品替换链接:" + url);
|
||||
}
|
||||
}
|
||||
);
|
||||
XposedBridge.hookMethod(
|
||||
getMethod(
|
||||
XposedHelpers.findClass("com.codemao.creativestore.dsbridge.DWebView", classLoader),
|
||||
"loadUrl",
|
||||
String.class
|
||||
),
|
||||
new XC_MethodHook() {
|
||||
@Override
|
||||
protected void beforeHookedMethod(MethodHookParam mp) throws Throwable {
|
||||
String url = (String) mp.args[0];
|
||||
if (url != null && url.contains("kn.codemao.cn"))
|
||||
url = url.substring(0, url.lastIndexOf("?")) + "&is_nemo_player=true";
|
||||
mp.args[0] = url;
|
||||
XposedBridge.log("KN作品替换链接:" + url);
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// 我就要个人信息换行
|
||||
load("remove_edit_desc_filter", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_我就要个人信息换行");
|
||||
XposedBridge.hookMethod(
|
||||
getMethod(
|
||||
XposedHelpers.findClass("com.codemao.nemo.activity.UserNameDesEditActivity", classLoader),
|
||||
"initView",
|
||||
null
|
||||
),
|
||||
new XC_MethodHook() {
|
||||
@Override
|
||||
protected void afterHookedMethod(MethodHookParam mp) throws Throwable {
|
||||
EditText e = (EditText) XposedHelpers.getObjectField(mp.thisObject, "editText");
|
||||
e.setFilters(new InputFilter[]{});
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// 作品没有失效
|
||||
load("work_is_valid", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_作品没有失效");
|
||||
XposedBridge.hookMethod(getMethod(
|
||||
XposedHelpers.findClass("com.codemao.nemo.bean.CollectWorkInfo", classLoader),
|
||||
"getPublish_time",
|
||||
null
|
||||
),new XC_MethodReplacement() {
|
||||
@Override
|
||||
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
|
||||
long time = XposedHelpers.getLongField(mp.thisObject, "publish_time");
|
||||
if (time <= 0)
|
||||
time = 114514;
|
||||
return time;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 岛3我推荐你吗
|
||||
load("fuck_box3recommend", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_岛3我推荐你吗");
|
||||
|
||||
Object mgr = XposedHelpers.findClass("com.giu.xzz.http.RetrofitManager",classLoader).getDeclaredMethod("get", null).invoke(null, null);
|
||||
Object example = mgr.getClass().getDeclaredMethod("create", new Class[] { Class.class }).invoke(mgr, XposedHelpers.findClass("com.codemao.nemo.retrofit.api.DiscoveryService", classLoader));
|
||||
|
||||
XposedBridge.hookAllMethods(
|
||||
example.getClass(),
|
||||
"getRecommendBoxData",
|
||||
new XC_MethodReplacement() {
|
||||
@Override
|
||||
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
|
||||
return XposedHelpers.findClass("io.reactivex.Observable", classLoader).getConstructor(null).newInstance(null);
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// 强制显示再创作按钮
|
||||
load("force_show_rework", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_强制显示再创作按钮");
|
||||
@@ -234,10 +406,18 @@ public class Hook implements IXposedHookLoadPackage {
|
||||
// 防止屏蔽屏蔽词
|
||||
load("fuck_miao", () -> {
|
||||
XposedBridge.log("[FuckMaoNemo] Hook_反屏蔽");
|
||||
|
||||
MIAO_LIST = xsp.getString("MIAO_LIST_SHARED", null);
|
||||
|
||||
MIAO = demo(MIAO_LIST.split("\n"), " ");
|
||||
|
||||
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")));
|
||||
Pair<String, String> sb = fuck屏蔽词((String) XposedHelpers.getObjectField(mp.thisObject, "content"));
|
||||
XposedHelpers.setObjectField(mp.thisObject, "content", sb.first);
|
||||
if (!"".equals(sb.second))
|
||||
Toast.makeText(getApplication(), "[FuckMaoNemo] 发送内容已尝试防止屏蔽下列字符词语:" + sb.second, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
};
|
||||
XposedBridge.hookMethod(
|
||||
@@ -285,7 +465,11 @@ public class Hook implements IXposedHookLoadPackage {
|
||||
}
|
||||
|
||||
public void load(String pref, Callback cb) {
|
||||
if (xsp.getBoolean(pref, false)) {
|
||||
load(pref, cb ,false);
|
||||
}
|
||||
|
||||
public void load(String pref, Callback cb, boolean def) {
|
||||
if (xsp.getBoolean(pref, def)) {
|
||||
try {
|
||||
cb.onCallback();
|
||||
nohengheng++;
|
||||
|
||||
@@ -8,8 +8,23 @@
|
||||
|
||||
<Preference
|
||||
android:title="作者"
|
||||
android:summary="编程猫 @满月叶\nGitHub @MoonLeeeaf\n喵呜~" />
|
||||
|
||||
android:summary="编程猫 @满月叶\nGitHub @MoonLeeeaf\nBiliBili @静之彼端\n喵呜~" />
|
||||
|
||||
<Preference
|
||||
android:title="提示"
|
||||
android:summary="目前只支持 LSPosed\n其他暂未测试\n更改功能后重启生效" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="force_enable"
|
||||
android:title="非官方客户端"
|
||||
android:summary="如果你正在使用基于官方 Nemo 修改的客户端,那么可以打开此选项(记得配置模块作用域哦)" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="inject_settings_button"
|
||||
android:title="注入设置菜单"
|
||||
android:summary="字面意思"
|
||||
android:defaultValue="true" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="网络">
|
||||
@@ -68,9 +83,39 @@
|
||||
android:title="谋权篡位"
|
||||
android:summary="伪装任意作品是你自己的,可以:\n直接编辑作品源码\n其他用途" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="fuck_box3recommend"
|
||||
android:title="岛3我推荐你吗"
|
||||
android:summary="机吧猫砸进里面的玩意实际上还不如去研究如何优化 Nemo 客户端,打开后主页将没有四个岛三作品引流\n提示:还没修好,等我修修,不然你会进不去主页的哦" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="work_is_valid"
|
||||
android:title="作品没有失效"
|
||||
android:summary="让作品的发布时间大于0,可以绕过收藏作品的“失效”状态" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="fix_kn_player"
|
||||
android:title="修复 KN 作品无法打开"
|
||||
android:summary="去你吗的Nemo推广(UA检测),去你妈的 “?is_nemo_player” 害得我无法打开,我直接把它机吧割了,QSWL\n本功能仅需要时启用,5.0.0用户请不要启用" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="实验">
|
||||
|
||||
<SwitchPreference
|
||||
android:key="remove_edit_desc_filter"
|
||||
android:title="我就要个人信息换行"
|
||||
android:summary="删除个人简介编辑页面的过滤器以达到不过滤换行符号的目的(注意:暂时不能手动输入,暂时用复制粘贴换行符来替代)" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="实验">
|
||||
|
||||
<SwitchPreference
|
||||
android:key="test"
|
||||
android:title="Unnamed Feature"
|
||||
android:summary="setFork_user(B)V" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="force_show_rework"
|
||||
android:title="强制显示再创作图标"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
## 缓更
|
||||
|
||||
本项目是根据我个人需求为基准而制作的,因此,我可能不会抽太多时间来更新某些功能,有能力的朋友欢迎 Fork 下来 Pull Requests,我很乐意帮你们 Merge 上,谢谢❤️
|
||||
|
||||
## FuckMaoNemo
|
||||
|
||||
弥补 编程猫Nemo/点个猫 的不合理特性,功能增强等特性(。・ω・。)
|
||||
|
||||
提示:本项目只在 GitHub 存在, **严禁任何人或任何组织在没有得到我的书面许可、公告明示许可及社交账号发帖许可的情况下照搬本仓库** <!-- GitCode, 说的就是你, 到时候如果被我发现你搬我仓库我迟早要找你算账 -->
|
||||
|
||||
### For non-Chinese users
|
||||
|
||||
This project is for Codemao Nemo. Most of the time, you needn't use this Xposed module.
|
||||
|
||||
### 使用
|
||||
|
||||
0. 建议点个猫版本为 4.3.4,已安装 LSPosed 框架(由于使用了 XSharedPreferences,故免 Root 的 Xposed 框架貌似无法正常运作)
|
||||
|
||||
@@ -5,3 +5,4 @@
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
Reference in New Issue
Block a user