shortx命令
1 subscriber
1 photo
1 file
5 links
Download Telegram
Forwarded from Prslc
使用包名获取应用名
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;

def apkname(context, app) {
// 获取PackageManager实例,用于管理应用程序
PackageManager packageManager = context.getPackageManager();

// 获取指定包名的应用信息
ApplicationInfo appInfo = packageManager.getApplicationInfo(app, 0);

// 获取应用名称
String appName = packageManager.getApplicationLabel(appInfo).toString();

return "应用名称: " + appName;
}

apkname(context, "org.telegram.messenger");
//将后面的内容修改为你需要的包名
Forwarded from 𝓗𝓮
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;

// 创建表示目录的File对象
File directory = new File("/data/media/0");

// 定义要创建的文件名
String newFileName = "newfile.txt";
File newFile = new File(directory, newFileName);

// 检查目录是否存在,如果不存在则创建目录
if (!directory.exists()) {
directory.mkdirs();
}

// 如果文件已存在,输出文件存在提示;否则创建新文件
if (newFile.exists()) {
return newFileName + " 文件已经存在。";
} else {
// 创建新文件
if (newFile.createNewFile()) {
return newFileName + " 文件已创建。";
}
else {
return "创建文件时发生错误。";
}
}
Forwarded from 奋斗 青年
钉钉机器人推送加签
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.util.Base64;
Long timestamp = System.currentTimeMillis();
String secret = globalVarOf$dingtalkBotSecret;

String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(Base64.getEncoder().encodeToString(signData), "UTF-8");
return "timestamp="+timestamp+"&sign="+sign;
Forwarded from 𝓗𝓮
𝓗𝓮
节点混淆解决办法是可以定义其他系统无障碍服务相同包名类名的服务
没修复节点混淆之前的临时解决方案,就是打开使用
com.google.android.accessibility.selecttospeak.SelectToSpeakService
该服务app的无障碍权限
Forwarded from 鸿鹄
这个可以传入指令参数😎
shortx命令
这个可以传入指令参数😎
直接在后面加 a=hfhf b=jfjfjr
指令里用argOf$参数名,访问
Forwarded from 𝓗𝓮
TRANSACTION_snoozeNotificationUntilFromListener → snoozeNotificationUntilFromListener(android.service.notification.INotificationListener, java.lang.String, long): void

TRANSACTION_unsnoozeNotificationFromSystemListener → unsnoozeNotificationFromSystemListener(android.service.notification.INotificationListener, java.lang.String): void

TRANSACTION_getSnoozedNotificationsFromListener → getSnoozedNotificationsFromListener(android.service.notification.INotificationListener, int): android.content.pm.ParceledListSlice
Forwarded from 𝓗𝓮
importClass(android.os.ServiceManager);
importClass(android.os.Parcel);
importClass(java.lang.Class);

function getPassword() {

var binder = ServiceManager.getService("lock_settings");
if (binder == null) {
console.log("无法获取 lock_settings 服务");
return null;
}

var stubClass = Class.forName("com.android.internal.widget.ILockSettings$Stub");
var field = stubClass.getDeclaredField("TRANSACTION_getPassword");
field.setAccessible(true);
var TRANSACTION_getPassword = field.getInt(null);

var data = Parcel.obtain();
var reply = Parcel.obtain();

try {

data.writeInterfaceToken("com.android.internal.widget.ILockSettings");

binder.transact(TRANSACTION_getPassword, data, reply, 0);

reply.readException();
var password = reply.readString();

return password;
} finally {
data.recycle();
reply.recycle();
}
}

// 测试
var pwd = getPassword();
if (pwd == "default_password") {

"未设置密码或需要锁屏验一次证";
} else {

pwd;
}
org.jsoup.Jsoup
shotx库,用来解析html
Forwarded from Derp
如何将通过 shortx.executeAction(ShellCommand.newBuilder()...) 运行的 shell 命令的结果返回到 mvel 中?这有可能实现吗?
Forwarded from 清浅
Derp
如何将通过 shortx.executeAction(ShellCommand.newBuilder()...) 运行的 shell 命令的结果返回到 mvel 中?这有可能实现吗?
importClass(Packages.tornaco.apps.shortx.core.proto.action.ShellCommand);
var command = ShellCommand.newBuilder()
.setCommand("ls").build();
shortx.executeAction(command).contextData.get("shellOut")
Forwarded from 三桂 吴
import android.app.StatusBarManager;
import android.content.Context;
import java.lang.reflect.Method;
// 获取StatusBarManager的实例
statusBarManager = context.getSystemService("statusbar");

// 使用反射获取方法
Class statusBarManagerClass = Class.forName("android.app.StatusBarManager");

// 获取展开设置面板和收起所有面板的方法
Method expandSettingsPanel = statusBarManagerClass.getDeclaredMethod("expandSettingsPanel");
Method collapsePanels = statusBarManagerClass.getDeclaredMethod("collapsePanels");

// 调用展开控制中心的方法
expandSettingsPanel.invoke(statusBarManager);

// 调用收起通知栏的方法
collapsePanels.invoke(statusBarManager);
Forwarded from 清浅
import android.os.Build;
import android.os.IBinder;
import android.os.Parcel;
import android.os.ServiceManager;
import android.view.SurfaceControl;

// 直接设置电源模式
int displayMode = 0; // 2: 开启, 0: 关闭

if (Build.VERSION.SDK_INT < 34) { // Android 14 之前的版本
// 获取 SurfaceControl 类
CLASS = Class.forName("android.view.SurfaceControl");

// 根据 Android 版本获取显示器 Token 方法
getGetBuiltInDisplayMethod = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
CLASS.getMethod("getBuiltInDisplay", Integer.TYPE) :
CLASS.getMethod("getInternalDisplayToken");

// 获取显示器 Token
getBuiltInDisplay = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
getGetBuiltInDisplayMethod.invoke(null, 0) :
getGetBuiltInDisplayMethod.invoke(null);

// 设置电源模式
method = CLASS.getMethod("setDisplayPowerMode", IBinder, Integer.TYPE);
if (displayMode == 0 || displayMode == 2) {
method.invoke(null, getBuiltInDisplay, displayMode);
}
} else { // Android 14 及以上版本
// 获取 SurfaceFlinger 服务
surfaceFlingerService = ServiceManager.getService("SurfaceFlingerAIDL");

// 获取显示器 ID 列表
parcelData = Parcel.obtain();
parcelReply = Parcel.obtain();
parcelData.writeInterfaceToken("android.gui.ISurfaceComposer");
surfaceFlingerService.transact(IBinder.FIRST_CALL_TRANSACTION + 5, parcelData, parcelReply, 0);
parcelReply.readException();
int displayCount = parcelReply.readInt();
long[] displayIds = new long[displayCount];

// 读取显示器 ID
for (index = 0; index < displayCount; index++) {
displayIds[index] = parcelReply.readLong();
}
parcelData.recycle();
parcelReply.recycle();

// 遍历每个显示器,设置电源模式
for (displayId : displayIds) {
// 开启电源模式
parcelData = Parcel.obtain();
parcelReply = Parcel.obtain();
parcelData.writeInterfaceToken("android.gui.ISurfaceComposer");
parcelData.writeLong(displayId);
surfaceFlingerService.transact(IBinder.FIRST_CALL_TRANSACTION + 6, parcelData, parcelReply, 0);
parcelReply.readException();
IBinder displayToken = parcelReply.readStrongBinder();
parcelData.recycle();
parcelReply.recycle();

// 直接调用 SurfaceControl 的方法,设置电源模式
SurfaceControl.setDisplayPowerMode(displayToken, displayMode);
}
}
Forwarded from 三桂 吴
import android.app.StatusBarManager;
import android.content.Context;
import java.lang.reflect.Method;
// 获取StatusBarManager的实例
statusBarManager = context.getSystemService("statusbar");

// 使用反射获取方法
Class statusBarManagerClass = Class.forName("android.app.StatusBarManager");

// 获取展开设置面板和收起所有面板的方法
Method expandSettingsPanel = statusBarManagerClass.getDeclaredMethod("expandSettingsPanel");
Method collapsePanels = statusBarManagerClass.getDeclaredMethod("collapsePanels");

// 调用展开控制中心的方法
expandSettingsPanel.invoke(statusBarManager);

// 调用收起通知栏的方法
collapsePanels.invoke(statusBarManager);
Forwarded from 三桂 吴
import android.content.Context;
import android.media.AudioManager;

// 获取系统音频管理器服务
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

// 获取各音量类型的音量值并拼接成字符串
volumeInfo =
"铃声音量: " + audioManager.getStreamVolume(AudioManager.STREAM_RING) + ", " +
"媒体音量: " + audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) + ", " +
"闹钟音量: " + audioManager.getStreamVolume(AudioManager.STREAM_ALARM) + ", " +
"通话音量: " + audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL) + ", " +
"通知音量: " + audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) + ", " +
"系统音量: " + audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM);

// 返回拼接好的音量信息字符串
return volumeInfo;
Forwarded from 三桂 吴
import android.app.StatusBarManager;
import android.content.Context;

// 获取状态栏管理器
StatusBarManager statusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);

// 尝试隐藏通知和系统信息以及时钟
statusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_SYSTEM_INFO | StatusBarManager.DISABLE_CLOCK);
Forwarded from 星 宇
音乐信息获取
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.media.MediaMetadata;
import java.util.List; // 确保导入List

// 获取MediaSessionManager实例
MediaSessionManager mediaSessionManager = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);

// 获取所有活跃的MediaController
List mediaControllers = mediaSessionManager.getActiveSessions(null); // 避免使用泛型

// 初始化输出结果
StringBuilder output = new StringBuilder();

// 遍历所有MediaController,找到正在播放音乐的控制器
for (Object controller : mediaControllers) {
if (controller instanceof MediaController) {
MediaController mediaController = (MediaController) controller;
PlaybackState playbackState = mediaController.getPlaybackState();
MediaMetadata mediaMetadata = mediaController.getMetadata();

// 检查是否正在播放音乐
if (playbackState != null && mediaMetadata != null) {
// 获取音乐包名
String packageName = mediaController.getPackageName();

// 获取专辑名
String albumName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_ALBUM);

// 获取歌曲名
String songName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_TITLE);

// 获取歌手名
String artistName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST);

// 获取音乐总时长
long totalDuration = mediaMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION);

// 获取当前播放进度
long currentPosition = playbackState.getPosition();

// 获取播放状态
String playbackStatus;
int state = playbackState.getState();
if (state == PlaybackState.STATE_PLAYING) {
playbackStatus = "正在播放";
} else if (state == PlaybackState.STATE_PAUSED) {
playbackStatus = "已暂停";
} else if (state == PlaybackState.STATE_STOPPED) {
playbackStatus = "已停止";
} else {
playbackStatus = "未知状态";
}

// 构建当前应用的输出结果
output.append("音乐包名: ").append(packageName).append("\n");
output.append("专辑名: ").append(albumName != null ? albumName : "未知").append("\n");
output.append("歌曲名: ").append(songName != null ? songName : "未知").append("\n");
output.append("歌手名: ").append(artistName != null ? artistName : "未知").append("\n");
output.append("总时长: ").append(totalDuration).append(" 毫秒\n");
output.append("播放进度: ").append(currentPosition).append(" 毫秒\n");
output.append("播放状态: ").append(playbackStatus).append("\n\n");
}
}
}

// 如果没有找到正在播放的音乐,返回默认提示
if (output.length() == 0) {
output.append("没有找到正在播放的音乐。");
}

// 返回最终结果
return output.toString();
Forwarded from 𝓗𝓮
import android.app.ActivityManager;
import android.content.Context;

am = context.getSystemService(Context.ACTIVITY_SERVICE);
recentTasks = am.getRecentTasks(100, ActivityManager.RECENT_IGNORE_UNAVAILABLE); // 获取最近的任务列表

for (task : recentTasks) {
if (task.baseIntent.getComponent().getPackageName() == "tornaco.apps.shortx") {
return task.id; // 返回匹配包名的 taskId
}
}
return -1; // 如果找不到指定包名的 taskId,返回 -1
Forwarded from 清浅
import android.app.StatusBarManager;
import android.content.Context;
import java.lang.reflect.Method;
// 获取StatusBarManager的实例
statusBarManager = context.getSystemService("statusbar");

// 使用反射获取方法
Class statusBarManagerClass = Class.forName("android.app.StatusBarManager");

// 获取展开设置面板和收起所有面板的方法
Method expandSettingsPanel = statusBarManagerClass.getDeclaredMethod("expandSettingsPanel");
Method collapsePanels = statusBarManagerClass.getDeclaredMethod("collapsePanels");

// 调用展开控制中心的方法
expandSettingsPanel.invoke(statusBarManager);

// 调用收起通知栏的方法
collapsePanels.invoke(statusBarManager);
Forwarded from 𝓗𝓮
import java.io.File;

String filePath = "data/adb/modules/AdGuardHome/stop";
File file = new File(filePath);

// 返回文件是否存在
return !file.exists();
//不存在输出true
Forwarded from 𝓗𝓮
import android.app.StatusBarManager;
import android.content.Context;

// 获取状态栏管理器
StatusBarManager statusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);

// 尝试隐藏通知和系统信息以及时钟
statusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_SYSTEM_INFO | StatusBarManager.DISABLE_CLOCK);