21 Commits
v1.2.0 ... main

Author SHA1 Message Date
月有阴晴圆缺
447f38a45e 再见了
Some checks failed
Android CI / build (push) Has been cancelled
2025-05-25 10:39:27 +08:00
满月叶
54117f7887 啊米诺斯😡
Some checks failed
Android CI / build (push) Has been cancelled
2025-01-26 10:17:32 +08:00
MoonLeeeaf
7048c6be58 chore: ignore .androidide folder 2025-01-26 10:12:10 +08:00
MoonLeeeaf
fc4e947691 chore: remove useless files 2025-01-26 10:10:36 +08:00
MoonLeeeaf
e6370772d7 feat: 长按分享弹出功能菜单, 获取作品分享口令 2025-01-26 10:09:39 +08:00
满月叶
4dfc881c4a Update readme.md
Some checks failed
Android CI / build (push) Has been cancelled
2025-01-24 21:48:16 +08:00
满月叶
720d56bc89 disconnected
Some checks failed
Android CI / build (push) Has been cancelled
2024-12-29 20:55:13 +08:00
MoonLeeeaf
3a57d0b23f 小修补
Some checks failed
Android CI / build (push) Failing after 14m56s
2024-10-26 11:00:44 +08:00
MoonLeeeaf
59c457675d feat: 最新作品过滤
Some checks failed
Android CI / build (push) Failing after 14m57s
2024-10-26 09:34:22 +08:00
MoonLeeeaf
0d6e388ea8 feat: inject setting button
Some checks failed
Android CI / build (push) Failing after 14m58s
2024-08-03 10:04:48 +08:00
MoonLeeeaf
525f842bea docs: add screenshot
Some checks failed
Android CI / build (push) Failing after 14m57s
2024-08-01 11:14:23 +08:00
MoonLeeeaf
47828c8dce feat: force enable enter in desc editing 2024-08-01 11:06:05 +08:00
满月叶
0cc18595e4 Update readme.md
Some checks failed
Android CI / build (push) Failing after 14m56s
2024-07-25 18:56:04 +08:00
满月叶
375d7819d9 Final
Some checks failed
Android CI / build (push) Failing after 14m57s
2024-07-21 14:31:02 +08:00
MoonLeeeaf
248cca908f new feature
Some checks failed
Android CI / build (push) Failing after 14m58s
2024-07-16 13:17:03 +08:00
MoonLeeeaf
b8246657d1 feat: 谋权篡位 & 强制置顶评论
Some checks failed
Android CI / build (push) Failing after 14m58s
2024-07-07 21:01:02 +08:00
满月叶
6b886b3182 docs: docs
Some checks failed
Android CI / build (push) Failing after 19m57s
2024-06-29 22:06:53 +08:00
满月叶
0f8c30b6c6 Update readme.md
Some checks failed
Android CI / build (push) Failing after 14m59s
2024-06-14 12:38:36 +08:00
满月叶
1a25a90358 chore: non-Chinese users tip 2024-06-14 12:37:43 +08:00
MoonLeeeaf
54f1597235 chore: desc, v1.2.1 released
Some checks failed
Android CI / build (push) Failing after 19m57s
2024-06-09 12:51:13 +08:00
MoonLeeeaf
68b3d96fdd fix: No updatrs 2024-06-09 12:48:17 +08:00
11 changed files with 670 additions and 75 deletions

View File

@@ -1,50 +0,0 @@
{
"allFiles": [
{
"file": "/storage/emulated/0/铃芽の文件/Projects/FuckMaoNemo/app/src/main/res/xml/config.xml",
"selection": {
"end": {
"column": 15,
"index": 519,
"line": 17
},
"start": {
"column": 15,
"index": 519,
"line": 17
}
}
},
{
"file": "/storage/emulated/0/铃芽の文件/Projects/FuckMaoNemo/app/src/main/java/io/github/moonleeeaf/fuckmaonemo/Hook.java",
"selection": {
"end": {
"column": 28,
"index": 5956,
"line": 146
},
"start": {
"column": 28,
"index": 5956,
"line": 146
}
}
},
{
"file": "/storage/emulated/0/铃芽の文件/Projects/FuckMaoNemo/app/build.gradle",
"selection": {
"end": {
"column": 22,
"index": 272,
"line": 14
},
"start": {
"column": 22,
"index": 272,
"line": 14
}
}
}
],
"selectedFile": "/storage/emulated/0/铃芽の文件/Projects/FuckMaoNemo/app/src/main/res/xml/config.xml"
}

BIN
.github/6.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

2
.gitignore vendored
View File

@@ -1,3 +1,5 @@
.androidide
# Built application files
*.apk
*.aar

View File

@@ -12,8 +12,8 @@ android {
applicationId "io.github.moonleeeaf.fuckmaonemo"
minSdk 21
targetSdk 33
versionCode 12000
versionName "1.2.0"
versionCode 18000
versionName "1.8.0"
vectorDrawables {
useSupportLibrary true

View File

@@ -0,0 +1,11 @@
我操 我‌操
他妈 他‌妈
你妈 你‌妈
妈的 妈‌的
傻逼 傻‌逼
智障 智‌障
傻子 傻‌子
CP CP
NM NM
TM TM
MD MD

View File

@@ -6,9 +6,12 @@ import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.view.ViewGroup;
import android.widget.EditText;
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 {
@@ -31,6 +34,40 @@ public class ConfigActivity extends PreferenceActivity {
return false;
});
findPreference("see_miao").setOnPreferenceClickListener((p) -> {
new AlertDialog.Builder(this)
.setTitle("屏蔽词列表")
.setMessage("当期列表:\n" + getPreferenceManager().getSharedPreferences().getString("MIAO_LIST_SHARED", "获取失败!"))
.show();
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 {
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();
}
}
}

View File

@@ -1,8 +1,22 @@
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.net.Uri;
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.webkit.CookieManager;
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;
@@ -11,10 +25,16 @@ import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.net.Proxy;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public class Hook implements IXposedHookLoadPackage {
private static boolean isHooked = false;
@@ -23,9 +43,24 @@ public class Hook implements IXposedHookLoadPackage {
private int nohengheng;
private int aaaa;
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(
@@ -52,6 +87,18 @@ public class Hook implements IXposedHookLoadPackage {
return (Application) XposedHelpers.callStaticMethod(Class.forName("android.app.ActivityThread"), "currentApplication");
}
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 new Pair<>(str, a);
}
public void hook(XC_LoadPackage.LoadPackageParam param) throws Exception {
if (isHooked) return;
else isHooked = true;
@@ -59,10 +106,63 @@ 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;
});
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();
mp.setResult(null);
}
}
}
);
}, true);
// 拦截40x码
load("fuck_40x", () -> {
XposedBridge.log("[FuckMaoNemo] Hook_拦截40x码");
@@ -98,6 +198,53 @@ 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", () -> {
methodToVoid(
getMethod(
XposedHelpers.findClass("com.codemao.nemo.bean.AuthorInfo", classLoader),
"setFork_user",
boolean.class
)
);
});
// 绕过防沉迷
load("fuck_fcm", () -> {
XposedBridge.log("[FuckMaoNemo] Hook_绕过防沉迷");
@@ -108,6 +255,233 @@ 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),
"getLimit",
null //List.class
),
new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
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();
int passed = 0;
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;
passed++;
break;
}
}
if (disadd) {
XposedBridge.log("[FuckMaoNemo] 过滤用户 " + userId + " 的作品 " + workName);
continue;
}
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 null;
}
}
);
});
// 修复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我推荐你吗");
XposedBridge.hookMethod(
getMethod(
XposedHelpers.findClass("retrofit2.Retrofit$1", classLoader),
"invoke",
new Class[] {
Object.class,
Method.class,
Object[].class
}
),
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam mp) throws Throwable {
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
);
}
}
);
}
}
);
*/
});
// 强制显示再创作按钮
load("force_show_rework", () -> {
XposedBridge.log("[FuckMaoNemo] Hook_强制显示再创作按钮");
@@ -153,25 +527,114 @@ public class Hook implements IXposedHookLoadPackage {
// 屏蔽更新
load("fuck_update", () -> {
XposedBridge.log("[FuckMaoNemo] Hook_屏蔽更新");
methodToVoid(
getMethod(
XposedHelpers.findClass("com.codemao.nemo.sdk.update.NetChangeReceiver", classLoader),
"onReceive",
Context.class,
Intent.class
)
);
});
// 强制置顶评论
load("force_top_comment", () -> {
XposedBridge.log("[FuckMaoNemo] Hook_强制置顶评论");
XposedBridge.hookMethod(
getMethod(
XposedHelpers.findClass("cn.codemao.android.update.CodemaoUpdate$Builder", classLoader),
"setEnv",
int.class
XposedHelpers.findClass("com.codemao.nemo.view.CommentOptionDialogV2", classLoader),
"checkIsSelf",
null
),
new XC_MethodHook(){
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam arg0) throws Throwable {
XposedHelpers.setStaticObjectField(
XposedHelpers.findClass("cn.codemao.android.update.util.UpdateConstants", classLoader),
"UPDATE_URL",
"http://114.514.1.1"
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_反屏蔽");
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 {
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(
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();
@@ -191,7 +654,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++;
@@ -202,4 +669,43 @@ 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 {
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

@@ -8,7 +8,22 @@
<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>
@@ -28,12 +43,31 @@
<SwitchPreference
android:key="fuck_update"
android:title="屏蔽更新"
android:summary="此功能会让整个更新功能不可用,若已经收到更新提示请先清理 shared_prefs 才可完全生效" />
android:summary="主页不会弹更新对话框,不会拦截设置里手动查看的更新" />
<SwitchPreference
android:key="fuck_no_proxy"
android:title="反防抓包"
android:summary="效果不太明显,目前只发现账号相关的有反防抓包" />
android:summary="目前只发现账号相关的有反防抓包,真无法抓包就去刷原生安卓吧,亲测有效" />
</PreferenceCategory>
<PreferenceCategory android:title="评论">
<SwitchPreference
android:key="force_top_comment"
android:title="强制置顶评论"
android:summary="灵感来源于 CodeCat可以无视作品作者直接置顶评论注意只支持 Nemo 作品其它无效响应406码" />
<SwitchPreference
android:key="fuck_miao"
android:title="别屏蔽我词语!"
android:summary="让部分屏蔽词无法再被屏蔽,请勿用于恶语相向,否则被举报不要来找我!!\n可能会导致缩短评论字数上限算法有待优化" />
<Preference
android:key="see_miao"
android:title="查看支持防屏蔽的词汇"
android:summary="对应上面的 防屏蔽" />
</PreferenceCategory>
@@ -42,15 +76,65 @@
<SwitchPreference
android:key="fuck_fcm"
android:title="绕过防沉迷"
android:summary="滞空防沉迷检测方法的调用实现无伤速通破解防沉迷,无需 Player 链接" />
android:summary="滞空防沉迷检测方法的调用实现无伤速通破解防沉迷,无需 Player 链接不支持叽叽猫砸进里面的岛3不支持内嵌社区网页的防沉迷那不属于我的能力范围" />
<SwitchPreference
android:key="long_press_share_work_to_open_more_menu"
android:title="万能的长按分享菜单"
android:summary="功能如下:\n获取作品分享口令(有一定风险)" />
<SwitchPreference
android:key="newest_works_filter"
android:title="最新作品过滤"
android:summary="发你吗个逼的广告这他妈谁看你那臭几把玩意 欢迎殴打我手机号 15675696451" />
<Preference
android:key="set_newest_works_filter"
android:title="最新作品过滤列表"
android:summary="可以对上面功能进行配置 支持使用作品名称 用户ID等过滤" />
<SwitchPreference
android:key="force_set_work_myown"
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="已弃用">
<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="强制显示再创作图标"
android:summary="使作品的 再创作 按钮永远显示,即使作品并未设置为开放源代码(显示了也没啥用,服务端给你拦截了:作品未开源" />
android:summary="使作品的 再创作 按钮永远显示,即使作品并未设置为开放源代码(显示了也没啥用,服务端给你拦截了,报错信息为 作品未开源,亲测无效" />
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -1,7 +1,11 @@
由于本人已不属于这个社区, 因此本模块也一同停止更新
## FuckMaoNemo
弥补 编程猫Nemo/点个猫 的不合理特性,功能增强等特性(。・ω・。)
提示:本项目只在 GitHub 存在, **严禁任何人或任何组织在没有得到我的书面许可、公告明示许可及社交账号发帖许可的情况下照搬本仓库** <!-- GitCode, 说的就是你, 到时候如果被我发现你搬我仓库我迟早要找你算账 -->
### 使用
0. 建议点个猫版本为 4.3.4,已安装 LSPosed 框架(由于使用了 XSharedPreferences故免 Root 的 Xposed 框架貌似无法正常运作)

View File

@@ -5,3 +5,4 @@
![评论区接口提示](.github/3.jpg)
![绕过封号查看资料卡](.github/4.jpg)
![阻止401响应码异常登出](.github/5.jpg)
![强制允许编辑简介时换行](.github/6.png)