|
|
|
|
|
懂autojs的进来看看
其实你没必要写死开播时间, 直播平台一般有主播直播间状态的api, 只要通过平台的api获取直播间状态就行了. 写死开播时间反而增加了代码的复杂度. 写代码是能不增加复杂度就别瞎加. 像这种抓直播间状态的小项目我是写过好几个的, 有b站抓弹幕的, 有b站直播录制的, 有海外色Q直播录制兼抓弹幕的...可以说很多平台都有提供相应的直播间状态的api.
最后于 2022-8-10 07:13
被微启宇编辑
,原因:
|
|
懂autojs的进来看看
首先按官方要求申请忽略电池优化
$timers.addDailyTask({
这问题只要看一下官方文档就能自己解决
不想用官方的定时任务实现可以用 node-schedule 来实现定时任务或者自己写 // 本框内的代码已经过验证可以运行 function addDailyTask (config, func) { config.runNow && func() const nowTime = new Date().getTime() const timePoints = config.time.split(':').map(i => parseInt(i)) let recent = new Date().setHours(...timePoints) recent >= nowTime || (recent += 24 * 3600000) setTimeout(() => { func() setInterval(func, config.interval * 3600000) }, recent - nowTime) } function kuaishoulive () { // you code } config = {//参数的说明 interval: 1, //间隔天数,间隔为整数 runNow: false, //是否立即运行 time: "17:35:00" //执行的时间点 时在0~23之间 } config1 = {//参数的说明 interval: 1, //间隔天数,间隔为整数 runNow: false, //是否立即运行 time: "18:20:00" //执行的时间点 时在0~23之间 } config2 = {//参数的说明 interval: 1, //间隔天数,间隔为整数 runNow: false, //是否立即运行 time: "22:20:00" //执行的时间点 时在0~23之间 } addDailyTask(config, kuaishoulive); addDailyTask(config1, kuaishoulive); addDailyTask(config2, kuaishoulive); 代码摘自: js实现每日定时任务 - 自在逍遥处 - 博客园 (cnblogs.com)
autojs定时任务模块, 官方实现的定时任务效率比自己用javascript写要好, 官方的任务管理是通过Java实现的, 这个com.stardust.autojs.core.timing.TimedTask就是java层的. module.exports = function(runtime, scope){ var timers = Object.create(runtime.timers); var TimedTask = com.stardust.autojs.core.timing.TimedTask; var IntentTask = com.stardust.autojs.core.timing.IntentTask; var TimedTaskManager = com.stardust.autojs.core.timing.TimedTaskManager.Companion.getInstance(); var bridges = require("__bridges__"); scope.__asGlobal__(timers, ['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'setImmediate', 'clearImmediate']); scope.loop = function(){ console.warn("loop() has been deprecated and has no effect. Remove it from your code."); } function parseConfig(c) { let config = new com.stardust.autojs.execution.ExecutionConfig(); config.delay = c.delay || 0; config.interval = c.interval || 0; config.loopTimes = (c.loopTimes === undefined)? 1 : c.loopTimes; return config; } function parseDateTime(clazz, dateTime) { if(typeof(dateTime) == 'string') { return TimedTask.Companion.parseDateTime(clazz, dateTime); } else if(typeof(dateTime) == 'object' && dateTime.constructor === Date) { return TimedTask.Companion.parseDateTime(clazz, dateTime.getTime()); } else if(typeof(dateTime) == 'number') { return TimedTask.Companion.parseDateTime(clazz, dateTime); } else { throw new Error("cannot parse date time: " + dateTime); } } function addTask(task) { TimedTaskManager.addTaskSync(task); } timers.addDailyTask = function (task) { let localTime = parseDateTime("LocalTime", task.time); let timedTask = TimedTask.Companion.dailyTask(localTime, files.path(task.path), parseConfig(task)); addTask(timedTask); return timedTask; } var daysEn = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']; var daysCn = ['一', '二', '三', '四', '五', '六', '日']; timers.addWeeklyTask = function (task) { let localTime = parseDateTime("LocalTime", task.time); let timeFlag = 0; for(let i = 0; i < task.daysOfWeek.length; i++) { let dayString = task.daysOfWeek[i]; let dayIndex = daysEn.indexOf(dayString); if(dayIndex == -1) { dayIndex = daysCn.indexOf(dayString); } if(dayIndex == -1) { throw new Error('unknown day: ' + dayString); } timeFlag |= TimedTask.Companion.getDayOfWeekTimeFlag(dayIndex + 1); } let timedTask = TimedTask.Companion.weeklyTask(localTime, new java.lang.Long(timeFlag), files.path(task.path), parseConfig(task)); addTask(timedTask); return timedTask; } timers.addDisposableTask = function (task) { let localDateTime = parseDateTime("LocalDateTime", task.date); let timedTask = TimedTask.Companion.disposableTask(localDateTime, files.path(task.path), parseConfig(task)); addTask(timedTask); return timedTask; } timers.addIntentTask = function (task) { let intentTask = new IntentTask(); intentTask.setScriptPath(files.path(task.path)); task.action && intentTask.setAction(task.action); addTask(intentTask); return intentTask; } timers.getTimedTask = function(id) { return TimedTaskManager.getTimedTask(id); } timers.getIntentTask = function(id) { return TimedTaskManager.getIntentTask(id); } timers.removeIntentTask = function(id) { let task = timers.getIntentTask(id); return task && TimedTaskManager.removeTaskSync(task); } timers.removeTimedTask = function(id) { let task = timers.getTimedTask(id); return task && TimedTaskManager.removeTaskSync(task); } timers.queryTimedTasks = function (options, callback) { var sql = ''; var args = []; function sqlAppend(str) { if(sql.length == 0) { sql += str; } else { sql += ' AND ' + str; } return true; } options.path && sqlAppend('script_path = ?') && args.push(options.path); return bridges.toArray(TimedTaskManager.queryTimedTasks(sql ? sql : null, args)); } timers.queryIntentTasks = function (options, callback) { var sql = ''; var args = []; function sqlAppend(str) { if(sql.length == 0) { sql += str; } else { sql += ' AND ' + str; } return true; } options.path && sqlAppend('script_path = ?') && args.push(options.path); options.action && sqlAppend('action = ?') && args.push(options.action); return bridges.toArray(TimedTaskManager.queryIntentTasks(sql ? sql : null, args)); } return timers; }
最后于 2022-8-9 04:32
被微启宇编辑
,原因:
|
|
懂autojs的进来看看
问题二不就是获取当前时间然后和设置好的时间进行比较??? autojs官方文档有定时任务的api, 官方描述 "该模块用于管理定时任务,用于在某些时间或某些事件触发时自动运行脚本。正如Auto.js Pro内置的定时任务功能一样,打包的脚本也可以使用这些函数来创建定时任务。"
最后于 2022-8-9 04:27
被微启宇编辑
,原因:
|
|
|
|
想破解一款游戏,求指教
游戏与服务器通讯几乎没有走http的几乎是走socket, 而走socket的用抓包软件抓到的内容由于抓包软件没能解码内容在人类看来就是乱码,想知道游戏与服务器的通讯内容就得逆向分析游戏. 游戏与服务器通讯几乎是通过tcp粘包的方式去通讯, 敢用http通讯的几乎是开着大门让人进家偷东西的行为. 接下来你要做得是结合动态调试去分析so 或 java/lua 看看socket通讯包的struct的结构, 然后在写相应的辅助工具. 估计你要花三个月以上的时间去弄这玩意 这是几款常见常用的开源游戏服务器开发框架,, 你自己去看看有几款是游戏时用到http通讯的 skynet 使用此引擎开发的游戏众多,很多棋牌小企业在用,简悦的陌陌争霸、食物战争等等很多产品 一花科技等棋牌在用 代表做全民无双 已经被电魂网络收购 经过产品验证并且教程比较完善 zooba appstroe排行很高的moba、吃鸡类游戏
最后于 2022-8-6 05:01
被微启宇编辑
,原因:
|
|
|
|
[已解决]路由器AP固件分析问题,求大神分析下。
mszgx 找不到修改MAC命令,就是修改MAC导致校验失败才求助的,factory_args.sh这个应该就是负责校验的,就是不知道校验的原理。 分区校验是bootloader的事, 螃蟹的SDK里的官方版bootloader是没有校验的, 厂商基于SDK自行开发的版本是有分区校验的. 网上可以下载到螃蟹的SDK你自己去看看. 自己看代码, 这是螃蟹芯片SDK里的bootloader代码里关于校验分区的代码片段 //------------------------------------------------------------------------------------------ // check img unsigned int gCHKKEY_HIT = 0; unsigned int gCHKKEY_CNT = 0; #if defined(CONFIG_NFBI) // return, 0: not found, 1: linux found, 2:linux with root found int check_system_image(unsigned long addr, IMG_HEADER_Tp pHeader) { // Read header, heck signature and checksum int i, ret = 0; unsigned short sum = 0, *word_ptr; unsigned short length = 0; unsigned short temp16 = 0; if (gCHKKEY_HIT == 1) return 0; /*check firmware image.*/ word_ptr = (unsigned short *)pHeader; for (i = 0; i < sizeof(IMG_HEADER_T); i += 2, word_ptr++) *word_ptr = *((unsigned short *)(addr + i)); if (!memcmp(pHeader->signature, FW_SIGNATURE, SIG_LEN)) ret = 1; else if (!memcmp(pHeader->signature, FW_SIGNATURE_WITH_ROOT, SIG_LEN)) ret = 2; else dprintf("no sys signature at %X!\n", addr); #if defined(NEED_CHKSUM) if (ret) { for (i = 0; i < pHeader->len; i += 2) { sum += *((unsigned short *)(addr + sizeof(IMG_HEADER_T) + i)); // prom_printf("x=%x\n", (addr + sizeof(IMG_HEADER_T) + i)); } if (sum) { // SYSSR: checksum done, but fail REG32(NFBI_SYSSR) = (REG32(NFBI_SYSSR) | 0x8000) & (~0x4000); dprintf("sys checksum error at %X!\n", addr); ret = 0; } else { // SYSSR: checksum done and OK REG32(NFBI_SYSSR) = REG32(NFBI_SYSSR) | 0xc000; } } #else // SYSSR: checksum done and OK REG32(NFBI_SYSSR) = REG32(NFBI_SYSSR) | 0xc000; #endif return (ret); } #elif defined(CONFIG_NONE_FLASH) // return, 0: not found, 1: linux found, 2:linux with root found int check_system_image(unsigned long addr, IMG_HEADER_Tp pHeader) { // Read header, heck signature and checksum int i, ret = 0; unsigned short sum = 0, *word_ptr; unsigned short length = 0; unsigned short temp16 = 0; if (gCHKKEY_HIT == 1) return 0; /*check firmware image.*/ word_ptr = (unsigned short *)pHeader; for (i = 0; i < sizeof(IMG_HEADER_T); i += 2, word_ptr++) *word_ptr = *((unsigned short *)(addr + i)); if (!memcmp(pHeader->signature, FW_SIGNATURE, SIG_LEN)) ret = 1; else if (!memcmp(pHeader->signature, FW_SIGNATURE_WITH_ROOT, SIG_LEN)) ret = 2; else dprintf("no sys signature at %X!\n", addr); #if defined(NEED_CHKSUM) if (ret) { for (i = 0; i < pHeader->len; i += 2) { sum += *((unsigned short *)(addr + sizeof(IMG_HEADER_T) + i)); // prom_printf("x=%x\n", (addr + sizeof(IMG_HEADER_T) + i)); } if (sum) { // SYSSR: checksum done, but fail dprintf("sys checksum error at %X!\n", addr); ret = 0; } else { // SYSSR: checksum done and OK } } #else #endif return (ret); } #else #if CHECK_BURN_SERIAL unsigned long board_rootfs_length = 0; IMG_HEADER_T linux_imghdr; /* return 0:fail, 2:success, 1: no burn_serial */ int check_burn_serial(unsigned long addr, IMG_HEADER_Tp pHeader) { int ret = 0; if ((pHeader->burnAddr & (1 << 31))) { unsigned long pad; memcpy((void *)(&pad), addr, sizeof(unsigned long)); BDBG_BSN("\tburnAddr=0x%08x, pad=0x%08x", pHeader->burnAddr, pad); if (pHeader->burnAddr == pad) { BDBG_BSN(", ok\n"); ret = 2; } } else { BDBG_BSN("\tfail\n"); ret = 1; } return ret; } #endif // return, 0: not found, 1: linux found, 2:linux with root found int check_system_image(unsigned long addr, IMG_HEADER_Tp pHeader, SETTING_HEADER_Tp setting_header) { // Read header, heck signature and checksum int i, ret = 0; unsigned short sum = 0, *word_ptr; unsigned short length = 0; unsigned short temp16 = 0; char image_sig_check[1] = {0}; char image_sig[4] = {0}; char image_sig_root[4] = {0}; if (gCHKKEY_HIT == 1) return 0; #ifdef CONFIG_NAND_FLASH_BOOTING if (nflashread((unsigned int)pHeader, addr, sizeof(IMG_HEADER_T), 0) < 0) { prom_printf("nand flash read fail,addr=%x,size=%d\n", addr, sizeof(IMG_HEADER_T)); return 0; } #else /*check firmware image.*/ word_ptr = (unsigned short *)pHeader; for (i = 0; i < sizeof(IMG_HEADER_T); i += 2, word_ptr++) *word_ptr = rtl_inw(addr + i); #endif memcpy(image_sig, FW_SIGNATURE, SIG_LEN); memcpy(image_sig_root, FW_SIGNATURE_WITH_ROOT, SIG_LEN); if (!memcmp(pHeader->signature, image_sig, SIG_LEN)) ret = 1; else if (!memcmp(pHeader->signature, image_sig_root, SIG_LEN)) ret = 2; else { prom_printf("no sys signature at %X!\n", addr - FLASH_BASE); } // prom_printf("ret=%d sys signature at %X!\n",ret,addr-FLASH_BASE); #if CHECK_BURN_SERIAL if (ret) { int ret_val = 0; BDBG_BSN("==> check linux:\n"); BDBG_BSN("\tby burn_serial\n"); memcpy((void *)(&linux_imghdr), (void *)(pHeader), sizeof(IMG_HEADER_T)); #ifndef CONFIG_NAND_FLASH_BOOTING ret_val = check_burn_serial(addr + mips_io_port_base + sizeof(IMG_HEADER_T) + pHeader->len, pHeader); #else /* for nand */ goto SKIP_CHECK_BURN_SERIAL; #endif if (ret_val != 1) return ret_val; } BDBG_BSN("\n\tno burn_serial, check by sum\n"); SKIP_CHECK_BURN_SERIAL: #endif if (ret) { #ifdef CONFIG_NAND_FLASH_BOOTING #ifdef NAND_FLASH_BOOT_SPEEDUP unsigned char *ptr_data = (volatile unsigned char *)(pHeader->startAddr | 0x20000000); if (nflashread(ptr_data, addr + sizeof(IMG_HEADER_T), pHeader->len, 1) < 0) { prom_printf("nand flash read fail,addr=%x,size=%d\n", addr, pHeader->len); return 0; } #if 1 // def NAND_FLASH_BOOT_SPEEDUP #ifdef CONFIG_RTK_NAND_BBT for (i = 0; i < pHeader->len; i += 2) { #if CONFIG_ESD_SUPPORT // patch for ESD REG32(0xb800311c) |= (1 << 23); #endif #if defined(NEED_CHKSUM) sum += (unsigned short)(((*(ptr_data + 1 + i)) | (*(ptr_data + i)) << 8) & 0xffff); // sum += rtl_inw(ptr_data + sizeof(IMG_HEADER_T) + i); #endif } #endif #endif #else volatile unsigned char *ptr_data = (volatile unsigned char *)DRAM_DIMAGE_ADDR; if (nflashread(DRAM_DIMAGE_ADDR, addr, pHeader->len + sizeof(IMG_HEADER_T), 1) < 0) { prom_printf("nand flash read fail,addr=%x,size=%d\n", addr, pHeader->len + sizeof(IMG_HEADER_T)); return 0; } #ifdef CONFIG_RTK_NAND_BBT for (i = 0; i < pHeader->len; i += 2) { #if CONFIG_ESD_SUPPORT // patch for ESD REG32(0xb800311c) |= (1 << 23); #endif #if defined(NEED_CHKSUM) sum += (unsigned short)(((*(ptr_data + 1 + i + sizeof(IMG_HEADER_T))) | (*(ptr_data + i + sizeof(IMG_HEADER_T))) << 8) & 0xffff); // sum += rtl_inw(ptr_data + sizeof(IMG_HEADER_T) + i); #endif } #endif #endif #else for (i = 0; i < pHeader->len; i += 2) { #if 1 // slowly gCHKKEY_CNT++; if (gCHKKEY_CNT > ACCCNT_TOCHKKEY) { gCHKKEY_CNT = 0; if (user_interrupt(0) == 1) // return 1: got ESC Key { // prom_printf("ret=%d ------> line %d!\n",ret,__LINE__); return 0; } } #else // speed-up, only support UART, not support GPIO if ((Get_UART_Data() == ESC) || (Get_GPIO_SW_IN() != 0)) { gCHKKEY_HIT = 1; return 0; } #endif #if defined(NEED_CHKSUM) sum += rtl_inw(addr + sizeof(IMG_HEADER_T) + i); #endif } #endif #if defined(NEED_CHKSUM) if (sum) { // prom_printf("ret=%d ------> line %d!\n",ret,__LINE__); ret = 0; } #endif } // prom_printf("ret=%d sys signature at %X!\n",ret,addr-FLASH_BASE); return (ret); } //------------------------------------------------------------------------------------------ int check_rootfs_image(unsigned long addr) { #ifdef CONFIG_RTK_VOIP // Don't check rootfs in voip return 1; #else // Read header, heck signature and checksum int i; unsigned short sum = 0, *word_ptr; unsigned long length = 0; unsigned char tmpbuf[16]; if (gCHKKEY_HIT == 1) return 0; #ifdef CONFIG_NAND_FLASH_BOOTING if (nflashread((unsigned int)tmpbuf, addr, 16, 0) < 0) { prom_printf("nand flash read fail,addr=%x,size=%d\n", addr, 16); return 0; } #else word_ptr = (unsigned short *)tmpbuf; for (i = 0; i < 16; i += 2, word_ptr++) *word_ptr = rtl_inw(addr + i); #endif if (memcmp(tmpbuf, SQSH_SIGNATURE, SIG_LEN) && memcmp(tmpbuf, SQSH_SIGNATURE_LE, SIG_LEN)) { prom_printf("no rootfs signature at %X!\n", addr - FLASH_BASE); return 0; } #if CHECK_BURN_SERIAL board_rootfs_length = #endif length = *(((unsigned long *)tmpbuf) + OFFSET_OF_LEN) + SIZE_OF_SQFS_SUPER_BLOCK + SIZE_OF_CHECKSUM; #if CHECK_BURN_SERIAL { struct _rootfs_padding rootfs_padding; BDBG_BSN("==> check rootfs:\n"); BDBG_BSN("\tby burn_serial\n"); #ifndef CONFIG_NAND_FLASH_BOOTING memcpy((void *)(&rootfs_padding) + sizeof(rootfs_padding.zero_pad), (void *)(mips_io_port_base + addr + length - SIZE_OF_CHECKSUM), sizeof(struct _rootfs_padding) - sizeof(rootfs_padding.zero_pad)); #else /* nand */ goto SKIP_CHECK_BURN_SERIAL; #endif BDBG_BSN("\trootfs_padding.signature[%s]\n", rootfs_padding.signature); if (!memcmp(rootfs_padding.signature, ROOT_SIGNATURE, SIG_LEN)) { BDBG_BSN("\tburn_serial=0x%08x, length=0x%08x", rootfs_padding.len + SIZE_OF_SQFS_SUPER_BLOCK + SIZE_OF_CHECKSUM, length); if (rootfs_padding.len + SIZE_OF_SQFS_SUPER_BLOCK + SIZE_OF_CHECKSUM == length) { BDBG_BSN(", ok\n"); return 1; } else { BDBG_BSN(", fail\n"); return 0; } } BDBG_BSN("\n\tno burn_serial, check by sum\n"); } SKIP_CHECK_BURN_SERIAL: #endif #ifdef CONFIG_NAND_FLASH_BOOTING #ifndef NAND_FLASH_BOOT_SPEEDUP volatile unsigned char *ptr_data = (volatile unsigned char *)DRAM_DIMAGE_ADDR; if (nflashread(DRAM_DIMAGE_ADDR, addr, length, 1) < 0) { prom_printf("nand flash read fail,addr=%x,size=%d\n", addr, length); return 0; } #ifdef CONFIG_RTK_NAND_BBT for (i = 0; i < length; i += 2) { #if CONFIG_ESD_SUPPORT // patch for ESD REG32(0xb800311c) |= (1 << 23); #endif #if defined(NEED_CHKSUM) sum += (unsigned short)(((*(ptr_data + 1 + i)) | (*(ptr_data + i)) << 8) & 0xffff); // sum += rtl_inw(ptr_data + sizeof(IMG_HEADER_T) + i); #endif } #endif #endif #else for (i = 0; i < length; i += 2) { #if 1 // slowly #if CONFIG_ESD_SUPPORT // patch for ESD REG32(0xb800311c) |= (1 << 23); #endif gCHKKEY_CNT++; if (gCHKKEY_CNT > ACCCNT_TOCHKKEY) { gCHKKEY_CNT = 0; if (user_interrupt(0) == 1) // return 1: got ESC Key return 0; } #else // speed-up, only support UART, not support GPIO. if ((Get_UART_Data() == ESC) || (Get_GPIO_SW_IN() != 0)) { gCHKKEY_HIT = 1; return 0; } #endif #if defined(NEED_CHKSUM) sum += rtl_inw(addr + i); #endif } #endif #ifndef NAND_FLASH_BOOT_SPEEDUP #if defined(NEED_CHKSUM) if (sum) { prom_printf("rootfs checksum error at %X!\n", addr - FLASH_BASE); return 0; } #endif #endif return 1; #endif // CONFIG_RTK_VOIP }
最后于 2022-8-5 23:08
被微启宇编辑
,原因:
|
|
[已解决]路由器AP固件分析问题,求大神分析下。
你这个问题是强行修改导致分区校验失败, 一般路由器是有修改MAC的命令, 没必要强行修改. 螃蟹家的芯片一旦出现no rootfs signature at 几乎可以肯定是分区有问题导致校验失败才报的错 这是从你原版固件提取的文件大小(验证方式用万能的7zip右键打开你的原固件即可查看rootfs的内容) 文件内容 这是你分享的怀疑有问题的那个 文件大小 文件内容 至此 可以确定你强制修改固件导致固件校验失败
最后于 2022-8-5 01:30
被微启宇编辑
,原因:
|
|
问一下:30台手机连接电脑用哪个软件好用求解
mb_mezxqhjq 爱我佳鑫,你会搞吧。 在写TC的服务端(纯粹是个人兴趣, 如果你需要弄完了找我要), 给你分享的开源项目里的 https://github.com/likia/DroidLord 有编译好的你可以下载试试看好不好用(访问GitHub要自备梯子) 其实收费的群控系统在国内也是多如牛毛好好找找你就会发现很多这毕竟是国内特色国内的大环境就是如此导致很多人搞
最后于 2022-8-5 03:37
被微启宇编辑
,原因:
|
|
问一下:30台手机连接电脑用哪个软件好用求解
mb_mezxqhjq TC,或者侠客要能PJ,出个1K-2K也可以啊。是吧。 TC的话其实写个服务端然后自己改一下host比PJ要好
最后于 2022-8-4 13:50
被微启宇编辑
,原因:
|
|
问一下:30台手机连接电脑用哪个软件好用求解
mb_mezxqhjq 求软件的,付个3-5百也可以。PJ版本更好 自行开发的软件三五百你也就只能买几个月的使用权, PJ的话这价钱也没几个人做 给你些开源的群控软件, 需要自行修改和编译 https://github.com/oneoy/groupControlByAndroid
https://github.com/kaixuanluo/pc-android-controller-android https://github.com/larsonzhong/GroupControl https://github.com/xxhdxh/XScreencapper
https://github.com/mr-chen-king/auto_control_app https://github.com/openatx/atxserver2
https://github.com/z56402344/stfGroup https://github.com/snakeclub/douyin_fans https://github.com/hufan520xuanxuan/web-all-controller https://github.com/itimetime/stf https://github.com/DeviceFarmer/stf
https://gitee.com/langcai1943/qtscrcpy_tc https://gitee.com/tanshangjun/android_group_control https://gitee.com/smallkingfisher/vacc https://gitee.com/milk-lynk/sixdog-adb https://gitee.com/zhaojiafu323/atxserver2 https://gitee.com/ldsice/AndroidControl https://gitee.com/snakeclub/SmartPhoneCloud
最后于 2022-8-4 06:13
被微启宇编辑
,原因:
|
|
问一下:30台手机连接电脑用哪个软件好用求解
贵就自己写一个, 简单的无非就是遍历设备然后连接 先 `adb devices -l` 遍历设备在解析处理一下返回的结果 然后 `adb -s 设备串号`(USB设备) 连接 之后就可以通过这个连接链路去发送命令给手机上的客户端执行
最后于 2022-8-3 10:00
被微启宇编辑
,原因:
|
|
|
|
[分享]我觉着这样似乎可以彻底防住拖库
安全和效率是矛盾的存在, 想安全就低效率, 想高效率那安全就无法保障. |
|
[求助]还是走论坛交易吧不然像我一样被骗
少年还是买正版软件吧, 现在搞破解的也有不少是骗的, 这是个灰色地带... |