基于auto.js或autox.js的起点7.9.312.1076版本app日签脚本
理论上是兼容所有版本的起点app的,但代码是基于起点7.9.312.1076版本进行开发的,有问题请更新或注明起点版本(也请不要老是更新,每次起点更新的东西你用的到吗?那就是产品经理为了让自己显的有作用加的乱七八糟东西罢了。在不影响日常使用的情况下,不建议更新起点,其他APP也一样,旧手机尤其适用这一规则)
PS:代码仅用于js代码学习、交流、讨论!
起点脚本5.1更新
在原计划发布的5.0版本基础对观看视频的代码逻辑进行了优化,至于未发布的5.0已经被淘汰了,原因是我发现最近起点的看视频时长有增加的趋势,就是说原本绝大部分视频都是看小于等于15秒视频即可获取,但是最近出了一个所谓的“白泽装扮”,视频时长是观看随机的小于等于30秒才可以获取,这是一个信号,意味着后续视频福利的观看时长可能会增长(实际上有一次我在网络波动的情况下测试脚本,开宝箱的视频竟然是观看20秒才可以领取),所以我取消了原计划11月13号发布的脚本5.0,进行延期优化。另外星期二我老爸突然受伤了,我去医院照顾了几天,耽误了点时间今天才写好,而且由于时间匆忙,代码稳定性的测试还没进行就在今天匆匆发布了,大家有问题,多多提出(附截图,以及语言描述,最好是稳定复现的问题,比较好解决)
新增:兼容新版开宝箱福利中心,优化观看视频代码逻辑。
注:脚本每次更新都是对旧版兼容的,新旧的福利中心或者签到页都是兼容
代码是一边学一边写的,大体功能都可以实现(每日视频福利,限时福利,签到,经验翻倍,概率得起点币,抽奖,章节卡碎片,开宝箱),但是有概率某个按键点击事件失效,至今没找到原因,如果你使用了我的代码。并且有这方面的代码基础,可以帮我维护一下,解决这个问题
运行代码前,需要给auto.js无障碍,悬浮窗权限,并且运行前最好先手动打开起点app将一些每日首次启动的意外弹窗点击掉,例如青少年模式,各种促销活动弹窗,之后关闭起点,运行auto.js
起点脚本2.0更新
经过一段时间的测试,再一次优化了代码,进一步降低点击事件的失效问题。
另经过最近的测试,平板电脑不能使用该代码,因为楼主是使用图层来定位某些按键的,平板的图层与手机的不同会导致代码点击事件失效一大部分,目前不打算修复这个问题,等哪天闲下来再说吧。
———————————————————————
起点脚本3.0更新
优化+控件的点击,移除通过图层来获取控件的操作,通过坐标计算点击位置,好处是点击的位置更准确,坏处是脚本运行期间如果弹出意外弹窗(微信消息之类的横屏弹窗)会误点导致脚本运行出错。
运行脚本的手机如果太远古,会因为各种应用卡顿导致脚本运行出问题(例如打开某个页面反应过慢会一直点击,导致最后同一个页面打开很多个),暂不修复这个问题,优化这玩意好难,永远不知道旧手机会卡在哪一步……
———————————————————————
起点脚本4.0更新
新增:兼容两种版本的起点签到页,即,签到获取经验和签到获取章节卡碎片两种版本
注:周日章节卡碎片兑换的操作还是要自己来,因为我也不知道你要换哪一种章节卡,还是自己按照需求换吧
————————————————————————
高频问题1:脚本提示“脚本运行异常,请将起点、auto.js后台清理后尝试重新运行”
原因是因为网络延迟,手机卡顿,或没有定位到“我”的控件坐标,导致脚本在15秒内未能进入福利中心,前两点暂时不知道怎么处理,第三点有两种处理方式,我在代码中提供了两种点击“我”的方案,
分别是:第39-44行代码、第45行代码。
如果方案一二都不行,请对方案二进行更改,将第44行代码的150,改成0-300以内的数字,不同尺寸,分辨率的手机更改的数字不同,请酌情更改。
————————————————————
高频问题2:视频没看完,就提前点击了退出
如图
原因:楼主的代码大量运用了sleep()函数,但sleep()函数本身并不是一个高精度的延时函数,在不同设备中的实际延时存在误差,也就是说,sleep(1000),并没有实际延时1秒。可能实际只延时了0.9秒?或多延时了0.1秒,变成了延时1.1秒。
解决方法:将所有的sleep()手动增加0-100毫秒,也就是sleep(1000)改成sleep(1100),具体改多少取决于你实际距离视频播放完毕差了的秒数乘以1000除以15.
例如离播放完毕差了1.5秒,就提前点击了视频的退出按钮,那计算过程就是1.5*1000/15=100,那sleep(1000)改成sleep(1100),当然,还要考虑网络延迟等情况,建议再酌情加一点,比如sleep(1200)?
鉴于因sleep()函数精度问题产生的bug多产生在视频播放这里,所以只需更改下面代码块的sleep()就可以了
do {
sleep(1000);.//改这里的
video_length--
console.log("倒计时", video_length - count_down + 1)
}
while (video_length > count_down);```
————————————————————
高频问题3:在视频播放页面,弹窗不断循环显示“组件数量:**”文章来源:https://www.toymoban.com/news/detail-806131.html
原因:推测和安卓14系统有关,目前该问题仅在更新了最新的安卓14系统后出现,在原来安卓13或鸿蒙系统中,起点视频播放页面的前端显示组件一共是30个。我根据这个特性来判断视频播放页面是否加载完成,但后续更新安卓14系统的手机,起点视频播放组件却只有20个了,因此产生了这个问题。
解决方法:将代码第418行的:while (control_all.length < 30);中的,“30”,改成“20”,就可以了。
PS:原则上当出现此问题时,脚本运行时前端循环显示的“组件数量:**”是多少,第418行的数字就改为多少,但请注意,当组件数量少于或等于14的时候,脚本就运行不下去了(如果依然运行下去了,也请告诉我,我惊呆了!),请在评论区将运行日志,运行截图,最好还有运行的视频,以压缩包或百度网盘的形式发出来。
————————————————————
附最新代码,代码运行出现问题请评论区贴图,楼主只有3个账号,两台手机(荣耀magic5pro,荣耀30pro)可以测试脚本,测试样本数量远远不够,维护ing……
文章来源地址https://www.toymoban.com/news/detail-806131.html
console.show()
auto.waitFor()
console.setTitle("版本5.1");
console.setPosition(0, device.height / 1.6)
console.setSize(device.width / 2, device.width / 2)
if (auto.service == null) {
log("请先开启无障碍服务!");
} else {
log("无障碍服务已开启");
home()
sleep(1000);
launch("com.qidian.QDReader");
waitForPackage("com.qidian.QDReader");
do {
sleep(1000);
if (text("书架").exists() && text("精选").exists() && text("发现").exists() && text("我").exists()) {
break;
} else {
log("缓冲……")
}
}
while (!(text("书架").exists() && text("精选").exists() && text("发现").exists() && text("我").exists()))
if (text("书架").exists() && text("精选").exists() && text("发现").exists() && text("我").exists()) {
log("起点已启动成功");
sleep(1000);
var thread = threads.start(
function time() {
//计时
let shuzi = 0;
do {
sleep(1000);
shuzi++
}
while (shuzi < 15);
log("脚本运行异常,请将起点、auto.js后台清理后尝试重新运行");
engines.stopAllAndToast()
}
);
swipe(device.width - 50, device.height / 4, device.width - 50, device.height / 2, 500)
sleep(3000);
let uc = id("viewPager").className("androidx.viewpager.widget.ViewPager").scrollable(true).findOne().bounds()
var x1 = uc.right;
var y1 = uc.bottom;
click((x1 - 10), (y1 + 10))
// click(device.width - 150, device.height - 150)
sleep(3000);
if (text("福利中心").exists()) {
log("成功打开“我”");
thread.interrupt()
log("关闭纠错线程");
click("福利中心", 0)
do {
log("缓冲中……");
sleep(1000);
}
while (!(className("android.view.View").text("每日视频福利").exists() || text("每日福利").exists()));
log("已进入福利中心");
log("———————");
sleep(5000);
//每日视频
if (textContains("每日福利").exists()) {
do {
log("每日视频")
sleep(1000);
if (text("明日再来吧").exists() || textContains("今日福利已领完").exists()) {
break;
} else {
className("android.widget.Button").textContains("看视频领福利").click();
video_look()
sleep(2000);
if (textContains("我知道了").exists()) {
click("我知道了", 0)
}
sleep(3000);
}
} while (text("看视频领福利").exists());
if (textContains("看视频开宝箱").exists()) {
log("开宝箱");
textContains("看视频开宝箱").click()
video_look()
sleep(2000);
if (textContains("我知道了").exists()) {
click("我知道了", 0)
}
log("宝箱开完了");
} else {
log("宝箱开完了");
}
} else {
do {
log("每日视频")
sleep(1000);
if (text("明天再来吧").exists()) {
break;
} else {
var video_sum = className("android.widget.Button").findOne().text()
log(video_sum)
var video_loop = video_sum.charAt(2);
if (video_loop == "再") {
break;
} else {
className("android.widget.Button").textContains("看第").click();
video_look()
sleep(2000);
if (textContains("我知道了").exists()) {
click("我知道了", 0)
}
sleep(3000);
}
}
}
while (video_loop != "再" || video_loop <= 8);
}
sleep(3000);
log("每日视频福利已刷完,开始刷限时任务");
log("———————");
//限时任务
let k = 0
do {
log("限时任务")
if (text("看视频").exists()) {
text("看视频").findOne().click()
} else {
break;
}
sleep(3000);
if (text("可从这里回到福利页哦").exists()) {
click("我知道了", 0)
}
video_look()
sleep(3000);
if (text("我知道了").exists()) {
click("我知道了", 0)
k++
sleep(3000);
}
console.log("已完成限时任务", k);
if (k > 2) {
break;
}
}
while (text("看视频").exists());
log("限时任务,已完成,开始签到");
log("———————");
//签到
back()
sleep(1000);
back()
sleep(1000);
// swipe(1200, 1679, 1200, 2480, 500)
sleep(1000);
if (text("签到").exists()) {
click("签到", 0)
sleep(2000);
back()
log("已点击签到");
} else {
log("已签到过了");
}
sleep(3000);
log("———————");
log("刷今日福利");
log("———————");
//今日福利
if (text("今日福利").exists() || text("去抽奖").exists() || text("签到福利").exists()) {
if (text("去抽奖").exists()) {
click("去抽奖", 0)
sleep(3000);
if (textContains("剩余") && ((className("android.view.View").text("抽 奖").exists()) || className("android.view.View").text("看视频抽奖喜+1").exists())) {
back()
sleep(1000);
click("今日福利", 0)
}
} else if (text("今日福利").exists()) {
click("今日福利", 0)
} else if (text("签到福利").exists()) {
click("签到福利", 0)
}
sleep(3000);
if (textContains("当前连续签到").exists()) {
let qiandao = textContains("当前连续签到").findOne().text()
log(qiandao)
//连签礼包
log("连签礼包活动")
if (textContains("连签礼包").exists()) {
sleep(2000);
textContains("连签礼包").findOne().click()
sleep(2000);
back()
sleep(2000);
log("连签礼包已领取")
} else {
log("连签礼包活动结束")
}
log("———————");
if (textContains("章节卡碎片").exists()) {
log("签到领章节卡活动");
} else {
log("签到翻倍经验活动");
}
if (text("去翻倍").exists()) {
text("去翻倍").findOne().click()
video_look()
sleep(2000);
if (text("我知道了").exists()) {
click("我知道了", 0)
sleep(2000);
}
if (textContains("章节卡碎片").exists()) {
log("签到领章节卡活动结束");
} else {
log("签到翻倍经验活动结束");
}
} else {
if (textContains("章节卡碎片").exists()) {
log("签到领章节卡已完成");
} else {
log("签到翻倍机会已用完");
}
}
log("———————");
if (textContains("章节卡碎片").exists()) {
//抽奖活动
log("抽奖活动")
sleep(2000);
if (textContains("抽奖机会").exists() || text("立即抽奖").exists() || text("机会+1").exists() || textContains("点击抽奖").exists()) {
log("开始抽奖")
if (text("立即抽奖").exists()) {
text("立即抽奖").findOne().click()
} else if (text("机会+1").exists()) {
text("机会+1").findOne().click()
} else if (textContains("抽奖机会").exists()) {
textContains("抽奖机会").findOne().click()
} else if (textContains("点击抽奖").exists()) {
textContains("点击抽奖").findOne().click()
}
do {
sleep(1000);
if (className("android.view.View").text("明天再来").exists()) {
break;
}
if (className("android.view.View").text("看视频抽奖喜+1").exists()) {
log("看视频抽奖")
className("android.view.View").text("看视频抽奖喜+1").findOne().click()
} else if (className("android.view.View").text("抽 奖").exists()) {
log("赠送抽奖")
className("android.view.View").text("抽 奖").findOne().click()
}
let video_course = true
let j = 0;
do {
j++
sleep(1000);
if (j > 4 || className("android.view.View").text("明天再来").exists()) {
video_course = false
break;
}
log("等待中……")
}
while (!(textContains("观看视频").exists() || textContains("观看完视频").exists()))
if (video_course) {
video_look()
}
sleep(2000);
if (text("我知道了").exists()) {
click("我知道了", 0)
sleep(2000);
}
}
while (textContains("剩余") && ((className("android.view.View").text("抽 奖").exists()) || className("android.view.View").text("看视频抽奖喜+1").exists()));
sleep(2000);
log("抽奖活动结束")
log("———————");
if (className("android.view.View").text("明天再来").exists()) {
log("返回主界面")
back()
} else {
log("错误");
}
} else {
log("抽奖活动结束");
log("———————");
if (className("android.view.View").text("明天再来").exists()) {
log("返回主界面")
back()
} else {
log("返回主界面")
back()
}
}
} else {
//签到福利——起点币
log("概率得起点币活动");
sleep(3000);
do {
if (!textContains("看视频").exists()) {
break;
}
textContains("看视频").findOne().click()
video_look()
sleep(3000);
if (text("我知道了").exists()) {
click("我知道了", 0)
sleep(3000);
}
}
while (textContains("每天看视频").exists());
sleep(2000);
//抽奖
log("概率得起点币活动结束")
log("———————");
log("抽奖活动")
sleep(2000);
if (text("立即抽奖").exists() || text("机会+1").exists()) {
log("开始抽奖")
if (text("立即抽奖").exists()) {
text("立即抽奖").findOne().click()
} else if (text("机会+1").exists()) {
text("机会+1").findOne().click()
}
do {
sleep(1000);
if (className("android.view.View").text("明天再来").exists()) {
break;
}
if (className("android.view.View").text("看视频抽奖喜+1").exists()) {
log("看视频抽奖")
className("android.view.View").text("看视频抽奖喜+1").findOne().click()
} else if (className("android.view.View").text("抽 奖").exists()) {
log("赠送抽奖")
className("android.view.View").text("抽 奖").findOne().click()
}
let video_course = true
let j = 0;
do {
j++
sleep(1000);
if (j > 4 || className("android.view.View").text("明天再来").exists()) {
video_course = false
break;
}
log("等待中……")
}
while (!(textContains("观看视频").exists() || textContains("观看完视频").exists()))
if (video_course) {
video_look()
}
sleep(2000);
if (text("我知道了").exists()) {
click("我知道了", 0)
sleep(2000);
}
}
while (textContains("剩余") && ((className("android.view.View").text("抽 奖").exists()) || className("android.view.View").text("看视频抽奖喜+1").exists()));
sleep(2000);
log("抽奖活动结束")
log("———————");
if (className("android.view.View").text("明天再来").exists()) {
log("返回主界面")
back()
} else {
log("错误");
}
} else {
log("抽奖活动结束");
log("———————");
if (className("android.view.View").text("明天再来").exists()) {
log("返回主界面")
back()
} else {
log("返回主界面")
back()
}
}
}
} else {
log("———————");
log("未进入今日福利");
}
} else {
log("———————");
log("今日福利点击失败");
}
log("———————");
sleep(1000);
log("脚本已结束,记得清理auto.js后台");
log("控制台3秒后自动关闭");
sleep(3000);
console.hide()
engines.stopAllAndToast()
} else {
log("未成功打开“我”");
}
} else {
log("起点未启动成功,请查看日志查询原因");
}
}
function video_look() {
//计时
log("———————");
log("看视频");
do {
sleep(1000);
if (textContains("观看视频").exists() || textContains("观看完视频").exists()) {
break;
} else {
log("缓冲……")
}
}
while (!(textContains("观看视频").exists() || textContains("观看完视频").exists()))
sleep(1000);
var control_all = "";
do {
control_all = className("android.view.View").find()
console.log("组件数量", control_all.length)
}
while (control_all.length < 30);
var video_length = 0;
for (var i = 0; i < control_all.length; i++) {
if (!isNaN(parseFloat(control_all[i].text()))) {
video_length = control_all[i].text()
break;
}
}
if (video_length === 0) {
video_length = Number(video_length) + Number(15)
log("因网络或手机性能波动,未获取到视频时长,默认视频时长为15秒");
sleep(1010);
}
console.log("视频时长", video_length + "秒")
var video_quit = "";
if (textContains("观看视频").exists() && !video_quit) {
video_quit = textContains("观看视频").findOne().bounds()
} else if (textContains("观看完视频").exists() && !video_quit) {
video_quit = textContains("观看完视频").findOne().bounds()
}
var x1 = 0;
var x2 = video_quit.left;
var y1 = video_quit.top;
var y2 = video_quit.bottom;
var count_down = 0;
console.log("退出坐标", parseInt((x1 + x2) / 2), parseInt((y1 + y2) / 2))
if (textContains("观看视频").exists() || textContains("观看完视频").exists()) {
click(parseInt((x1 + x2) / 2), parseInt((y1 + y2) / 2))
} else {
back()
}
sleep(1000);
var video_flag = "";
do {
if (textContains("可获得奖励").exists()) {
video_flag = textContains("可获得奖励").findOne().text()
console.log("文本获取", video_flag)
}else{
log("缓冲……")
}
}
while (!video_flag);
if (textContains("秒").exists()) {
var video_segment = [];
if (video_flag.includes("秒")) {
var nums = "1234567890";
for (var i = 0; i < nums.length; i++) {
for (var j = 0; j < video_flag.length; j++) {
if (video_flag[i] == nums[j]) {
video_segment.push(video_flag.charAt(i))
}
}
}
}
video_segment = video_segment.join("")
console.log("观看时长", video_segment + "秒")
count_down = Number(video_length) - Number(video_segment)
textContains("继续观看").click()
}else if(textContains("完").exists()){
textContains("继续观看").click()
}
do {
sleep(1010);
video_length--
console.log("倒计时", video_length - count_down + 1)
}
while (video_length > count_down);
console.log("退出坐标", parseInt((x1 + x2) / 2), parseInt((y1 + y2) / 2))
if (textContains("观看视频").exists() || textContains("观看完视频").exists()) {
click(parseInt((x1 + x2) / 2), parseInt((y1 + y2) / 2))
} else {
back()
}
log("关闭视频")
log("———————");
}
到了这里,关于起点读书日签脚本-5.1更新(每日视频福利,限时福利,签到,经验翻倍,领起点币,抽奖)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!