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脚本代码
react组件中debounce防抖功能失效问题解决办法
目录一、问题背景二、解决办法三、拓展一、问题背景import { debounce } from 'lodash'; const [searchKey, setSearchKey] = useState('');// 防抖函数 const debounceLi
在 React 项目中 Editable Table 的实现
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:佳岚可编辑表格在数栈产品中是一种
神奇的JavaScript弱等价类型转换
JavaScript语言特性 - 类型转换JavaScript这门语言的类型系统从来没有它表面看起来的那样和善,虽然比起Java、C#等一众强类型语言,它的弱类型使用起来似乎是如此便利,但正因为
vue+element-ui表格自定义列模版的实现
目录前言一、为什么要自定义表列模版?二、实现步骤1.封装表格组件2.父组件引用总结前言日前vue3项目中用element-ui表格封装一个组件,有自定义表列格式的需求,做完后顺手总结一
webpack打包后index.html引用文件地址问题小结
在前端开发中,src 属性指定的相对路径是相对于当前 HTML 文件的路径,而不是相对于网站的根目录。这种相对路径的解析方式是浏览器的行为。当浏览器解析 HTML 文件中的 <script
vue跳转时根据url锚点(#xxx)实现页面内容定位的方法
目录介绍一、实现原理二、代码(vue3 setup)三、演示:四、结束介绍本前端仔在做页面跳转的时候,被要求跳转到页面时候,把对应部分的内容自动滚动到顶部~我一开始想到的就是根据
基于vue3+TypeScript实现一个简易的Calendar组件
目录功能分析功能实现初始化组件分析具体操作Calendar / CalendarCom.vueCalendar / CalendarMonth.vueCalendar / HeaderCom.vue小结总结功能分析目前学到功能有以下几点日
vue3项目打包成apk(android)详细图文教程
目录一、打包vue3项目1、打包2、解决打包后的文件的白屏问题。二、打包成apk1、创建“5+App”项目2、打包文件移动3、生成apk文件三、生成apk附:vue项目打包时报错
vue路由懒加载工作原理
Vue路由懒加载是一种优化技术,旨在减少应用程序的初始加载时间并提高性能。具体来说,它允许我们在用户实际需要访问某个路由时,才加载对应的组件代码,而不是在应用程序启动时一
vue2项目使用exceljs多表头导出功能详解
目录前言一、插件安装二、数据准备三、插件引入四、导出前数据处理1、按exceljs格式创建导出函数2、表头及列宽数据预处理2.1 处理逻辑3、单元格样式处理函数4、表头数据填
使用JavaScript截取视频特定帧的实现方法
目录背景1. 监听文件选择2. 捕获视频帧3. 绘制视频帧4. 实现效果结论背景在网页开发中,我们经常需要对媒体文件进行处理,其中包括视频文件。有时候,我们可能需要从视频中提取特
Node+Express连接MySQL实现增删改查功能
一、在项目中安装mysql 和 expresscnpm install mysql express --save二、示例代码const express = require("express"); const app = express(); const mysql = require("m
前端报错npm ERR! cb() never called!问题解决办法
目录1.问题描述1.1使用npm install后报错2.解决问题过程2.1看网上大部分的解决方式是:2.2网上还有部分的解决方式是:2.2.1如果你不幸的按照网上使用npm uninstall -g npm升级
js跨域的几种解决方案
目录一、什么是跨域?二、跨域解决方案方案一:jsonp (json with padding)方案二:CORS (CROSS-Origin Resource Sharing 跨域资源共享)和跨域CORS有关的几个请求头和响应头请求头
Vue图片懒加载之Vue-Lazyload的使用
目录一、什么叫懒加载二、懒加载的优点三、为什么使用懒加载懒加载原理是什么四、vue中如何实现懒加载五、js---懒加载的实现步骤?懒加载代码实现方式一:原生js方式二: getB
解决JavaScript精度问题的常见方法
目录引言解决方案一、使用整数进行计算二、使用库函数三、四舍五入优缺点分析1、整数计算方法2、使用库函数方法3、四舍五入方法结论引言在 JavaScript 中,处理浮点数时经常
使用JS代码实现页面添加水印的方法详解
目录一、水印概括1. 添加水印的好处2. 添加水印的坏处二、技术方案1. watermark 第三方库2. JS 简单实现水印功能三、水印功能实现1. 水印功能需求2. 功能实现3. 步骤解析3.
微信小程序中实现自定义Navbar方法详解
目录前言StatusBar高度TitleBar高度编写Navbar组件使用最终效果前言自定义 navbar 应该是很常见的需求。要自定义一个 navbar 并不难,只需要了解其组成部分即可。从上面的图
axios对外出口API的设计方法
目录axios 的 2 种使用方式请求方法别名Axios 类Axios.prototype.request()axios.defaults/interceptors请求方法别名导出 axios如果直接导出 Axios总结本文我们将讨论 axio
js实现WebSocket 连接的示例代码
目录一.WebSocket 简单介绍1.HTTP和WebSocket的区别2.WebSocket应用场景二.js使用WebSocket1.创建WebSocket实例2.属性3.方法4.事件5.使用示例一.WebSocket 简单介绍1.HTTP
保姆级Decimal.js使用教程(解决js精度问题)
目录精度问题控制台图样01.引入Decimal.js02.使用加减乘除全上附:Vue项目完整例子总结 精度问题控制台图样如果银行的业务你这样做,不知道要损失多少钱,这样是不行的,计算的不准
使用Vue3实现在浏览器端进行zip文件压缩
在前端开发中,我们时常需要处理文件上传和下载的功能。有时,用户可能希望将多个文件打包成一个zip文件以便于下载。我这里分享一个使用Vue3和JSZip库在浏览器端实现zip文件压
axios拦截器机制的实现原理详解
目录axios 拦截器简介Axios 实例拦截器类拦截器实现原理收集拦截器拼接请求链由请求链结构看错误处理第一个请求拦截器出错最后一个请求拦截器出错axios 请求出错响应拦截器
Python实现图片二值化的详细代码
目录1. 什么是二值化2. 二值化的作用3. 二值化的实现4.代码实现1. 什么是二值化图像二值化就是将图像上的像素点的“灰度值”设置为[0, 0, 0]或[255, 255, 255],即
printJS打印问题汇总以及解决办法
目录一、打印预览表格列不全(Element的el-table组件)1、打印设置“打印缩放”2、修改el——table的底层代码(如果页面上有多个表格慎用) 二、如何解决vue p
vue前端实现login页登陆验证码代码示例
实现效果// template<el-form :model="loginForm" :rules="fieldRules" ref="loginForm" label-position="left" label-width="0px" class="login-container"> <span
vue3中element Plus插槽示例详解
vue3中element Plus插槽,实现代码如下所示: <el-table-column property="" label="操作" width="200" show-overflow-tooltip> <template
如何在JavaScript实现Blob文件流下载
目录一、下载二、请求三、示例总结一、下载在 JavaScript 中,可以使用浏览器提供的 Blob 对象和 URL.createObjectURL() 方法来实现文件流下载。下面是一个示例代码,可以帮助
详解Javascript如何通过async/await优雅地使用FileReader
目录封装成方法Javascript封装成一个classTypeScript封装成一个classTypeScript基于泛型FileReader的使用机会很多,但是它是异步的,因此很容易出现回调地狱。我们可以使用asyn
使用Webstorm调试Vue代码详细图文教程
在我们前端开发过程中相信很多人都是通过console.log来调试我们的代码的,但是当代码复杂度比较高的时候这个方法就比较鸡肋了。这里我来教大家在Webstorm中如何来调试自己的