7 Commits

Author SHA1 Message Date
满月叶
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
7 changed files with 99 additions and 71 deletions

View File

@@ -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
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 17000
versionName "1.7.0"
versionCode 18000
versionName "1.8.0"
vectorDrawables {
useSupportLibrary true

View File

@@ -14,6 +14,7 @@ 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;
@@ -27,6 +28,7 @@ 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;
@@ -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", () -> {
methodToVoid(
getMethod(
@@ -232,20 +271,37 @@ public class Hook implements IXposedHookLoadPackage {
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
null //List.class
),
new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam mp) throws Throwable {
List ls = (List) XposedHelpers.getObjectField(mp.thisObject, "items");
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");
@@ -255,6 +311,7 @@ public class Hook implements IXposedHookLoadPackage {
for (NewestWorksFilter filter : filters) {
if (filter.matches(userId, workName)) {
disadd = true;
passed++;
break;
}
}
@@ -268,7 +325,18 @@ public class Hook implements IXposedHookLoadPackage {
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;
}
}
);
@@ -575,7 +643,7 @@ public class Hook implements IXposedHookLoadPackage {
public interface Callback {
public void onCallback() throws Exception;
}
public void methodToVoid(Method m) {
XposedBridge.hookMethod(m, new XC_MethodReplacement() {
@Override
@@ -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 {
private String type;
private String value;

View File

@@ -78,6 +78,11 @@
android:title="绕过防沉迷"
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="最新作品过滤"

View File

@@ -1,6 +1,6 @@
## 缓更
本项目是根据我个人需求为基准而制作的,因此,我可能不会抽太多时间来更新某些功能,有能力的朋友欢迎 Fork 下来 Pull Requests我很乐意帮你们 Merge 上,谢谢❤️
由于暂无其他功能需求, 因此本项目短期内不会有太大改动
## FuckMaoNemo