Redmi/红米 10x 5G手机使用初体验、MIUI关闭广告，root流程记录备忘
一、Redmi 10x 5G root流程记录我整理的工具包备份，有爱自取：本文提到的可能用得上的工具整合1.首先，需要通过小米官方解锁BootLoaderhttps://www.miui.com/unlock/index.html下载小米官方解锁工具：1.进入“设置 ->我的设备 -> 全部参数 -> MIUI版本 框连续点击7次解锁开发者选项；2.进入“设置 -> 开发者选项 ->设备解锁状态”中绑定账号和设备（旧账号或者申请过各种开发版内测的账号一般绑定3天即可度过考察期，新账号则需要168小时，也就是7天）3.手动进入Bootloader模式（关机后，同时按住开机键和音量下键直到进入米兔维修界面，左下角显示Fastboot mode）；4.通过USB连接手机，运行解锁工具目录下的miflash_unlock.exe点击 “解锁”按钮；刷入第三方recovery，以wzxs150大佬的twrp 安卓10修改版为例：https://weibo.com/u/6033736159?nick=wzsx150https://weibo.com/ttarticle/p/show?id=2309404160776561631202redmi 10x 5g和一众红米型号的twrp都放在一起的：天翼云盘https://cloud.189.cn/t/uuIzymZZFbey（访问码：yzy9）恒创互联云盘https://pan.hchl.top/#/s/pVWt9 密码：wzsx150没有电信手机的，按照官方提示注册21cn邮箱：https://e.189.cn/help/registerHelp.do?@qs1-2使用当前手机卡所在移动流量环境扫码登录，就可以登录注册对应手机号的@189.cn邮箱了嫌麻烦的提供一个国外的rom下载网站：https://mifirm.net/downloadtwrp/141注意验证md5值，防止文件篡改和下载不完整：MD5 :18d9a7ff3d39dbcbcea47fb69c7927c4之后如果要刷官方卡刷包，第三方rom包，也是推荐务必验证md5完整性，以免文件损坏刷机失败提供一个md5右键属性验证便捷工具：https://www.lt2333.com/device/10x5glittle turtle (乌堆)rom团队的网站，你可以在上面方便地找到最新的卡刷包，可能需要科学上网访问。你可以自行查看页面关于刷机包的md5完整性验证文章，提供了三种工具，方便pc/手机操作：https://shimo.im/docs/8w38WrgQdjHXq3V3/readwindows上的md5右键属性栏快捷查看验证md5的批处理工具下载地址：https://lt2333.lanzoui.com/isRYXgu1hod2、twrp下载完毕，就可以刷入此第三方recovery了[collapse status="false" title="关于此twrp的使用说明"]重要说明：1.本rec支持data分区自动解密，加密的data不用格式化也能在rec下正常使用。请不要随意刷入来历不明的rec，很可能会引发data数据没法解密，从而数据全丢失。官方默认为锁屏密码加密data，进入twrp需要输入锁屏密码。2.理论上本rec支持刷入官方原版全量卡刷包，但会覆盖twrp。3.必须解锁bootloader才能刷入第三方rec，请解锁BL。4.内置root系统/去除root功能，通过root系统，可以使系统获取root权限。5.防止被官方rec覆盖的功能（任意一种即可）：防止覆盖TWRP、root系统等。6.卡刷官方包后，建议关闭avb2.0校验，否则可能会导致因为root而出现开机提示系统损坏。7.如果因为root等导致开机提示系统损坏，可以fastboot线刷boot.img或者刷入关闭校验的vbmeta，恢复正常。请用我自带的一键刷入工具刷入，否则，有出现乱七八糟的问题，不要来问我哈【已知bug】：1.无刷入第三方rec前，必须解锁手机！！再次提醒，刷机有风险，操作请谨慎！2020.06.10首版内容：1.本人基于twrp源码，修改适配安卓10编译系统，将版本号命名为【3.4.1b】以示区别，表示非官方版本号2.支持安卓10系统的动态分区3.支持安卓10系统的data解密（密码是锁屏密码）4.适配安卓10系统的用户空间fastboot，详情可以看本人微博，或百度5.支持卡刷官方完整包6.支持卡刷magisk官方卡刷包，也可以使用twrp内置的root系统（magisk20.3）7.支持FBE多用户解密，例如手机分身、应用分身之类的就是多用户。其他用户不解密也可以正常备份data，解决部分机油无法备份data的问题8.卡刷官方包后，建议关闭avb2.0校验，否则可能会导致因为root而出现开机提示系统损坏。9.如果因为root等导致开机提示系统损坏，可以fastboot线刷boot.img或者刷入关闭校验的vbmeta，恢复正常。twrp下载汇总地址：天翼云盘 https://cloud.189.cn/t/uuIzymZZFbey（访问码：yzy9）恒创互联云盘 https://pan.hchl.top/#/s/pVWt9 密码：wzsx150若链接失效，请联系作者刷入方法：（三个任选一种）1.一键刷入twrp线刷包（一般下载这个即可）：TWRP-XXX-CN-wzsx150-fastboot.7z下载后解压，手机连接电脑，双击运行一键刷入recovery工具.bat文件，按照提示操作，最终通过fastboot模式将rec刷入手机。recovery-twrp卡刷包：TWRP-XXX-CN-wzsx150.zip（需要手机内已刷入第三方rec）：在第三方rec里卡刷，既可以替换成本帖内的twrptwrp镜像文件：recovery-TWRP-XXX-CN-wzsx150.img[/collapse]按照作者提供的方法，我这选择第一种方法，手机使用正常的数据线连接电脑，可以开机状态/fastboot模式都行，一键脚本选择手机对应的状态即可，这里我使用音量减按键+开机键同时按住即可进入fastboot模式，然后数据线连接电脑，电脑端一键运行recovery-twrp一键刷入工具.bat即可刷入；fastboot模式下长按开机键10多秒，手机重启后进入twrp，推荐选择备份 boot分区 和 你当前系统版本的data分区，备份后从手机拷贝备份到电脑或者云端备份，方便以后刷回来；不备份也行，自己到时候找些官方完整线刷包刷回来也行；后续每次刷卡刷包或者第三方rom包后，强烈推荐设置关闭安卓的avb2.0 完整性两个验证，都勾选上，免得开机提示系统损坏，或者卡米，这是联发科的系统额外的安全认证，高通的系统刷机不需要此步骤。[collapse status="false" title="关于假砖救活"]修改boot或者root系统后，开机提示系统损坏或者反复重启进不去系统。fastboot模式下，使用adb-fastboot工具，刷入vbmeta.img（可以是官方的原版文件，也可以是修改版的）注：要求adb-fastboot工具必须支持这些参数，使用wzsx150大佬发布的一键刷入工具里的fastboot工具即可。fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img没错，就是https://cloud.189.cn/t/uuIzymZZFbey 访问码：yzy9这个天翼盘/我的工具包里面救假砖文件夹里面的adb_fastboot_tools-20191020.zip 和对应那个4kb的vbmeta.img[/collapse]3、root 系统：twrp界面 -> 高级-> Root 系统 即可，如果后续刷卡刷包，比如MIUI 12.5之类的，可以选择 高级 -> 防止覆盖TWRP或者Root系统 两者中任意一项即可保留TWRP同时强烈推荐高级设置中关闭安卓的AVB2.0 完整性两项验证，免得后续刷卡刷包或者第三方rom包后，开机提示系统损坏，这是联发科的系统额外的安全认证，高通的系统不需要此步骤。root完毕后，选择重启 重启系统 即可， 此TWRP的root选项自带安装内置的magisk 20.3 ，注意：日常使用中目前不要升级magisk 版本到20.4，别手贱更新，等到确切消息支持redmi 10x 5g后再升级 ，能用就别乱升级！面具（magisk)运行需要谷歌套件服务，和外网环境，可以使用go谷歌安装器或者x谷歌安装器之类的工具安装谷歌套件，然后开启你的v2ray或者trojan，选择代理magisk，就可以正常运行了。对于咱们这种几年没玩root的老一代玩家来说，简单介绍下，面具算是新一代的超级授权管理和第三方模块管理器，内置的权限管理类似以前流行的超级授权之类的，用起来也没什么区别，随便安装你喜欢的Root Explorer或者x-plore 此类root文件管理器，进行你需要的定制修改即可；面具的模块如果出现兼容问题，进入twrp（关机后，同时按住音量上键和开机键等到进入twrp recovery）使用twrp自带的文件管理删掉对应模块文件即可解决；关于卡刷完整包的简介：twrp刷后续的安卓10系统基底下的MIUI11，MIUI 12.05 06之类的完整卡刷包，推荐先使用magisk修复对应的boot分区，将magisk管理器写入boot，获得修改后的boot，然后twrp rec刷入对应的修复过的boot和卡刷包对应data分区，然后选择高级 -> 关闭AVB 2.0 验证，重启即可更多的关于magisk各种模块的运用 ，建议访问酷安app和大佬们交流后操作，联发科的机器，请谨慎操作如果需要刷安卓11版本的MIUI 12.5之类的新包，建议使用残芯大佬的twrp版本供选择：https://weibo.com/1867219241/Juw0MjFBx毕竟szsx150大佬已经养老退出刷机圈了，以后的更新和安卓11更新，不确定是否可用，特别注意残芯大佬支持安卓11版本的twrp好像是不支持data分区自动解锁的，尤其要注意提前备份数据到电脑或者云端，以防数据损坏。二、关闭MIUI12版本的广告和一些推荐的功能修改1.关闭MIUI12版本的广告感谢知乎大佬的方法：https://zhuanlan.zhihu.com/p/288450066一、关闭系统广告点击设置-密码与安全-系统安全。将以下三个按钮全部关闭加入用户体验计划自动发送诊断报告广告服务-个性化广告推荐二、关闭系统自带应用广告点击设置-应用设置-系统应用设置，按照下面提示一个一个全部关闭广告推送提醒[collapse status="false" title="详细操作点开查询："]1.小米视频：消息设置，关闭“未读消息提醒”，体验计划-消息通知管理-关闭“允许通知”按钮。音乐：通知设置，关闭“通知提醒”。当然，如果你平时不用这个软件听歌，可以关闭“个性化内容推荐”/关闭“在线内容服务”这样就变成了纯粹的本地播放器了。短信高级设置-关闭“允许WAP推送”手机管家关闭最下方的“推荐内容”和“仅在WLAN下推荐”手机管理里面还有一个垃圾清理，同样也要关闭“推荐内容”和“仅在WLAN下推荐”搜索消息通知管理-关闭“允许通知”浏览器消息通知管理-关闭“接收通知栏消息”高级设置-关闭“宫格位推送”和“个性化推荐”如果你不喜欢常规的信息流主页，也可以在这个页面开启简洁版主页。（可选）联系人关闭“联系人显示黄页入口”这个功能主要是能查询各种黄页电话信息，如果不喜欢直接关闭更加简洁。日历用户体验计划，关闭“内容推广”应用商店通知设置-关闭“推送消息”和“新手帮助”，点赞评论消息其实也没用可以关闭推荐-关闭“个性化推荐”和“相关推荐”[/collapse]三、其他桌面应用在手机桌面上，点击对应的app进入，按照下方步骤操作1.天气右下角三个点-设置-用户体验计划，关闭“今日资讯卡片”和“天气服务推荐”。2.日历右上角三个点-设置-用户体验计划，关闭“内容推广”3.安全中心中间有一个应用管理，右上角三个点-设置-关闭“应用升级提醒”和“资源推荐”。4.下载管理右上角三个点-设置-信息流设置，全部关闭“资源推荐”“热榜推荐”“仅在WLAN下加载”。桌面的应用夹（几个应用放在一个文件夹里面）打开应用夹，轻点一下应用夹名称，即可关闭“猜你喜欢”。我这个新手机升级MIUI12默认是关闭的，如果你的是开启的可以手动关闭6.小米自带搜狗输入法设置-更多设置-语言与输入法，输入法管理，由于系统自带多个输入法包括百度和讯飞，你可以卸掉不需要的输入法。如果你留下的是搜狗输入法，要在输入法管理，设置-输入习惯-关闭“节日活动提醒”其他输入法貌似没有广告。7.非官方渠道手动安装应用建议原则上大家都通过小米官方的应用商店下载，安全放心一点。当然有时候会手动从别的渠道下载一些手机软件，安装的时候就会出现广告推荐，可以关闭。在安装界面，点击右上角，设置-资源推荐，关闭即可。8.其他软件至于其他小米自有应用比如小米社区，游戏中心，以及你自己下载的其他应用比如腾讯视频，今日头条等等都是可以直接卸载的，或者在软件的个人中心修改消息推广设置。到此，手机的广告已经被全部关闭了。最后：在补充一点，通知栏软件频繁推送的消息，有的是广告，有时候是一些消息动态，如果想省事一点，不希望各种软件消息一大堆，那么可以直接关闭软件通知栏消息推送功能，你会马上感觉世界清净了不少呢。如何关闭软件通知功能？点击设置-通知管理，（分为锁屏通知，悬浮通知和应用角标小红点提醒三种）可以看到所有手机安装的APP点击开关按钮，直接关闭所有消息提醒功能。点击APP的名字，可以具体选择性关闭某一类通知。[collapse status="false" title="便携便签图片归纳："]可以参考下图便签保存方便携带或者可能有些过时的MIUI 11旧版总结便签图片：[/collapse]方法二：呼唤小爱同学声控指令：关闭广告2.屏幕的设置和护眼细节定制设置 -> 显示 -> 防闪烁模式适合晚上低亮度环境改成dc调光，不会出现斜条纹和闪烁，保护视力，同时屏幕会略变红和暗淡些，不过夜晚一般都是看看小说，不至于折腾自己眼睛需要多么闪耀的色彩，推荐打开设置 -> 显示 -> 色彩风格 标准 会有比较准的色彩表现，如果你对白底的彩虹偏色反感，可以尝试此色彩风格，搭配下面的色温盘自行调整合适 的冷色风格，达到不错的白底显示效果设置 -> 显示 -> 浅色模式/深色模式 推荐打开定时开启深色设置 -> 显示 -> 护眼模式 也可以选择定时开启护眼模式搭配深色模式效果更佳，护眼模式就是所谓的大黄屏，搭配深色模式，拉满护眼大黄屏也不碍事。设置 -> 更多设置 -> 单手模式 可以方便地对菜单进行单手掌控显示 控制中心与状态栏 屏幕刘海 选择喜好的隐藏刘海模式，这样额头会比下巴还宽一些，不过会稍微的对称一点，应用内刘海设置可以进一步定制每一个app的刘海显示模式。如果是默认的刘海圆角，在remote desktop查看远程windows的时候，四角的窗口关闭x 会看不见，还是有些不便的，红米10x 5g这屏幕视觉设计确实不乍地3.可用的谷歌相机选择，提升夜景体验下载工具包里面的任意一个相机apk即可，注意在谷歌相机打开后设置谷歌白平衡关闭，允许第三方相册打开，这样就可以正常使用了。取景框卡顿问题之前提到过，可能是联发科 isp性能问题，或者是缓存区间代码不兼容，不过不影响拍摄成像效果，作为夜景辅助还是不错的选择，不过嘛正常人谁天天拍夜景啊谷歌相机4.和平精英解锁60帧设置，万象息屏常亮破解6GB运存版本对于和平精英目前暂未适配高帧数，使用pubgtool解锁60帧即可：https://www.pubgtool.cn/万象息屏常亮破解方法目前有两种：第一种，使用magisk刷入对应版本系统的常亮万象息屏模块，酷安@一只handsome 大佬提供如下：1.刷对应版本系统，然后用magisk刷入对应的万象息屏常亮模块：先刷MIUI12 20.7.2版本，完整包如下：https://pan.baidu.com/share/init?surl=C8gLop-EJwEMcN7qDonMhw 访问码24u22.使用magisk刷入常亮模块：https://pan.baidu.com/share/init?surl=bh0UWIzPtuO84wy7kT1nkw 访问码0eio3.进入手机管家，找到万象息屏，卸载更新，就可以运行刚才刷入的默认版本万象息屏，选择显示模式，始终显示即可第二种 手动修改机型验证代码，酷安@看了帖子想刷机 大佬手动修改代码流程提供如下：[collapse status="false" title="手动修改机型验证代码"]众所周知，官方以无低功耗功能为由阉割了息屏显示，但我实测息屏常显后发现，功耗比较低，不值得被阉割。所以就有了今天这期教程，首先先感谢@长殊途 提供的思路方法，没有他我也不会原理：取消机型验证首先先下载mt管理器获取root权限，进去打开根目录然后按照图中目录最重要的一步，看好了，另一列文件栏搞到内置存储，复制到内部存储然后点查看将包内的class.dex文件通过Dex编辑器++打开编辑机型代号如下图如小米10青春版VANGOGH搜索你的机型代号以我的小米10青春版为例搜到的两行代码都删掉（改成小米官方支持万象息屏常显的机型代码也是可以的）然后打包用安装狮安装然后就大功告成了如果不想自动升级导致恢复又要重新改的，那就在小米应用商店里永久忽略万象息屏更新。@FREEX 大佬顺便做了个edxposed模块顺便整合到整合工具包里：edxposed万象息屏常显模块在edxposed管理器中激活此模块，适合各种版本系统中使用。[/collapse]三、红米10x 5g使用体验浅谈上一次使用小米系统的手机，还是红米note3的时候了，多年后回归，发现MIUI的进步还是非常明显的各种细节的设定，有匠人精神那味儿了，人性化和使用便利方面确实让人赞叹MIUI 12的隐私保护，每一步让人有着用自己的系统的控制权，有点用linux的味道了哈哈，然而却非常亲民容易上手，普通人也容易理解，不过据说对安卓11版本的最新MIUI12优化问题还是挺多，很多人表示系统界面操作挺卡，不清楚是安卓11本身问题，还是小米的攻城狮对新系统的拿捏和理解还不太到位，不过相信不久后的表现会让人满意的。那么大致说下这款千元入门级5g手机的体验感受吧：1.屏幕三星的e2 Amoled屏幕显示色彩还是相当不错的，600尼特亮度，峰值800尼特的效果，太阳下表现完全满足，而夜间支持dc调光+miui暗色模式+护眼模式三重护航，搭配色温的自定义调整，对于咱这种中老年玩家来说，60hz完全够用，那么这块屏幕可以说是全能完美的屏幕了，出可靓丽色彩饱满通透，入可温柔细腻朴素护眼，真是居家旅行必备贴心之选那么作为千元机，不足也是有的，屏幕的设计，不说下巴和刘海问题吧，四个角比较夸张的圆弧，从功能上切掉了本来应该显示的一些区域，上面提到过，如果你连接远程桌面，窗口两侧的控制按钮就只能凭感觉操作了，确实有些不妥，考虑到这手机较长的身材，高性能的天玑820 处理器，影音娱乐游戏定位很明显，那么作为生产办公方面的一些小问题，倒也可以理解了。2.处理器作为京东1219元入手的6+128GB配置来说，这个价位，不，应该说1500元以内，这款手机处理器是最能打的了，媲美骁龙845的cpu处理性能，比骁龙750G强30%的gpu表现，就目前日常和游戏体验来说，确实非常不错，拼多多收菜，支付宝微信后台切换，都非常流畅，有着中端手机的表现了，用如今检验游戏性能的作品：原神 来测试，中特效1080p +60帧，全程也比较流畅的，除去偶尔的不知是原神本身还是MIUI优化的问题引起的短暂掉帧，整体体验还是完全ok的，不过这游戏耗电简直令人震惊，目测4520mah电板干不了3小时就能被掏空，怕了怕了，物理防沉迷醉了3.拍照最近天气不好，抽空再发样片，白天日常拍照记录，还是不错的，暗处涂抹感还是比较明显的，使用移植适配的谷歌相机，夜景倒还过得去，对于不是热衷拍照的朋友来说，4800w像素，足够你使用，表现中规中矩，不差，考虑到一台手机最重要的处理器和屏幕方面堆料的厚道和1200元价格，真的可以说是真正意义上的水桶机了，当然，有的人nfc功能是刚需，不过我嘛，用不到这功能哈哈对了，谷歌相机取景缩略图会有明显卡顿，自行体验，两个版本推荐你挑着试试看：谷歌相机据说是联发科cpu isp性能问题，还有别的说法什么的，反正凑合用吧，正常人谁天天拍夜景啊对吧！4.音乐虽然是单扬声器，不过音量和音质都还可以，耳机内放，表现也还不错，虽然比起我之前玩的洋垃圾lg v20 4路DAC hifi 差不少，但是底噪和人声表现能正常听，还行。而作为同价位热门竞品的realme q2 pro，似乎不少人反馈扬声器表现破音，塑料后盖共振，哈哈，如果要在1200元讲究点音质的，还是看看10x 5g吧！不过q2 pro 65w 39分钟能充满电，color os的续航都比redmi好不少的，快节奏的朋友，喜欢8gb运存的，可以买来试试看5.续航续航表现，对于我轻中度使用来说，整天剩余40-50%电量算常见情况，不过我关闭了5g，不怎么玩游戏，还未参与安卓11 内测的蹂躏，所以电量表现还是很够用的，据说MIUI 11 ,11.0.5版本好像更加省电，不过这个版本似乎看4k比较卡顿，有一些其他地方的小问题，自行刷机体验看看吧，个人觉得虽然快清完库存停产了，不过MIUI 12的优化肯定还会继续的，跟着官方步伐升级，最后选个安卓11 稳定合适的版本养老还是明智选择的，MIUI 12，比MIUI 11功能还是多不少的，提前养老不太推荐啊。更多使用体验，说不定以后会更新一二
利用Auto.JS编辑自动脚本刷起点读书阅读时间，助你顺利进入王者PK适用于安卓手机/模拟器，可能需要root
一、缘起Auto.js在钉钉打卡，刷视频点击，刷微信朋友圈点赞以及手机网游自动刷怪方面的应用很普遍，类似于按键精灵，不过更加注重代码化，功能也高端不少，（以上都是胡扯，其实我从来都没用过）实际起因是这次疫情呆家里读了一星期的起点刷了1200分钟铂金级别阅读pk时间，发现对手竟然抱着一本辣鸡书连续看十几个小时，我立马觉得这肯定是挂 ::aru:despise::作为礼尚往来的新时代读者，立马打开搜索引擎，发现了AutoJS这个有意思的玩意，研究了半个小时AutoJS官方文档，利用我浅薄的代码知识，写了个起点读书pk阅读时间的小脚本，方便大家pk王者，解放双手：auto.waitFor();//初次运行等待辅助服务启动完成 //亮度模式手动(0),最低亮度(0),如果自动模式则为(1),亮度取值范围(0-255),手机版本差别，一般0-9都是最低亮度 device.setBrightnessMode(0); device.setBrightness(9); setScreenMetrics(1440, 2560); var count = 0;//这是一个计数器，用来触发末尾不定时唤起AutoJS到前台的操作，防止安卓kill //初次启动寻找书籍并打开 while(1){ launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader"); sleep(5000);//老年机用户酌情增加此项时间 var w = id("btnTopSearch").findOne(1000);//留合适的等待时间让脚本查询此控件是否存在 //如果没找到初始启动的搜索按钮则返回null，跳过搜书阶段（适用于已在阅读状态下运行此脚本） if (w != null){ w.click(); //通过布局范围分析拿到需要的控件id和text属性以及边界范围，指定搜索书名自行修改 id("booksview_activity_search_edittext").findOne().setText("诡秘之主"); sleep(1000); /*查询得到class:android.widget.TextView id:bookshelf_bookname边界(152,320,981,408)， 随意点击x(153-980),y(321,407)范围内即可，此处点击正中央坐标*/ var widget = id("bookshelf_bookname").findOne().bounds(); click(widget.centerX(), widget.centerY()); sleep(1000); } break; } while(1){ //模拟一段仿生学滑屏曲线手势，当然您也可以直接一段粗暴的swipe滑动替代 var x1 = random (400,500); var y1 = random (600,800); var x2 = x1+random (-4,-2); var y2 = y1+random(-8,-3); var x3 = x2+random (-15,-10); var y3 = y2+random(-10,-8); var x4 = x3+random (-60,-30); var y4 = y3+random(-5,0); var x5 = x4+random (-100,-60); var y5 = y4+random(0,5); var x6 = x5+random (-150,-80); var y6 = y5+random(8,15); //设置一个回滚翻页随机触发器，模拟真实读书情况 var random_back = random (1,50); var check= 8; gesture (random(360,500),[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x5,y5],[x6,y6]); count = count + 1; sleep(random(20000,25000)); /*30次翻页内随机执行回滚翻页的概率是1-0.98^30≈54.5%， 避免长时间后台闲置，此处做一个|或判断count>=30 */ if(check == random_back|count>=30){ //这是一个优雅的回滚翻页手势，做到了坐标的重复利用亦不失美感。 gesture (random(450,600),[x6,y6],[x5,y5],[x4,y4],[x3,y3],[x2,y2],[x1,y1]); sleep(1000); /*模拟切出起点看看时间喝喝茶，顺便将AutoJS唤到前台透透气，最长间隔是（500ms+25000ms)x30, 约为12分45秒，如果你后台死的快，自行调整间隔。 */ launch("org.autojs.autojs"); waitForPackage("org.autojs.autojs") sleep(2000); launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader") count =0; sleep(random(2000,3000)); } }二、温馨提示1.在其他app上执行手势等操作需要开启安卓的辅助功能，自行百度自己机型和安卓版本的开启方式2.不确定高级版本安卓是否需要root权限执行3.新版本的AutoJS因为法律原因作者关闭了辅助点击功能（可能），您使用前也请注意账号安全，防刷检测可能随时升级。4.坐标位置我这是2k屏幕1440x2560竖屏位置匹配，您可能需要自己微调，或者使用固定自动匹配字符，比如w=screen.width之类的语句通用匹配。复杂界面查询控件代码高级用法需要组合布局层次分析找到具体层级深度参数，参考：className("android.widget.LinearLayout").depth(15).drawingOrder(4).row(3).findOne().click();5.请适度使用控制难度，避免索然无味6.怀着敬畏之心，真正的大佬比你想象的要疯狂7.同上，大佬的王者pk，一天不止1440分钟，1440只是入门，1441-1448分钟/天，才是大佬的竞技场，莫pk上火最后身心俱疲8.每天2小时，做完1200分钟领完全部积分收益即可，下方示例图只是刷死对面这丫，此篇脚本诞生的万恶之源，切勿模仿 ::aru:knife::三、学而不厌想学更多？分享一些大佬的脚本范例供参考学习：[collapse status="false" title="惠头条自动刷视频脚本"]以下代码源于autojs论坛: auto.waitFor() setScreenMetrics(1080, 2160); //设置媒体音量 device.setMusicVolume(0) threads.start(function(){ while(true){ id("img_close").findOne().click( } } threads.start(function(){ while(true){ text("安全升级").findOne() click("以后再说")} }) //五小时之后，运行惠头条视频脚本 threads.start(function() sleep(5.5*60*60*1000) text("奇趣").findOne() engines.execScriptFile("./惠头条视频.js"); exit() }) threads.start(function(){ sleep(20000) //设置亮度 // device.setBrightnessMode(0) sleep(1000) device.setBrightness(3) }) threads.start(function(){ //以下为子线程 //遇到加锁软件自动关 while(true) id("confirm_lock_pattern_view").findOne() back() } }); //遇到打开软件弹窗，则关闭 threads.start(function(){ while(true){id("img_close").findOne().click()} }) //遇到忽略，点击忽 threads.start(function(){ while(true){text("忽略").findOne().click() } }) //如果遇到时段奖励，则领 threads.start(function(){ while(true){ text("奇趣").findOne() click(943,139) sleep(60*60*1000) } }) //遇到时段奖励的弹窗则关闭 threads.start(function(){ while(true){id("tv_click_more").findOne().click() } }) launchApp("惠头条") sleep(11000) while(true){ if(text("奇趣").exists()) sleep(2000) swipe(611,361,611,953,1000) sleep(3000) click(560,1164) }else for(var g=0;g<20;g++){ sleep(4500) swipe(300,900,300,700,500) } sleep(4500) back() } sleep(1000) }[/collapse][collapse status="false" title="趣头条自动刷视频脚本"]以下趣头条脚本代码来源于autojs论坛 "auto"; //打开趣头条 app.launch("com.jifen.qukan"); //每隔1秒检测趣头条是否打开 waitForActivity("com.jifen.qkbase.main.MainActivity", 1000); //获取任务按钮的位置 var renwu = id("com.jifen.qukan:id/jz").findOne().bounds(); //点击任务按钮 huqb_click(renwu, "点击任务按钮签到"); //点击头条按钮回到首页 var shouye = id("com.jifen.qukan:id/jv").findOne().bounds(); huqb_click(shouye, "点击首页按钮回到主页面"); for(var index=0;index<100;index++){ //如果时段奖励存在则领取时段奖励 if (className("android.widget.TextView").text("60").exists()) { var lingqu = className("android.widget.TextView").text("60").findOne().bounds(); huqb_click(lingqu, "领取时段奖励"); } //查找新闻位置 if (id("com.jifen.qukan:id/z0").findOne(6000) != null) { var xinwen = id("com.jifen.qukan:id/z0").findOne(6000); huqb_click(xinwen.bounds(), "查看新闻:" + xinwen.text()); sleep(random(1000, 3000)); //进入新闻开始阅读 if (id("com.jifen.qukan:id/fh").findOne(6000) != null) { //阅读文章 for (var i = 0; i < 20; i++) { var width = device.width; var height = device.height; var startX = random(100, width - 100); var startY = random(height - 300, height - 100); var endX = startX + random(-20, 20); var endY = startY - random(500, 1000); var swipeTime = random(1000, 3000); swipe(startX, startY, endX, endY, swipeTime); } //返回首页 for (var i = 0; i < 10; i++) { back(); sleep(1000); if (id("com.jifen.qukan:id/jv").findOne(6000) != null) { log("阅读文章完毕，返回到首页"); break; } } waitForActivity("com.jifen.qkbase.main.MainActivity", 1000); shouye = id("com.jifen.qukan:id/jv").findOne().bounds(); huqb_click(shouye, "点击刷新按钮刷新新闻"); }; } else { //没有找到则刷新新闻 var shouye = id("com.jifen.qukan:id/jv").findOne().bounds(); huqb_click(shouye, "点击刷新按钮刷新新闻"); } } //自定义点击事件 function huqb_click(pos, msg) { var x = pos.left; var y = pos.top; var width = pos.right - pos.left; var height = pos.bottom - pos.top; var tapX = x + random(10, width - 10); var tapY = y + random(10, height - 10); click(tapX, tapY); sleep(random(1000, 3000)); log(msg); }[/collapse][collapse status="false" title="蚂蚁头条自动脚本"]沐泠的蚂蚁头条脚本: "auto"; var max=dialogs.input("大约刷多少分钟",60); var t=0; var w=device.width,h=device.height; waitForActivity("com.weishang.wxrd.activity.MainActivity"); function cha(){if(currentPackage()!="com.ldzs.zhangxin"){toast("结束"); exit();}} while(t<1.3*max){ sleep(600); id("tv_home_tab").findOne().click(); sleep(800+800*random()); var list=id("pull_list_view").findOnce(); if(list==null)continue; for(var i=1;i<list.childCount();i++){ if(list.child(i)==null)continue; if(list.child(i).find(textContains("广告")).size()!=0)continue; list.child(i).click(); sleep(500); if(currentActivity()=="com.bytedance.sdk.openadsdk.activity.TTRewardVideoActivity"){ idContains("tt_video_ad_close").waitFor(); var closebtn=idContains("tt_video_ad_close").findOnce(); sleep(random(500,1500)); closebtn.click(); sleep(random(800,1800)); continue; } if(currentActivity()=="com.uniplay.adsdk.InterstitialAdActivity"){ classNameContains("android.widget.ImageButton").waitFor(); var closebtn=classNameContains("android.widget.ImageButton").findOnce(); sleep(random(500,1500)); closebtn.click(); sleep(random(800,1800)); continue; } for(var j=0;j<11;j++){ sleep(2400+2400*random()); cha(); var r=random(0,20); swipe(w/2+r,h*0.6+random(0,20),w/2+r,h*0.3+random(0,15),700+r*10); } cha(); back(); t++; sleep(random(800,1800)); } sleep(random(500,2000)); } 适用于安卓7.0以上,需打开无障碍模式[/collapse][collapse status="false" title="阅读强国"]auto(); //辅助权限 console.show(); //按键监听 events.observeKey(); events.on("key_down", function(keyCode, events) { //音量键关闭脚本 if (keyCode == keys.volume_up) { exit(); } }); toast("音量上键关闭脚本"); events.on("exit", function() { device.cancelKeepingAwake(); toast("脚本停止，学习结束，" + "时长" + i + "秒"); }); //打开学习强国app app.launchPackage("cn.xuexi.android"); sleep(1000); //设置屏幕常亮 device.keepScreenOn(); //点击学习主页 desc("工作").findOne().click(); sleep(500); //desc("学习积分").findOne().click(); var 按钮位置=desc("学习积分").findOne().bounds(); click(按钮位置.centerX(),按钮位置.centerY()); sleep(500); //var 任务列表=className("ListView").depth(19); 任务位置=textContains("文章学习时长").findOne().bounds(); console.log(任务位置); click(任务位置.centerX(),任务位置.centerY()); //开始学习，每5秒显示学习时间 var i = 0; var 计时 = setInterval(function() { i = i + 5; toast("已学习" + i + "秒"); }, 5000); //设置总学习时长，默认是15分钟 setTimeout(function() { clearInterval(计时); device.cancelKeepingAwake(); toast("学习结束，" + "时长" + i + "秒"); i = 0; exit(); }, 15 * 60 * 1000);[/collapse]四、渐入佳境既然你耐心看到这了，我就把我琢磨两天的AutoJS常用功能分享一下，希望磕磕绊绊的摸索经历能对你有所启发，让你少走点弯路，如果你有更好的方法，欢迎留言交流！逻辑分析整理首先我们利用processon在线流程图理清思路这是我最初的思路 ，也是目前初级版本实现的功能，除了存储我改用AutoJS自带的storages方法，其他基本上都沿着这个流程图走下来的，所以构思是非常重要的，在制作这张图之前，我对JS从未接触过，所以你也不用太过担心模块分割，化整为零，各个击破思维流程明白之后，我们将功能分离，主体就是两块，一块是自动阅读，一块是领取福利，判断分支依据就是 存储的当前日期记录；这很简单，我们只需要在进入福利领取功能完毕后添加存储记录即可，而至于存储点具体触发位置，不用心急这样两大块的功能模块就分离完毕了，我在上面的自动阅读脚本基础上，将自动阅读细分为三部分：分支判断，自动搜书，自动阅读，预期做三个function，也就是构造函数，或者说方法，都行而自动领取福利这块，初步定下五个部分：日常翻倍10个币，再看15s拿20币，抽奖按钮分支，抽奖机抽奖，和广告观看模块整体思路就比较清晰了里面的逻辑难点，在于显示的“去抽奖”和抽奖机上的“按钮状态”。经过反复观察（AutoJS自带的布局范围分析和布局层次分析组合），我发现去抽奖按钮有三个状态：立即抽奖，机会+1，详情而抽奖机上按钮也有三个状态：“立即抽奖”，“看视频喜加一”，“明天再来”。而困扰我的则是去抽奖>>抽奖机界面判断>>按下抽奖机按钮后>>抽奖或者到达观看广告页面>>广告观看完毕后回来抽奖机按钮状态发生变化，甚至如果“去抽奖”按钮是“机会+1”的时候，直接会与观看广告页面发生逻辑关系这让我的function定位很是杂乱，加上状态的相互触发，我思考了switch，else分支，也思考了if else组合，也思考了function内做分支逻辑后套if else，或者做两个function一个触发分支，再与另一个含参构造函数搭配，或者考虑粗暴的for循环，是否可以和动态的按钮变化相呼应随机应变，但是考虑到会员卡和特殊活动，每天的抽奖机会是3-5甚至更多变化，for循环可操作性太死板，我首先排除了而函数和switch以及if else如何组合，我一时没有主意。在经过不断拆分功能和研究三个模块逻辑关系后，我把每个function需要实现的具体功能准确拆分定位后，使用何种组合和语法反而不重要或者说突然明朗了：方案一：if(去抽奖button) != text(详情) 则 去抽奖，else 返回读书；不管外部从哪种状态来到抽奖机界面，我的抽奖机function内部做状态分支再执行；方案二：去抽奖button三个状态都做好，一一对应抽奖机三个状态，传入对应参数我最后采用了方案二，而且去抽奖只做判断，抽奖机抽奖模式lottery方法内只做点击按钮startLottery功能，将等待抽奖不做函数，直接sleep 8秒，而看广告做成独立function，每一个抽奖结束后再次回到lottery方法后，就可以清楚明白的再次进行分支循环判断了经验所得就是，循环逻辑关系，先接收拼接好，再内部拆分执行第二步的对应function专属功能，这样模块间关系就趋向简洁，模块独立的功能就能专心执行，算是低耦合，高内聚的思想雏形吧！功能细化完毕，那么存储点的位置也清楚了，case 3最后说“明天再来”的状态后，保存当前日期记录进storage细化功能逐个实现，开启调试修补完善功能都确定完毕后，开始逐个命名实现了，具体的缝缝补补过程就不多说，相信你自己摸索体验更佳，这里放出两个半成品示例供参考：一个是for循环执行抽奖机状态切换遍历的失败品[collapse status="false" title="被丢弃的抽奖机状态方法构建思路"]//立即抽奖模块 var lottery = className("android.view.View").text("立即抽奖").findOne(1000); if (lottery != null){ click(lottery.bounds().centerX(), lottery.bounds().centerY()); //进入抽奖机页面 sleep(3000); var lotteryBtn = className("android.view.View").text("抽 奖").findOne(1000); if (lotteryBtn != null){ for (var num = 1; num < 5;num = num + 1){ click(lotteryBtn.bounds().centerX(), lotteryBtn.bounds().centerY()); sleep(10000);//等待抽奖结果 var viewAD = id("openid_list").findOne(1000); if (viewAD != null ){ sleep(10000);//如果进入看视频增加抽奖次数页面，则等待视频播放 viewAD.click(); } } } } //当中途抽奖需要视频加一时 var lotteryAdd = className("android.view.View").text("机会+1").findOne(2000); click(lotteryAdd.bounds().centerX(), lotteryAdd.bounds().centerY()); //进入抽奖机页面 sleep(3000); var lotteryBtn2 = className("android.view.View").text("看视频抽奖喜+1").findOne(1000); if (lotteryBtn2 != null){ for (var num2 = 1; num2 < 5;num2 = num2 + 1){ click(lotteryBtn2.bounds().centerX(), lotteryBtn2.bounds().centerY()); sleep(10000);//等待视频播放 var videoAD2 = id("openid_list").findOne(1000); if(videoAD2 != null){ //如果没有视频次数则不操作 sleep(10000); videoAD2.click(); } }[/collapse]一个是测试当前日期获取的毛坯状态，感兴趣的可以围观[collapse status="false" title="当前时间获取脚本调试"]//当前时间脚本调试 //console.show(); curTime = new Date(); log("当前时间是" + curTime.getFullYear() + "-" + (curTime.getMonth() + 1) + "-" + curTime.getDate() + "(周" + curTime.getDay() + ") " + curTime.getHours() + ":" + curTime.getMinutes() + ":" + curTime.getSeconds()); var dateRecord=curTime.getFullYear() + "-" + (curTime.getMonth() + 1) + "-" + curTime.getDate(); //log(dateRecord); //files.write("/sdcard/脚本/dateRecord.txt", dateRecord);[/collapse]化零为整，打磨抛光各个模块实现细化完毕，过程用到java语法结构在线排错，java格式在线美化基本上功能算是都能运转了注意storages只能存储能JSON化的value，undefined的值需要先toString转换一下，然后对于Data未存储时偶入“去抽奖”一些分支造成的遗漏，补充一些连接逻辑和存储逻辑，最后优化一下自动搜索和阅读的执行逻辑，去掉自动搜索不必要的while循环，修改自动搜书使用 var widget = id("bookshelf_bookname").findOne().bounds();搜索重复多个同id的书架书籍造成错误点击，优化为“布局层次查询”找到准确的位于书架上的书所属控件，点击进去就没问题了最后将这个初代Pro脚本分享如下，虽然 还有定时120分钟读书后自动领取积分和每日推荐那随机出现的5个币我还没做脚本领取，不过至少框架还是非常够用了，再增加7天整除判断周日领取额外70币，差不多就够用了因为不是主业，纯粹爱好初入Java语言编写脚本，语法还是非常幼稚，时间精力因为apk可能随时变动，短时间不准备再做更多功能了，相信你自己肯定能摸索出来大概，再自学下就能拿去自己升级premium版本了哈哈[collapse status="false" title="Auto_QDReader_Pro_v1.2"]//优化了抽奖逻辑，防止页面组件未正常更新；做了自定义挂机书名小功能 "auto"; //系统配置初始化 auto.waitFor(); /*测试正常后注释掉，log不再控制台显示， 从autoJs此脚本设置菜单可查询log.如不需要运行log，将所有log全部注释掉即可*/ //console.show(); //alert("本软件完全免费，请勿上当!") var bookName = rawInput("请输入挂机的书名", "诡秘之主"); //初始化屏幕亮度 device.setBrightnessMode(0); device.setBrightness(9); //存储记录初始化 currentTime = new Date(); var currentDate = currentTime.getFullYear() + "-" + (currentTime.getMonth() + 1) + "-" + currentTime.getDate(); currentDate.toString(); var storage = storages.create("QDReaderCheck"); dateRecord = storage.get("Date"); log("检查当前日期：" + currentDate + "和记录日期：" + dateRecord); log("初始化完毕"); //启动起点读书开始执行脚本功能 launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader"); log("起点读书启动完毕"); sleep(7000); var btnOk = id("btnOk").findOnce(); if (btnOk != null) { btnOk.click(); sleep(1000); } if (currentDate == dateRecord) { //已有福利领取记录，则直接搜书自动阅读 log("进入读书模式"); searchBook(); autoRead(); } else { //否则执行今日福利领取*/ log("进入领取模式"); fanbei(); log("进入每日20点领取"); bonusPoints(); log("查询每日抽奖领取状态"); entryLottery(); //lottery(); } //以上为全部执行模块 //以下是每个构造函数清单 //一、翻倍功能模块 function fanbei() { //每日签到，找到当天的"翻倍"控件边界点击进入看视频界面 log("检查翻倍福利中…"); //var qiandao = className("android.widget.LinearLayout").depth(4).drawingOrder(4).row(-1).findOne(1000); var qiandao = id("layoutBtn").findOne(); if (qiandao != null) { click(qiandao.bounds().centerX(), qiandao.bounds().centerY()); sleep(2000); back(); sleep(4000); click(qiandao.bounds().centerX(), qiandao.bounds().centerY()); } /* else{ var fuli = className("android.widget.TextView").text("今日福利").findOne(1000); click(fuli.bounds().centerX(), fuli.bounds().centerY()); } */ sleep(4000); var fanbei = className("android.view.View").depth(13).drawingOrder(0).row(-1).text("50点").findOnce(); if (fanbei != null) { click(fanbei.bounds().centerX(), fanbei.bounds().centerY()); //观看视频16秒后关闭页面 closeAD(); } } //二、领取20点福利 function bonusPoints() { //领取每日福利20点 log("检查每日福利20币领取中…"); var fuli20point1 = className("android.view.View").text("看15s视频，再领20点").findOnce(); var fuli20point2 = className("android.view.View").text("本周每天看视频，周日领大礼包").findOnce(); if (fuli20point1 != null) { click(fuli20point1.bounds().centerX(), fuli20point1.bounds().centerY()); //观看视频16秒后关闭页面 closeAD(); } else if (fuli20point2 != null) { click(fuli20point2.bounds().centerX(), fuli20point2.bounds().centerY()); //观看视频16秒后关闭页面 closeAD(); } log("已领过每日福利了") sleep(2000); } //三、进入抽奖机判断 function entryLottery() { log("判断抽奖模式中…"); var lottery1 = className("android.view.View").text("立即抽奖").findOnce(); if (lottery1 != null) { log("恭喜，直接前往领奖"); click(lottery1.bounds().centerX(), lottery1.bounds().centerY()); log("进入抽奖机页面"); lottery(); } else { log("翻倍福利已领过了") } var lottery2 = className("android.view.View").text("机会+1").findOnce(); if (lottery2 != null) { log("先看广告增加次数吧！"); click(lottery2.bounds().centerX(), lottery2.bounds().centerY()); //进入抽奖机页面 lottery(); } var lottery3 = className("android.view.View").text("详情").findOnce(); if (lottery3 != null && currentDate !== dateRecord) { log("奖领完了但是还未记录，前往存档…"); click(lottery3.bounds().centerX(), lottery3.bounds().centerY()); //进入抽奖机页面，进行存档 lottery(); } else { log("没奖你进来干嘛？"); //理论上只有手动领完奖后第一次运行此脚本会进入此选项 storage.put("Date", currentDate); back(); log("进入读书模式"); searchBook(); autoRead(); } } //四、抽奖功能模块 function lottery(choice) { log("抽奖模式分析中…"); sleep(1000); var lotteryBtn1 = className("android.view.View").text("抽 奖").findOnce(); var lotteryBtn2 = className("android.view.View").text("看视频抽奖喜+1").findOnce(); var lotteryBtn3 = className("android.view.View").text("明天再来").findOnce(); if (lotteryBtn1 != null) { choice = 1; log("设定抽奖模式一"); } else if (lotteryBtn2 != null) { choice = 2; log("设定抽奖模式二"); } else if (lotteryBtn3 != null) { choice = 3; log("设定抽奖模式三"); } else { log("抽奖结束，进入自动阅读") back(); sleep(1000); searchBook(); autoRead(); } sleep(1000); switch (choice) { case 1: log("抽奖模式一，正在抽奖"); //var lotteryBtn1 = className("android.view.View").text("抽 奖").findOnce(); startLottery(lotteryBtn1); sleep(4000); var lotteryBtn = className("android.view.View").text("javascript:").findOne(); if (lotteryBtn != null) { //console.show() log("find btn"); click(lotteryBtn.bounds().centerX(), lotteryBtn.bounds().centerY()); log("clicked"); } entryLottery(); break; case 2: log("抽奖模式二，前往观看广告…"); //var lotteryBtn2 = className("android.view.View").text("看视频抽奖喜+1").findOnce(); startLottery(lotteryBtn2); closeAD(); sleep(500); var lotteryBtn = className("android.view.View").text("javascript:").findOne(); if (lotteryBtn != null) { //console.show() log("find btn"); click(lotteryBtn.bounds().centerX(), lotteryBtn.bounds().centerY()); log("clicked"); } entryLottery(); break; case 3: log("抽奖结束，保存领取记录…"); storage.put("Date", currentDate); back(); sleep(1000); log("准备自动阅读") searchBook(); autoRead(); break; } } //五、开始抽奖 function startLottery(lotteryBtn) { //var lotteryBtn = id("btnLottery").findOne(2000); //var lotteryBtn = className("android.view.View").depth(5).drawingOrder(0).row(-1).findOne(4000); this.lotteryBtn = lotteryBtn; if (lotteryBtn != null) { click(lotteryBtn.bounds().centerX(), lotteryBtn.bounds().centerY()); log("抽奖中…"); } } //六、关闭广告 function closeAD() { log("等待广告加载…"); var a1 = className("android.widget.ImageView").depth(1).drawingOrder(2).row(-1).exists(); var b1 = className("android.widget.ImageView").depth(1).drawingOrder(1).row(-1).exists(); if (a1 || b1) { log("广告加载完毕，播放中…"); sleep(16000); } var a = className("android.widget.ImageView").depth(1).drawingOrder(2).row(-1).findOnce(); var b = className("android.widget.ImageView").depth(1).drawingOrder(1).row(-1).findOnce(); while (a == null && b == null) { sleep(2000); closeAD(); break; } if (a != null) { log("发现广告关闭按钮a"); a.click(); } else if (b != null) { log("发现广告关闭按钮b"); b.click(); } } //七、搜书功能 function searchBook() { var w = id("btnTopSearch").findOne(1000); if (w != null) { w.click(); id("booksview_activity_search_edittext").findOne().setText(bookName); //id("booksview_activity_search_edittext").findOne().setText("诡秘之主"); //var bookshell = className("android.widget.TextView").depth(4).drawingOrder(2).row(-1).findOne().bounds();//如果下方书架id搜索模式出现不兼容，可以用此条替换 var bookshelf = id("bookshelf_bookname").findOne().bounds(); click(bookshelf.centerX(), bookshelf.centerY()); sleep(1000); } } //八、自动阅读模块 function autoRead() { var count = 0; while (1) { var x1 = random(400, 500); var y1 = random(600, 800); var x2 = x1 + random(-4, -2); var y2 = y1 + random(-8, -3); var x3 = x2 + random(-15, -10); var y3 = y2 + random(-10, -8); var x4 = x3 + random(-60, -30); var y4 = y3 + random(-5, 0); var x5 = x4 + random(-100, -60); var y5 = y4 + random(0, 5); var x6 = x5 + random(-150, -80); var y6 = y5 + random(8, 15); var random_back = random(1, 50); var check = 8; log("开始自动阅读，请安心休息吧!"); gesture(random(360, 500), [x1, y1], [x2, y2], [x3, y3], [x4, y4], [x5, y5], [x6, y6]); count = count + 1; sleep(random(20000, 25000)); if (check == random_back || count >= 30) { gesture(random(450, 600), [x6, y6], [x5, y5], [x4, y4], [x3, y3], [x2, y2], [x1, y1]); sleep(1000); launch("org.autojs.autojs"); waitForPackage("org.autojs.autojs"); sleep(2000); launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader"); count = 0; sleep(random(2000, 3000)); } } }[/collapse][collapse status="false" title="Auto_QDReader_Pro_v1.1"]"auto"; //系统配置初始化 auto.waitFor(); /*测试正常后注释掉，log不再控制台显示， 从autoJs此脚本设置菜单可查询log.如不需要运行log，将所有log全部注释掉即可*/ //console.show(); //alert("本软件完全免费，请勿上当!") var bookName = rawInput("请输入挂机的书名", "诡秘之主"); //初始化屏幕亮度 device.setBrightnessMode(0); device.setBrightness(9); //setScreenMetrics(1440, 2560); //存储记录初始化 currentTime = new Date(); var currentDate = currentTime.getFullYear() + "-" + (currentTime.getMonth() + 1) + "-" + currentTime.getDate(); currentDate.toString(); var storage = storages.create("QDReaderCheck"); dateRecord = storage.get("Date"); log("检查当前日期：" + currentDate + "和记录日期：" + dateRecord); log("初始化完毕"); //启动起点读书开始执行脚本功能 launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader"); log("起点读书启动完毕"); sleep(7000); var btnOk = id("btnOk").findOnce(); if (btnOk != null) { btnOk.click(); sleep(1000); } if (currentDate == dateRecord) { //已有福利领取记录，则直接搜书自动阅读 log("进入读书模式"); searchBook(); autoRead(); } else { //否则执行今日福利领取 log("进入领取模式"); fanbei(); log("进入每日20点领取"); bonusPoints(); log("查询每日抽奖领取状态"); entryLottery(); lottery(); } //以上为全部执行模块 //以下是每个构造函数清单 //一、翻倍功能模块 function fanbei() { //每日签到，找到当天的"翻倍"控件边界点击进入看视频界面 log("检查翻倍福利中…"); //var qiandao = className("android.widget.LinearLayout").depth(4).drawingOrder(4).row(-1).findOne(1000); var qiandao=id("layoutBtn").findOne(); if (qiandao != null) { click(qiandao.bounds().centerX(), qiandao.bounds().centerY()); sleep(2000); back(); sleep(3000); click(qiandao.bounds().centerX(), qiandao.bounds().centerY()); } /* else{ var fuli = className("android.widget.TextView").text("今日福利").findOne(1000); click(fuli.bounds().centerX(), fuli.bounds().centerY()); } */ sleep(4000); var fanbei = className("android.view.View").depth(13).drawingOrder(0).row(-1).text("翻倍").findOnce(); if (fanbei != null) { click(fanbei.bounds().centerX(), fanbei.bounds().centerY()); //观看视频16秒后关闭页面 closeAD(); } } //二、领取20点福利 function bonusPoints() { //领取每日福利20点 log("检查每日福利20币领取中…"); var fuli20point = className("android.view.View").text("看15s视频，再领20点").findOnce(); if (fuli20point != null) { click(fuli20point.bounds().centerX(), fuli20point.bounds().centerY()); //观看视频16秒后关闭页面 closeAD(); } log("已领过每日福利了") } //三、进入抽奖机判断 function entryLottery() { log("判断抽奖模式中…"); var lottery1 = className("android.view.View").text("立即抽奖").findOnce(); if (lottery1 != null) { log("恭喜，直接前往领奖"); click(lottery1.bounds().centerX(), lottery1.bounds().centerY()); //进入抽奖机页面 sleep(3000); lottery(); } else { log("翻倍福利已领过了") } var lottery2 = className("android.view.View").text("机会+1").findOne(1000); if (lottery2 != null) { log("先看广告增加次数吧！"); click(lottery2.bounds().centerX(), lottery2.bounds().centerY()); //进入抽奖机页面 sleep(3000); lottery(); } var lottery3 = className("android.view.View").text("详情").findOne(1000); if (lottery3 != null && currentDate !== dateRecord) { log("奖领完了但是还未记录，前往存档…"); click(lottery3.bounds().centerX(), lottery3.bounds().centerY()); //进入抽奖机页面，进行存档 sleep(3000); lottery(); } else { log("没奖你进来干嘛？"); //理论上只有手动领完奖后第一次运行此脚本会进入此选项 storage.put("Date", currentDate); back(); log("进入读书模式"); searchBook(); autoRead(); } } //四、抽奖功能模块 function lottery(choice) { log("抽奖模式分析中…"); sleep(2000); var lotteryBtn1 = null; var lotteryBtn2 = null; var lotteryBtn3 = null; var lotteryBtn1 = className("android.view.View").text("抽 奖").findOnce(); var lotteryBtn2 = className("android.view.View").text("看视频抽奖喜+1").findOnce(); var lotteryBtn3 = className("android.view.View").text("明天再来").findOnce(); if (lotteryBtn1 != null) { choice = 1; log("设定抽奖模式一"); } else if (lotteryBtn2 != null) { choice = 2; log("设定抽奖模式二"); } else if (lotteryBtn3 != null) { choice = 3; log("设定抽奖模式三"); } else { log("抽奖结束，进入自动阅读") back(); sleep(1000); searchBook(); autoRead(); } sleep(1000); switch (choice) { case 1: log("抽奖模式一，正在抽奖"); //var lotteryBtn1 = className("android.view.View").text("抽 奖").findOnce(); startLottery(lotteryBtn1); sleep(6000); lottery(); break; case 2: log("抽奖模式二，前往观看广告…"); //var lotteryBtn2 = className("android.view.View").text("看视频抽奖喜+1").findOnce(); startLottery(lotteryBtn2); closeAD(); lottery(); break; case 3: log("抽奖结束，保存领取记录…"); storage.put("Date", currentDate); back(); sleep(1000); log("准备自动阅读") searchBook(); autoRead(); break; } } //五、开始抽奖 function startLottery(lotteryBtn) { //var lotteryBtn = id("btnLottery").findOne(2000); //var lotteryBtn = className("android.view.View").depth(5).drawingOrder(0).row(-1).findOne(4000); this.lotteryBtn = lotteryBtn; if (lotteryBtn != null) { click(lotteryBtn.bounds().centerX(), lotteryBtn.bounds().centerY()); log("抽奖中…"); } } //六、关闭广告 function closeAD() { log("等待广告加载…"); var a1 = className("android.widget.ImageView").depth(1).drawingOrder(2).row(-1).exists(); var b1 = className("android.widget.ImageView").depth(1).drawingOrder(1).row(-1).exists(); if (a1 || b1) { log("广告加载完毕，播放中…"); } var a = className("android.widget.ImageView").depth(1).drawingOrder(2).row(-1).findOnce(); var b = className("android.widget.ImageView").depth(1).drawingOrder(1).row(-1).findOnce(); while (a == null && b == null) { sleep(2000); closeAD(); break; } if (a != null) { log("发现广告关闭按钮a"); sleep(16000); a.click(); } else if (b != null) { log("发现广告关闭按钮b"); sleep(16000); b.click(); } } //七、搜书功能 function searchBook() { var w = id("btnTopSearch").findOne(1000); if (w != null) { w.click(); id("booksview_activity_search_edittext").findOne().setText(bookName); //var bookshell = className("android.widget.TextView").depth(4).drawingOrder(2).row(-1).findOne().bounds(); var bookshelf =id("bookshelf_bookname").findOne().bounds(); click(bookshelf.centerX(), bookshelf.centerY()); sleep(1000); } } //八、自动阅读模块 function autoRead() { var count = 0; while (1) { var x1 = random(400, 500); var y1 = random(600, 800); var x2 = x1 + random(-4, -2); var y2 = y1 + random(-8, -3); var x3 = x2 + random(-15, -10); var y3 = y2 + random(-10, -8); var x4 = x3 + random(-60, -30); var y4 = y3 + random(-5, 0); var x5 = x4 + random(-100, -60); var y5 = y4 + random(0, 5); var x6 = x5 + random(-150, -80); var y6 = y5 + random(8, 15); var random_back = random(1, 50); var check = 8; log("开始自动阅读，请安心休息吧!"); gesture(random(360, 500), [x1, y1], [x2, y2], [x3, y3], [x4, y4], [x5, y5], [x6, y6]); count = count + 1; sleep(random(20000, 25000)); if (check == random_back || count >= 30) { gesture(random(450, 600), [x6, y6], [x5, y5], [x4, y4], [x3, y3], [x2, y2], [x1, y1]); sleep(1000); launch("org.autojs.autojs"); waitForPackage("org.autojs.autojs"); sleep(2000); launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader"); count = 0; sleep(random(2000, 3000)); } } }[/collapse][collapse status="false" title="Auto_QDReader_Pro_v1.0"]"auto" //系统配置初始化 auto.waitFor(); /*测试正常后注释掉，log不再控制台显示， 从autoJs此脚本设置菜单可查询log.如不需要运行log，将所有log全部注释掉即可*/ console.show(); device.setBrightnessMode(0); device.setBrightness(9); setScreenMetrics(1440, 2560);//可不设置，理论上自适应各个主流分辨率 //存储记录初始化 currentTime = new Date(); var currentDate = currentTime.getFullYear() + "-" + (currentTime.getMonth() + 1) + "-" + currentTime.getDate(); currentDate.toString(); var storage = storages.create("QDReaderCheck"); dateRecord = storage.get("Date"); log("初始化完毕"); log("检查当前日期：" + currentDate + "和记录日期：" + dateRecord); //启动起点读书开始执行脚本功能 launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader"); log("起点读书启动完毕"); sleep(7000); var btnOk =id("btnOk").findOnce(); if (btnOk != null){ btnOk.click(); sleep(1000); } if (currentDate == dateRecord) { //已有福利领取记录，则直接搜书自动阅读 log("进入读书模式"); searchBook(); autoRead(); } else { //否则执行今日福利领取 log("进入领取模式"); fanbei(); log("进入每日20点领取"); bonusPoints(); log("查询每日抽奖领取状态"); entryLottery(); lottery(); } //以上为全部执行模块 //以下是每个构造函数清单 //一、翻倍功能模块 function fanbei() { //每日签到，找到当天的"翻倍"控件边界点击进入看视频界面 log("检查翻倍福利中…"); var qiandao = className("android.widget.LinearLayout").depth(4).drawingOrder(4).row(-1).findOne(1000); if (qiandao != null) { click(qiandao.bounds().centerX(), qiandao.bounds().centerY()); sleep(1000); back(); sleep(3000); click(qiandao.bounds().centerX(), qiandao.bounds().centerY()); } /* else{ var fuli = className("android.widget.TextView").text("今日福利").findOne(1000); click(fuli.bounds().centerX(), fuli.bounds().centerY()); } */ sleep(4000); var fanbei = className("android.view.View").depth(13).drawingOrder(0).row(-1).findOne(1000); if (fanbei != null) { click(fanbei.bounds().centerX(), fanbei.bounds().centerY()); //观看视频16秒后关闭页面 closeAD(); } } //二、领取20点福利 function bonusPoints() { //领取每日福利20点 log("检查每日福利20币领取中…"); var fuli20point = className("android.view.View").text("看15s视频，再领20点").findOne(1000); if (fuli20point != null) { click(fuli20point.bounds().centerX(), fuli20point.bounds().centerY()); //观看视频16秒后关闭页面 closeAD(); } } //三、进入抽奖机判断 function entryLottery() { log("判断抽奖模式中…"); var lottery1 = className("android.view.View").text("立即抽奖").findOne(1000); if (lottery1 != null) { log("恭喜，直接前往领奖"); click(lottery1.bounds().centerX(), lottery1.bounds().centerY()); //进入抽奖机页面 sleep(3000); lottery(1); } var lottery2 = className("android.view.View").text("机会+1").findOne(1000); if (lottery2 != null) { log("先看广告增加次数吧！"); click(lottery2.bounds().centerX(), lottery2.bounds().centerY()); //进入抽奖机页面 sleep(3000); lottery(2); } var lottery3 = className("android.view.View").text("详情").findOne(1000); if (lottery3 != null && currentDate !== dateRecord) { log("奖领完了但是还未记录，前往存档中…"); click(lottery3.bounds().centerX(), lottery3.bounds().centerY()); //进入抽奖机页面 sleep(3000); lottery(3); } else { log("没奖你进来干嘛？"); //理论上只有手动领完奖后第一次运行此脚本会进入此选项 storage.put("Date", currentDate); back(); log("进入读书模式"); searchBook(); autoRead(); } } //四、抽奖功能模块 function lottery(choice) { log("抽奖模式分析中…"); var lotteryBtn1 = className("android.view.View").text("抽 奖").findOne(1000); if (lotteryBtn1 != null) { choice = 1; log("设定抽奖模式一"); } var lotteryBtn2 = className("android.view.View").text("看视频抽奖喜+1").findOne(1000); if (lotteryBtn2 != null) { choice = 2; log("设定抽奖模式二"); } var lotteryBtn3 = className("android.view.View").text("明天再来").findOne(1000); if (lotteryBtn3 != null) { choice = 3; log("设定抽奖模式三"); } switch (choice) { case 1: log("抽奖模式一，正在抽奖"); var lotteryBtn1 = className("android.view.View").text("抽 奖").findOne(1000); startLottery(lotteryBtn1); sleep(8000); var lotteryBtn1 = null; sleep(1000); lottery(); break; case 2: log("抽奖模式二，前往观看广告…"); var lotteryBtn2 = className("android.view.View").text("看视频抽奖喜+1").findOne(1000); startLottery(lotteryBtn2); var lotteryBtn2 = null; closeAD(); sleep(1000); //稍等抽奖按钮从喜加一刷新为"抽奖"，从而获得准确的抽奖模式 lottery(); break; case 3: log("抽奖结束，保存领取记录…"); storage.put("Date", currentDate); back(); break; } } //五、开始抽奖 function startLottery(lotteryBtn) { //var lotteryBtn = id("btnLottery").findOne(2000); //var lotteryBtn = className("android.view.View").depth(5).drawingOrder(0).row(-1).findOne(4000); this.lotteryBtn = lotteryBtn; if (lotteryBtn != null) { click(lotteryBtn.bounds().centerX(), lotteryBtn.bounds().centerY()); log("抽奖中…"); } } //六、关闭广告 function closeAD() { log("等待广告加载…"); var a1 = className("android.widget.ImageView").depth(1).drawingOrder(2).row(-1).exists(); var b1 = className("android.widget.ImageView").depth(1).drawingOrder(1).row(-1).exists(); if (a1 || b1) { log("广告加载完毕，播放中…"); } var a = className("android.widget.ImageView").depth(1).drawingOrder(2).row(-1).findOnce(); var b = className("android.widget.ImageView").depth(1).drawingOrder(1).row(-1).findOnce(); while (a == null && b == null) { sleep(2000); closeAD(); break; } if (a != null) { log("发现广告关闭按钮a"); sleep(16000); a.click(); } else if (b != null) { log("发现广告关闭按钮b"); sleep(16000); b.click(); } } //七、搜书功能 function searchBook() { var w = id("btnTopSearch").findOne(1000); if (w != null) { w.click(); id("booksview_activity_search_edittext").findOne().setText("诡秘之主"); sleep(1000); var widget = className("android.widget.TextView").depth(4).drawingOrder(2).row(-1).findOne().bounds(); click(widget.centerX(), widget.centerY()); sleep(1000); } } //八、自动阅读模块 function autoRead() { var count = 0; while (1) { var x1 = random(400, 500); var y1 = random(600, 800); var x2 = x1 + random(-4, -2); var y2 = y1 + random(-8, -3); var x3 = x2 + random(-15, -10); var y3 = y2 + random(-10, -8); var x4 = x3 + random(-60, -30); var y4 = y3 + random(-5, 0); var x5 = x4 + random(-100, -60); var y5 = y4 + random(0, 5); var x6 = x5 + random(-150, -80); var y6 = y5 + random(8, 15); var random_back = random(1, 50); var check = 8; log("开始自动阅读，请安心休息吧!"); gesture(random(360, 500), [x1, y1], [x2, y2], [x3, y3], [x4, y4], [x5, y5], [x6, y6]); count = count + 1; sleep(random(20000, 25000)); if (check == random_back || count >= 30) { gesture(random(450, 600), [x6, y6], [x5, y5], [x4, y4], [x3, y3], [x2, y2], [x1, y1]); sleep(1000); launch("org.autojs.autojs"); waitForPackage("org.autojs.autojs"); sleep(2000); launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader"); count = 0; sleep(random(2000, 3000)); } } }[/collapse]对了，进阶功能的实现可是费了我两三天的时间，所以不要觉得自己学了半个小时做不出来就灰心，开头那话说半个小时写出来的是装逼的 ::aru:shy:: ，学习新语言很辛苦的，大家都一样，勤能补拙吧，加油~