├── assets ├── 20220407_123317__.png ├── 20220407_123340__.png ├── 20220407_123325__mian.js.png └── Screenshot_20220407-123018_美团买菜.png ├── project.json ├── main.js └── README.md /assets/20220407_123317__.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qulingyuan/robVeg/HEAD/assets/20220407_123317__.png -------------------------------------------------------------------------------- /assets/20220407_123340__.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qulingyuan/robVeg/HEAD/assets/20220407_123340__.png -------------------------------------------------------------------------------- /assets/20220407_123325__mian.js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qulingyuan/robVeg/HEAD/assets/20220407_123325__mian.js.png -------------------------------------------------------------------------------- /assets/Screenshot_20220407-123018_美团买菜.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qulingyuan/robVeg/HEAD/assets/Screenshot_20220407-123018_美团买菜.png -------------------------------------------------------------------------------- /project.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "新建项目", 3 | "main": "main.js", 4 | "ignore": [ 5 | "build" 6 | ], 7 | "packageName": "com.example", 8 | "versionName": "1.0.0", 9 | "versionCode": 1 10 | } -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | // 解锁手机屏幕 2 | function unLock() { 3 | if (!device.isScreenOn()) { 4 | device.wakeUp(); 5 | sleep(500); 6 | swipe(500, 2000, 500, 1000, 200); 7 | sleep(500); 8 | const password = "123456"; //这里换成自己的手机解锁密码 9 | for (let i = 0; i < password.length; i++) { 10 | let position = text(password[i]).findOne().bounds(); 11 | click(position.centerX(), position.centerY()); 12 | sleep(100); 13 | } 14 | } 15 | sleep(1000); 16 | } 17 | 18 | //抢菜流程 19 | function robVeg() { 20 | unLock(); 21 | launchApp("美团买菜"); 22 | waitForPackage("com.meituan.retail.v.android", 200); 23 | auto.waitFor(); 24 | const btn_skip = id("btn_skip").findOne(); 25 | if (btn_skip) { 26 | btn_skip.click(); 27 | toast("已跳过首屏广告"); 28 | } 29 | sleep(2000); 30 | gotoBuyCar(); 31 | sleep(2000); 32 | checkAll(); 33 | sleep(2000); 34 | submitOrder(0); 35 | } 36 | 37 | robVeg(); 38 | 39 | //打开购物车页面 40 | function gotoBuyCar() { 41 | if (id("img_shopping_cart").exists()) { 42 | id("img_shopping_cart").findOne().parent().click(); 43 | toast("已进入购物车"); 44 | } else { 45 | toast("没找到购物车"); 46 | exit; 47 | } 48 | } 49 | 50 | //勾选全部商品 51 | function checkAll() { 52 | const isCheckedAll = textStartsWith("结算(").exists(); 53 | const checkAllBtn = text("全选").findOne(); 54 | if (!!checkAllBtn) { 55 | !isCheckedAll && checkAllBtn.parent().click(); 56 | sleep(1000); 57 | } else { 58 | toast("没找到全选按钮"); 59 | exit; 60 | } 61 | } 62 | 63 | function submitOrder(count) { 64 | if (textStartsWith("结算(").exists()) { 65 | textStartsWith("结算(").findOne().parent().click(); 66 | } else if (text("我知道了").exists()) { 67 | toast("关闭我知道了"); 68 | text("我知道了").findOne().parent().click(); 69 | } else if (text("重新加载").exists()) { 70 | toast("重新加载"); 71 | text("重新加载").findOne().parent().click(); 72 | } else if (text("立即支付").exists()) { 73 | text("立即支付").findOne().parent().click(); 74 | } else if (text("确认支付").exists()) { 75 | const music = 76 | "/storage/emulated/0/netease/cloudmusic/Music/Joel Hanson Sara Groves - Traveling Light.mp3"; 77 | media.playMusic(music); 78 | sleep(media.getMusicDuration()); 79 | } else { 80 | toast("抢个屁!"); 81 | exit; 82 | } 83 | sleep(800); 84 | if (count > 10000) { 85 | toast("没抢到"); 86 | exit; 87 | } 88 | 89 | submitOrder(count++); 90 | } 91 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 今天发现了一个可以在安卓机上运行脚本的工具——[Auto.js](https://g.pro.autojs.org/docs/#/zh-cn/),简单的写了个脚本用来抢菜。 2 | 3 | ## 美团买菜版本 4 | 5 | 这个脚本适用于美团买菜 v5.32.0,不要用最新的版本。 6 | 旧版本的获取方法: 7 | 下载一个”豌豆荚“app,或者在网页上搜索豌豆荚,然后在里面搜索应用名称,最下面会有一个“历史版本”,找到 v5.32.0 并安装,注意安装前需要先卸载掉美团买菜。 8 | 9 | ![image-20220408161750722](https://gitee.com/qulingyuan/ly_picture/raw/master/img/image-20220408161750722.png) 10 | 11 | ## 开发步骤: 12 | 13 | 1. 下载 `Auto.js` 安装包,目前官网提供的是 `Auto.js Pro`,是收费的,45 块钱买断制,还是良心的,建议大家购买。不过这里也分享一下免费版本(非破解版,是开始收费前的免费版,网上听说很多版本是有毒的,这个是我以身试毒后确认无毒的,大家可放心使用)—— 链接: https://pan.baidu.com/s/1zBTij7imoLCKf1bm7HtY6Q 提取码: n9jc --来自百度网盘超级会员 v3 的分享 14 | 15 | 2. 安装软件后,开启应用的**无障碍**和**悬浮窗**功能。 16 | 17 | ![image-20220406221255685](https://gitee.com/qulingyuan/ly_picture/raw/master/img/image-20220406221255685.png) 18 | 19 | 3. 可以使用悬浮窗的工具来检查 app 的元素。 20 | 21 | ![image-20220406225906556](https://gitee.com/qulingyuan/ly_picture/raw/master/img/image-20220406225906556.png) 22 | 23 | ![image-20220406225941640](https://gitee.com/qulingyuan/ly_picture/raw/master/img/image-20220406225941640.png) 24 | 25 | 4. 打开 VS Code,安装`Auto.js-VSCodeExt`插件。 26 | 27 | ![image-20220406222424648](https://gitee.com/qulingyuan/ly_picture/raw/master/img/image-20220406222424648.png) 28 | 29 | 5. `Command+shift+P`快捷键打开 `Command Palette`,运行 `Auto.js:New Project`命令创建一个新项目。 30 | 31 | ![image-20220406222958526](https://gitee.com/qulingyuan/ly_picture/raw/master/img/image-20220406222958526.png) 32 | 33 | 6. 在 main.js 文件中编写脚本: 34 | 35 | ```js 36 | function robVeg() { 37 | launchApp("美团买菜"); 38 | waitForPackage("com.meituan.retail.v.android", 200); 39 | auto.waitFor(); 40 | const btn_skip = id("btn_skip").findOne(); 41 | if (btn_skip) { 42 | btn_skip.click(); 43 | toast("已跳过首屏广告"); 44 | } 45 | sleep(1000); 46 | gotoBuyCar(); 47 | sleep(1000); 48 | checkAll(); 49 | } 50 | 51 | robVeg(); 52 | 53 | //打开购物车页面 54 | function gotoBuyCar() { 55 | const buyCarBtn = id("cartredDotTextView").findOne(); 56 | if (buyCarBtn) { 57 | buyCarBtn.parent().click(); 58 | toast("已进入购物车"); 59 | } else { 60 | toast("没找到购物车"); 61 | exit; 62 | } 63 | } 64 | 65 | //勾选全部商品 66 | function checkAll() { 67 | const isCheckedAll = textStartsWith("结算(").exists(); 68 | const checkAllBtn = text("全选").findOne(); 69 | if (!!checkAllBtn) { 70 | !isCheckedAll && checkAllBtn.parent().click(); 71 | sleep(1000); 72 | } else { 73 | toast("没找到全选按钮"); 74 | exit; 75 | } 76 | } 77 | ``` 78 | 79 | 7.运行 `Auto.js:Start Server` 命令启动服务,手机和电脑在同一局域网的情况下打开”连接电脑“选项,连接成功后,VS Code 会弹出提示。然后就可以愉快地改代码调试了。 80 | 81 | ![](assets/20220407_123340__.png) 82 | 83 | 8.跑代码 84 | 85 | ![](assets/20220407_123325__mian.js.png) 86 | 87 | ![](assets/20220407_123317__.png) 88 | 开发调试开启日志,手机需要开启悬浮窗。 89 | 90 | ![](assets/Screenshot_20220407-123018_美团买菜.png) 91 | 92 | > https://g.pro.autojs.org/docs/#/zh-cn/console 93 | 94 | 9.调试完成后,确定代码可以正常运行了,可以在 Auto.js 上新建一个脚本文件,把写好的代码放进去,然后点击文件右侧的三个点->更多->定时任务,可以设置成早上 6 点。 95 | 96 | ![image-20220408164107042](https://gitee.com/qulingyuan/ly_picture/raw/master/img/image-20220408164107042.png) 97 | 98 | 99 | 100 | ![image-20220408164221962](https://gitee.com/qulingyuan/ly_picture/raw/master/img/image-20220408164221962.png) 101 | 102 | ## 项目中容易踩到的坑,给大家提个醒: 103 | 104 | 1. 一定要打开无障碍功能!如果发现无法选取元素了或者什么其他异常,大概率是无障碍功能关闭了,是的,无障碍功能有时候会自动关闭。 105 | 2. 手机的 GPS 打开。 106 | 3. 需要提前把商品添加到购物车里,不然购物车是空的,啥也买不了。 107 | 3. 注意美团买菜的版本,不同版本元素不一样,代码执行不了的。 108 | 109 | ## 原理 110 | 111 | 这个脚本的原理是找到屏幕上对应的按钮,模仿人的点击等手势动作,把抢菜的一系列操作封装成脚本。然后 Auto.js 有定时执行脚本功能,这样就不用早上六点钟起来自己点了。Auto.js 的功能很强大,网上搜资料的时候发现还可以搞支付宝的蚂蚁森林的能量收集,还有游戏脚本啥的,后面还可以研究研究。 112 | --------------------------------------------------------------------------------