const VERSION = '2022618-16' if (!auto.service) { toast('无障碍服务未启动!退出!') exit() } let showVersion = function () { console.log('当前版本:' + VERSION) console.log('Hello, World!') toast('当前版本:' + VERSION) } // alert('请把手机放稳,不要摇晃!', '不然有时候会跳出合伙赢喵币,导致任务阻塞') function getSetting() { let indices = [] autoOpen && indices.push(0) autoMute && indices.push(1) let settings = dialogs.multiChoice('任务设置', ['自动打开淘宝进入活动。多开或任务列表无法自动打开时取消勾选(注意,分身运行淘宝大概率导致任务收益变为100)', '自动调整媒体音量为0。以免直播任务发出声音,首次选择需要修改系统设置权限'], indices) if (settings.length == 0) { toast('取消选择,任务停止') exit() } if (settings.indexOf(0) != -1) { storage.put('autoOpen', true) autoOpen = true } else { storage.put('autoOpen', false) autoOpen = false } if (settings.indexOf(1) != -1) { storage.put('autoMute', true) autoMute = true } else { storage.put('autoMute', false) autoMute = false } } let storage = storages.create("tb_task"); let autoOpen = storage.get('autoOpen', true) let autoMute = storage.get('autoMute', true) getSetting() if (autoMute) { try { device.setMusicVolume(0) toast('成功设置媒体音量为0') } catch (err) { alert('首先需要开启权限,请开启后再次运行脚本') exit() } } console.show() showVersion() console.log('开始完成喵糖任务...') console.log('按音量下键停止') device.keepScreenDim(60 * 60 * 1000) function registerKey() { try { events.observeKey() } catch(err) { console.log('监听音量键停止失败,应该是无障碍权限出错,请关闭软件后台任务重新运行。') console.log('如果还是不行可以重启手机尝试。') quit() } events.onKeyDown('volume_down', function (event) { console.log('喵币任务脚本停止了') console.log('请手动切换回主页面') device.cancelKeepingAwake() exit() }) } threads.start(registerKey) // 全局try catch,应对无法显示报错 try { // 自定义去取消亮屏的退出方法 function quit() { device.cancelKeepingAwake() exit() } // 自定义一个findTimeout,find_f是原本的查询器 text('sss').find() function findTimeout(findF, timeout) { let c = 0 while (c < timeout / 50) { let result = findF.find() if (result.nonEmpty()) return result sleep(50) c++ } return null } // 自定义一个findTextDescMatchesTimeout function findTextDescMatchesTimeout(reg, timeout) { let c = 0 while (c < timeout / 50) { let result = textMatches(reg).findOnce() || descMatches(reg).findOnce() if (result) return result sleep(50) c++ } return null } // 查找任务按钮 function findTask() { var jumpButtonFind = textMatches(/去浏览|去搜索|去完成|去签到|逛一逛|去逛逛|去观看|去参赛/) // 找进入任务的按钮,10秒 var jumpButtons = findTimeout(jumpButtonFind, 10000) if (!jumpButtons) { return null } for (var i = 0; i < jumpButtons.length; i++) { var taskName, content try { taskName = jumpButtons[i].parent().child(0).child(0).text() content = jumpButtons[i].parent().child(0).child(1).child(0).text() } catch (err) { console.log(err) continue } if (taskName) { if (taskName.match(/签到领/)) { console.log('进行签到任务') sleep(1000) jumpButtons[i].click() sleep(8000) return findTask() } if (!(taskName.match(/淘金币|提醒|话费|斗地主|消消乐|流浪猫|开88|扔喵糖|占领|邀请|登录|组队|参与|施肥|浇水|特价版|小鸡|消除|穿搭|森林|点淘|人生|我的淘宝|庄园/) || content.match(/小互动/))) { return [taskName, jumpButtons[i]] } } } return null } function liulan() { // if (textMatches(/.*浏览.*/).findOne(10000)) { // 等待浏览出现 // let v = className('Android.support.v7.widget.RecyclerView').findOnce() // 滑动 // if (v) { // sleep(1000) // v.scrollForward() // } // } // textMatches(/.*浏览得奖励.*/).findOne(15000) // 等待开始 sleep(5000) let finish_c = 0 while (finish_c < 50) { // 0.5 * 50 = 25 秒,防止死循环 let finish_reg = /.*任务已完成.*|.*失败.*|.*上限.*|.*开小差.*|.*喵币已发放.*/ if (textMatches(finish_reg).exists() || descMatches(finish_reg).exists()) { // 等待已完成出现,有可能失败 break } if (textMatches(/.*休息会呗.*/).exists()) { alert('触发淘宝验证', '请手动验证后返回淘宝首页,重新执行任务') console.log('异常退出。') quit() } if (textContAIns('互动奖励').exists() || descContains('互动奖励').exists()) { console.log('跳过互动任务') break } sleep(500) finish_c++ } if (finish_c > 49) { console.log('未检测到任务完成标识。返回。') // console.log('如果你认为这是一个bug请截图反馈。') // console.log('一般情况下,二次运行脚本即可。') // console.log('请手动切换回主页面') // device.cancelKeepingAwake() // quit() back() sleep(1000) // TODO: 返回检测 if (!textContains('当前进度').findOne(5000)) { console.log('似乎没有返回,二次尝试') back() } return } console.log('任务完成,返回') back() sleep(1000) if (!textContains('当前进度').findOne(5000)) { if (currentActivity() == 'com.taobao.tao.TBMainActivity') { console.log('返回到了主页,尝试重新进入任务') id('com.taobao.taobao:id/rv_main_container').findOnce().child(3).child(0).click() } else { console.log('似乎没有返回,二次尝试') back() } } } // 打开淘宝活动页面 console.log('正在打开淘宝...') var url = 'pages.tmall.com/wow/z/hdwk/20220618/gamehome?disableNav=YES' app.startActivity({ action: "VIEW", data: "taobao://" + url }) sleep(2000) console.log('等待页面加载...') try { textMatches(/领喵币/).findOne(20000) console.log('准备打开任务列表') sleep(2000) let c = findTextDescMatchesTimeout(/领喵币/, 1000) if (c) { console.log('使用默认方法尝试打开任务列表') c.click() } else { throw '无法找到任务列表入口' } if (!textContains('当前进度').findOne(8000)) { console.log('默认方式打开失败,二次尝试') console.log('首先检测弹窗') for (let i = 0; i < 2 && text('关闭').findOne(2000); i++) { // 关闭弹窗 console.log('检测到弹窗,关闭') click('关闭') sleep(2000) } console.log('出现未能自动关闭的弹窗请手动关闭') sleep(2000) // let right = c.bounds().right // let left = c.bounds().left // let top = c.bounds().top // let bottom = c.bounds().bottom // click(random(right,left), random(top, bottom)) click(c.bounds().centerX(), c.bounds().centerY()) console.log('已点击,等待任务列表出现') if (!textContains('当前进度').findOne(8000)) { throw '无法打开任务列表' } } console.log('准备搜索任务') sleep(2000) } catch (err) { console.log(err) console.log('无法进入任务列表,如果你认为这是bug,请截图反馈') quit() } while (true) { console.log('寻找任务入口...') var jumpButton = findTask() if (jumpButton == null) { // 没有任务之后领取奖励 var awardButtonFind = textMatches(/立即领取/) var awardButtons = findTimeout(awardButtonFind, 10000) if (awardButtons) { for (var i = 0; i < awardButtons.length; i++) { console.log('领取累计任务奖励') awardButtons[i].click() console.log('等待5秒再次领取...') sleep(5000) } } console.log('没找到合适的任务。也许任务已经全部做完了。退出。互动任务不会自动完成。') console.log('请手动切换回主页面') alert('任务已完成', '别忘了在脚本主页领取618红包!互动任务需要手动完成。') quit() } if (jumpButton[0].match('去浏览店铺领能量')) { console.log('进行浏览店铺任务') jumpButton[1].click() while (!textContains('任务完成').exists()) { console.log('进入店铺浏览') text('逛店最多').findOne(15000).parent().click() liulan() sleep(2000) } back() } else if (jumpButton[0].match(/.*玩游戏.*|.*浏览餐饮卡券.*|.*加油赛.*|.*赚星星.*/)) { console.log('进行' + jumpButton[0] + '任务,10秒后返回') jumpButton[1].click() sleep(10000) back() } else if (jumpButton[0].match(/领现金/)) { console.log('进行' + jumpButton[0] + '任务') jumpButton[1].click() let into = text('打开链接').findOne(10000) if (!into) { console.log('无法找到进入领现金的按钮!') quit() } into.click() liulan() } else { console.log('进行' + jumpButton[0] + '任务') jumpButton[1].click() liulan() } console.log('等待页面刷新...') sleep(2000) } } catch (err) { device.cancelKeepingAwake() if (err.toString() != 'JavaException: com.stardust.autojs.runtime.exception.ScriptInterruptedException: null') { console.error(err) } showVersion() }
淘宝618活动自动完成任务autojs脚本代码
Vue3中的Ref与Reactive:深入理解响应式编程
前言Vue 3是一个功能强大的前端框架,它引入了一些令人兴奋的新特性,其中最引人注目的是ref和reactive。这两个API是Vue 3中响应式编程的核心,本文将深入探讨它们的用法和差异。
玩转Vue3之Composables
前言Composables 称之为可组合项,熟悉 react 的同学喜欢称之为 hooks ,由于可组合项的存在,Vue3 中的组件之间共享状态比以往任何时候都更容易。这种新范例引入了一种更有组织
初识JavaScript逆向——以网易云音乐和招标网站为例
前言:需要掌握一定的JavaScript基础,能看懂基础的JavaScript代码。我们平常在浏览网站的时候会看到许多加密的参数,如果需要知道它的原始数据,就需要知道整个加密过程,所以本篇文
答应我,在vue中不要滥用watch好吗?
前言上周五晚上8点,开开心心的等着产品验收完毕后就可以顺利上线。结果产品突然找到我说要加需求,并且维护这一块业务的同事已经下班走了,所以只有我来做。虽然内心一万头草泥
Vue 3 的 setup语法糖到底是什么东西?
前言我们每天写vue3项目的时候都会使用setup语法糖,但是你有没有思考过下面几个问题。setup语法糖经过编译后是什么样子的?为什么在setup顶层定义的变量可以在template中可以
使用jQuery实现复选框选中状态的实时更新
在Web开发中,常常会遇到需要对复选框选中状态进行实时更新的情况。通过使用jQuery,我们可以很方便地实现实时更新复选框选中状态的功能。下面将介绍如何使用jQuery来完成这个
简明指南:使用 jQuery 改变表格行属性值的方法
标题:简明指南:使用 jQuery 改变表格行属性值的方法在网页开发过程中,经常会遇到需要动态改变表格行属性值的情况。jQuery作为一个流行的JavaScript库,可以很方便地实现这一功能
jQuery技巧:掌握在div中添加标签的方法
标题:jQuery技巧:掌握在div中添加标签的方法在网页开发中,经常会遇到需要动态添加标签到页面中的情况。使用jQuery可以方便地操作DOM元素,实现快速的标签添加功能。本文将介绍如
jQuery中get和post方法的区别解析
jQuery中get和post方法的区别解析在使用jQuery来进行Ajax请求时,我们经常会用到get和post方法来获取或提交数据。虽然它们都是用来发送Ajax请求的方法,但在实际应用中有着一些
jQuery中如何实现select元素的改变事件绑定
jQuery是一个流行的JavaScript库,可以用来简化DOM操作、事件处理、动画效果等。在web开发中,经常会遇到需要对select元素进行改变事件绑定的情况。本文将介绍如何使用jQuery实
let、var和const的区别与特点:它们分别代表什么含义?
在JavaScript中,let、var和const是用于声明变量的关键字。它们各自具有不同的区别和特点。 let:
let关键字是ES6引入的,它允许我们声明一个块级作用域的变量。块级作用域是指变
JavaScript 的新数组分组方法
对数组中的项目进行分组,你可能已经做过很多次了。每次都会手动编写一个分组函数,或者使用 lodash 的 groupBy 函数。好消息是,JavaScript 现在有了分组方法,所以你再也不必这样
零基础入门Vue之画龙点睛——再探监测数据
追忆上一节:零基础入门Vue之影分身之术——列表渲染&渲染原理浅析虽然我深知,大佬告诉我”先学应用层在了解底层,以应用层去理解底层“,但Vue的数据如何检
从零搭建Vue3 + Typescript + Pinia + Vite + Tailwind CSS + Element Plus开发脚手架
项目代码以上传至码云,项目地址:https://gitee.com/breezefaith/vue-ts-scaffold 目录 前言 脚手架技术栈简介 vue3 TypeScript Pinia Tailwind CSS Element Plus vite
uni-app+vue3会遇到哪些问题
已经用 uni-app+vue3+ts 开发了一段时间,记录一下日常遇见的问题和解决办法uni-app 中的单端代码uni-app 是支持多端,如果你想让你的代码,只在部分平台使用,那么就需要用的它的
VUE3子表格嵌套分页查询互相干扰的问题解决
VUE3在表格中嵌套子表格
子表格的分页查询互相干扰的问题解决简单嵌套如果不需要做子表格的分页查询,那么可以直接在主表格中嵌套子表格,有两种方式;一种是主表格加载的同时加
NextJs 与 Tailwind 入门开发笔记
前言距离上次更新已经过去好久了,之前我在 StarBlog 博客2023年底更新一览的文章里说要使用 Next.js 来重构博客前端,最近也确实用 next.js 做了两个小项目,一个是单点认证项目
JS的垃圾回收机制
垃圾回收是计算机编程中的一个术语,用来描述查找和删除那些不再被其他对象引用的对象的处理过程。换句话说,垃圾回收是删除任何其他对象未使用的对象的过程。如果没有垃圾回收
Gin 框架之jwt 介绍与基本使用
目录 一.JWT 介绍 二.JWT认证与session认证的区别 2.1 基于session认证流程图 2.2 基于jwt认证流程图 三. JWT 的构成 3.1 header : 头部 3.2 payload : 负载 3.
详细介绍 TypeScript 函数的各种特性、用法和最佳实践
TypeScript 是一种在 JavaScript 基础上构建的编程语言,它为 JavaScript 提供了静态类型检查和更强大的面向对象编程能力。函数作为编程语言中的基本构建块,在 TypeScript 中
根据select的data-*属性更改图片img的src链接JQ实例
直接上实例代码:<img id="brandIcon" src="" /> <script language="JavaScript" type="text/javascript" > function setBeerIcon() { var classimg = $("#beer").fi
lottie 动画在 vue 中的使用
前言最近我所负责的项目中,我采用了动画效果,并开始使用 gif 来实现。然而,在实践过程中,我发现 gif 格式的动画在 git 中出现了明显的锯齿感,这让我非常困扰。为了追求更完美的
vue3+ts打开echarts的正确方式
准备工作1. 注册为百度地图开发者官网地址,然后在 应用管理 -> 我的应用 里,创建应用,创建好后复制 AK
2. 在根目录的 index.html 里引入百度地图<head> <meta charset="UTF-8
React 类组件转换为函数式
函数式的 React 组件更加现代,并支持有用的 hooks,现在流行把旧式的类组件转换为函数式组件。这篇文章总结了转换的一些通用的步骤和陷阱。通用替换定义从class (\w+) extends
vue 2实战系列 —— 复习Vue
复习Vue近期需要接手 vue 2的项目,许久未写,语法有些陌生。本篇将较全面复习 vue 2。Tip: 项目是基于 ant-design-vue-proant-design-vue-pro由于 cms 是基于这个项目开发的,所
node node-sass sass-loader版本兼容问题
相关概念sassSass是一种预处理器脚本语言,可以解释或编译成层叠样式表(CSS)。Sass包含两种语法:较旧的语法使用缩进将代码块和换行符分隔为单独的规则;较新的语法SCSS使用像CSS这
Next.js 开发指南 初始篇 | Next.js CLI
前言欢迎学习 Next.js!在学习具体的知识点之前,我们先来创建一个 Next.js 项目。创建了可运行的项目,才能在学习的时候边调试边理解,从而达到事半功倍的效果。幸运的是,Next.js
扩展 jQurey.i18n.properties 的能力来向 vue-i18n 靠齐
jQuery.i18n.properties 是 jQuery 老项目的国际化框架,其实国际化方案本质上都大同小异,都是需要用翻译函数包裹词条,然后根据词条文件来进行翻译就是使用上与其他框架不太一
vue模板的首次渲染,和重新渲染,有哪些区别?
搞明白这个,能帮助我们理解开发中出现的很多问题。一、我们先来回顾一下vue模板的渲染过程:(1)执行render函数,生成虚拟DOM。render函数是根据render、templete、el这三个选项得
直接在*.vue文件(SFC)中使用JSX/TSX渲染函数,真香!
前言在日常开发中vue的模版语法在大多数情况都能够满足我们的需求,但是在一些复杂的业务场景中使用模版语法就有些麻烦了。这个时候灵活的JSX/TSX渲染函数就能派上用场了,大多