├── .gitignore ├── README.md ├── SUMMARY.md ├── addUI.js ├── docs ├── .nojekyll ├── README.md └── index.html ├── index.html ├── package-lock.json ├── package.json ├── resources ├── Screenshot_20190810-183903.png ├── Screenshot_20190810-183918.png ├── Screenshot_20190810-190455.png ├── Screenshot_20190810-222249.png ├── Screenshot_20190810-222256.png ├── Screenshot_20190810-222839.png ├── Screenshot_20190810-223143.png ├── Screenshot_20190810-223208.png ├── Screenshot_20190810-223220.png ├── Screenshot_20190810-223233.png ├── Screenshot_20190810-223315.png ├── Screenshot_20190810-223336.png ├── Screenshot_20190810-223416.png ├── Screenshot_20190810-223427.png ├── Screenshot_20190810-223640.png ├── Screenshot_20190811-005736.png ├── Screenshot_20190811-142627.png ├── Screenshot_20190811-142645.png ├── Screenshot_20190811-143126.png ├── Screenshot_20190811-144305.png ├── Screenshot_20190811-144454.png ├── Screenshot_20190811-145459.png ├── Screenshot_20190811-153009.png ├── Screenshot_20190811-170849.png ├── Screenshot_20190811-215140.png ├── autojs_01.png └── template │ ├── base64.txt │ ├── weiboqianbao_hong.png │ ├── zhaoqidaka.png │ ├── 微博文字.png │ ├── 微博钱包LOGO.png │ └── 微博钱包文字.png ├── src ├── common │ ├── api.js │ ├── operate.js │ ├── sms.js │ ├── utils.js │ └── work.js ├── env.js ├── index.js ├── layout.xml └── work │ ├── test.js │ ├── 云闪付-签到.js │ ├── 叮咚买菜-签到.js │ ├── 微博-登录.js │ ├── 拼多多-签到.js │ ├── 新浪微博-早起打卡.js │ ├── 百度地图-签到.js │ └── 网易邮箱-注册.js ├── tools ├── image2base64 └── image2base64.py ├── webpack.config.js ├── webpack.development.config.js └── webpack.production.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | # 2 | dist 3 | dist/ 4 | */.DS_Store 5 | 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # Typescript v1 declaration files 45 | typings/ 46 | 47 | # Optional npm cache directory 48 | .npm 49 | 50 | # Optional eslint cache 51 | .eslintcache 52 | 53 | # Optional REPL history 54 | .node_repl_history 55 | 56 | # Output of 'npm pack' 57 | *.tgz 58 | 59 | # Yarn Integrity file 60 | .yarn-integrity 61 | 62 | # dotenv environment variables file 63 | .env 64 | 65 | _book/ 66 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 基于AutoJs的安卓自动化测试脚本框架(AutoJson) 2 | ## 简介 3 | 本程序是一个AutoJs的脚本框架,实现只需要修改JSON配置文件,就能自定义操作流程。已实现微博自动注册,远程获取内容,自动发微博等功能!新增加网易163邮箱注册,抖音注册、点赞!! 4 | 正在实现【百度地图签到、大众点评签到、叮咚买菜签到、拼多多签到、什么值得买签到、苏宁易购签到、淘宝签到淘金币、微信读书(TODO)、小米商城抢购web(TODO)、云闪付签到积分、支付宝签到积分、支付宝每日花呗红包、支付宝体育服务早期打卡】android autojs 注册登陆签到脚本 5 | ### 项目地址: 6 | 【https://github.com/bayson/autojs】 7 | ### Release: 8 | 【https://github.com/bayson/autojs-release】 9 | 10 | ## 必备条件 11 | 1. webpack基于nodejs,电脑上必须安装nodejs. 12 | 2. 安卓上安装AutoJs的App: [https://github.com/hyb1996/Auto.js] AutoJs帮助文档:[https://hyb1996.github.io/AutoJs-Docs/] 13 | ## 注意事项 14 | 1. 15 | ## 编译步骤 16 | 1. git clone https://github.com/bayson/autojs.git 17 | 2. cd autojs 18 | 3. npm i 19 | 4. npm run build 20 | 5. 复制 ./dist/新浪微博.js , ./dist/网易邮箱.js 到你的AutoJs脚本目录默认是:/sdcard/脚本/ 21 | ## 使用说明 22 | 欢迎使用和提交bug反馈 23 | * 【设备要求】: 24 | * 1.需要root 25 | * 2.安卓5.0以上 26 | * 3.Auto.js软件版本4.0以上 27 | 28 |
29 |
30 | 31 | ### 网易邮箱-注册 32 | * 1.将脚本 ./dist/网易邮箱-注册.js 复制到AutoJs脚本目录下,默认目录是:/sdcard/脚本/ 33 | * 2.启动QQ浏览器,并打开网址 https://mail.163.com , 再启动脚本"网易邮箱-注册"即可,脚本如不会启动请参考AutoJs的文档 34 | * 3.邮箱注册会自动运行,如果遇到不能识别的页面手动点击就可以 35 | 36 | * 广告页 37 |
38 |
39 | 40 | * 登录页 41 |
42 |
43 | 44 | * 注册页:注意页面红框的地方要手动点一下,点成显示密码才行 45 |
46 |
47 | 48 | * 验证页:本页要手动点,没有实现自动点 49 |
50 |
51 | 52 | * 手机验证码输入;已经对接验证码平台,手机号会自动远程获取 53 |
54 |
55 | 56 | * 发验证短信页:已经对接验证码平台,会自动发送短信 57 |
58 |
59 | 60 | * 注册成功页 61 |
62 |
63 | 64 | * 成功跳转页 65 |
66 |
67 | * 注册采用的QQ浏览器版本号 68 |
69 |
70 | 71 | ### 百度地图-签到 72 | * 1.将脚本 ./dist/百度地图-签到.js 复制到AutoJs脚本目录下,默认目录是:/sdcard/脚本/ 73 | * 2.直接启动脚本"百度地图-签到"即可, 74 | * 3.如果遇到不能识别的页面手动点击就可以 75 | 76 |
77 |
78 |
79 |
80 | 81 |
82 |
83 | 84 | 85 | ### 叮咚买菜-签到 86 | * 1.将脚本 ./dist/叮咚买菜-签到.js 复制到AutoJs脚本目录下,默认目录是:/sdcard/脚本/ 87 | * 2.直接启动脚本"叮咚买菜-签到"即可, 88 | * 3.如果遇到不能识别的页面手动点击就可以 89 | 90 |
91 |
92 |
93 |
94 | 95 |
96 |
97 | 98 | 99 | ### 拼多多-签到-领红包 100 | * 1.将脚本 ./dist/拼多多-签到.js 复制到AutoJs脚本目录下,默认目录是:/sdcard/脚本/ 101 | * 2.直接启动脚本"拼多多-签到"即可, 102 | * 3.如果遇到不能识别的页面手动点击就可以 103 | 104 |
105 |
106 |
107 |
108 | 109 |
110 |
111 | 112 | ## TODO LIST 113 | ### 登陆注册 114 | * 新浪微博(Android,V9.6.3版本) 115 | * 网易邮箱(QQ浏览器,网页注册) 116 | * 今日头条(TODO) 117 | * 抖音(TODO) 118 | * 微信(TODO) 119 | * 天涯(TODO) 120 | ### 签到(TODO) 121 | * 百度地图签到 122 | * 大众点评签到 123 | * 叮咚买菜签到 124 | * 飞猪签到里程 125 | * 京东签到京豆 126 | * 京东金融签到钢镚 127 | * 联想签到延保 128 | * 拼多多签到 129 | * 上海移动和你签到 130 | * 什么值得买签到 131 | * 苏宁易购签到 132 | * 淘宝签到淘金币 133 | * 腾讯wifi管家签到 134 | * 微信读书(TODO) 135 | * 小米商城抢购web(TODO) 136 | * 新浪微博早起打卡(TODO) 137 | * 云闪付签到积分 138 | * 支付宝签到积分 139 | * 支付宝每日花呗红包 140 | * 支付宝体育服务早期打卡(TODO) 141 | ### 点赞、关注、收藏(TODO) 142 | * 新浪微博(Android,V9.6.3版本) 143 | ### 评价、回复、转发 (TODO) 144 | * 新浪微博(Android,V9.6.3版本) 145 | 146 | 147 | ## 感谢/参考: 148 | hyb1996 149 |
150 | snailuncle 151 |
152 | bjc5233 153 |
154 | 155 | ## License 156 | The framework is open-source software licensed under the MIT license. 157 | 158 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [Introduction](README.md) 4 | 5 | -------------------------------------------------------------------------------- /addUI.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | function addUI(options) {} 4 | addUI.prototype.apply = function (compiler) { 5 | compiler.plugin('emit', function (compilation, callback) { 6 | fs.readFile(__dirname + "/src/index.js", 'utf8', (err, data) => { 7 | if (err) throw err; 8 | if (/['"]ui['"]/.test(data)) { 9 | console.log('包含"ui"') 10 | compilation.assets['main.js']._value = '"ui";' + compilation.assets['main.js']._value 11 | } else { 12 | console.log('不包含"ui"') 13 | } 14 | callback(); 15 | }); 16 | }); 17 | }; 18 | module.exports = addUI; 19 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/docs/.nojekyll -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/docs/README.md -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | weibo 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Getting Started 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "weibo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "private": true, 6 | "scripts": { 7 | "dev": "webpack --mode=development", 8 | "build": "webpack --mode=production", 9 | "watch": "webpack --watch --mode=development", 10 | "docs": "docsify serve ./docs" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "extract-text-webpack-plugin": "^4.0.0-beta.0", 17 | "glob": "^7.1.4", 18 | "webpack": "^4.36.1", 19 | "webpack-cli": "^3.3.6" 20 | }, 21 | "dependencies": { 22 | "lodash": "^4.17.15" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /resources/Screenshot_20190810-183903.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-183903.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-183918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-183918.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-190455.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-190455.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-222249.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-222249.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-222256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-222256.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-222839.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-222839.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223143.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223143.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223208.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223208.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223220.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223220.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223233.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223233.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223315.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223315.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223336.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223336.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223416.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223416.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223427.png -------------------------------------------------------------------------------- /resources/Screenshot_20190810-223640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190810-223640.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-005736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-005736.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-142627.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-142627.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-142645.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-142645.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-143126.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-143126.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-144305.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-144305.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-144454.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-144454.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-145459.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-145459.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-153009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-153009.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-170849.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-170849.png -------------------------------------------------------------------------------- /resources/Screenshot_20190811-215140.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/Screenshot_20190811-215140.png -------------------------------------------------------------------------------- /resources/autojs_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/autojs_01.png -------------------------------------------------------------------------------- /resources/template/base64.txt: -------------------------------------------------------------------------------- 1 | ../resources/template/weiboqianbao_hong.png 2 | iVBORw0KGgoAAAANSUhEUgAAAHEAAAAdCAIAAAASKhSmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAz7SURBVHja7Fp7QJRV3n7Oea8zjGAgyEVEkIuC9lmWeMlq/dK1+jQ1SV3brdTWy4IX1P20zS5rpkmJ2aeWlobRxVt5W23drc1S1wuKpih4BwSFXPDKzLy3s3+8wzAMwwDK99++f82cOe/Me57z/J7f8/udITcf7Iv/XK16cXMjor2Hej3EKiphGHUjKcl86kPQDVZd7TlTGDwQjLHq6038RrdkrksisdnYL9canXN/Ny4pAbzAqqtpx2h246b/7yTBwaSNDXdqGptAO0bzTwzguiQahUUtBYWEhUoTXoKmsStX7wJT6vWeHzjAumKpbdtGmpRYN/jUIPnNV/n+9RhN2ofJC94I2JDrOdPnJU4cb8leLL74W79zJliyFwsjhtKO0dac1dacVfx/P+5v/kvP27ZttCz8c6MLS0yQX5ktvzIbgDh6pDQjnQQGNhMU8cXfir/7jXXl+9x/db9XTEm7EDlzKgjRi84YRWeaYF9iAgA4ncb5C60bO/rhI1xyV8viBda1H3EP9vDBI4ss/HogBMGoqmr0W5xOAKCUhrcXx70gPj8mYGOuMHJ404iEtxf+ZzAA7fs9+vET94Ypz8tzZpKwUFZR6Vj4LgDbD38N+OJTrxts+76z5q4BQGM6AjCuVkLTWhFQo6TU/sc/2dMz9RMFXFICu3274Rzh2WEkJBiqqm78prHvYSamALt9p+blKdo/D5J2IfLcWfKCN5ogafokEhDAauzODz++uyXw7lfynJn8rx6DrjsWZ7PKXwCA58Bz3hzhecJxAGiHSADsaosVx7b378Ri8b2e0Wni6DTPkYAvc/SC0zW/m+AxSRSGDwUAQQjY/IUHMZVbfX9V99bhqF2YZBSX2tMzhZHDpN+P13/2Rz1+wGPC4IEAiCRa137U3MA6cMg+9zVvTOW5s4ThQ2EYzmUrtB9+bJaQR4QDMMqvtDi0jxwjkugdL53jSPB9xuWyhmnBKC7xfCvPnEY7xYAxVlM/QTmVejy1uzAlksQAAOq2nca5CzQuln+0n/bjPl957z5pejoIAQCOI4FtmrskUfDmKU2IF4YNAWPOlauV3K/4gQP4ng+o23c2qTsAuN69rOs8YsRur5mY4f9G+7RZDQcty5fyvR/W9u53Zi31c6/w5CBhxFAAyvpN/meCumRNnPIyDQkhEeG0fRgEAYC2d78PTHle/vM8GhUJp1KTkakfyW8OmNbcNVzXJPf+1WFqnD2nrN8Mu11Zsw48L00cT2M7kdB2/khqkUmHKAA0IhwR4XXsuHOnOY9iyXqbH/BYc2JfWfeF8/3l7mVLM9JBqVFcqixf5dMDyTOnkshIGt6eBN9Xa/gGubOWUVxqXLlqnPbhrqQZ6XyfVADOTz9rJqCmRJhM8qGnziXLXKsaO4rGdoKiOlettaY+TDvHtTni2lIpY7KUMdmV9FN7EVlmlb/cfnIYAK5rkjV3DZzO2wOeqpPCbRuJKAIwg4jrm2r7disAdedfXSJwosBtHrk+qbRDlH6ywL1grm9vGhVZbwWaphee5XrIjrcWeQe+uaPXb/D9H4Ekmq9JUCAIUXfs0vOPGWfP60VnG0un0qQJ4qiRAPS8o8qadS0QMkny1BnvHAWAtA0Sx44GoH672yg641P4ABiXy7iePQC43T7tHNfQA9B27eBxO5FlyDIAYgtwYfrzSfdeWpYvpR2i9JOn3BFt/XAZvDAFlJxcbn+8dfXyhk+l/f17+//OcyxZxqqqjFOFxtUK2+7tJCRYzz+mbtnhD5ZZ08QxzwEwiksh8AEbcv1MVrduV3I+r1uUKAJA/Q2uh6n48jgSEgxA+fjTxoTPnY5N2+8uWgAY5eWec9xZ2PLBe3zf3tr3e+yzX3HHvhkT4thR/mO/QX7LZ2Xlwpg0AKSNjQQFMbud/asKgHGtCoC6qc5dsZs3SUgwCQnxVtqYaHbrDjO9rSi6TOHlMvuM2ZbsLBoT7S/Y27b1xVO7b0z5fr3FZ59xMbGs3J/bT+lKEzqbvCbtw1hFJYmMAMD83uWDWQcO60fz3WUujYvVD+VpeUfd6YjGdvIRJVcr7jzzHAApc6o4dpRx8lTNpKm+LerNm6bi8wMeo/GdaUxH2jGaRkWQoCBn9gdK7lcAoCj2mXOlaVPUTVuM4lJXNHy+3h1AdTTauoF2iPKpp+yOL56SdiHSnFlmWnRtQOZULxL5xje5q1ZRaXoA41JJy+z9+QvKJzmu73nwARoXq1+46B7hH+4JX5g2kTQCA7luyTQxnnaKoVFRAIThQ11+FoBTMa5c0U8UsGv/8hAUpQkL0aib5dFY7BObzfLeQhoZAV0H5zL5rLJSb6T7QDiOJsTrJwu4bik0Pg4/7TNjX29hkXoXse//kufNEYY8DY7WZ+stbfd3xsWLeuEZ/VQhFKW1Sj4SGGiaWa9ijwcgjEnjuqVA153LVkgzXO5Syf3KFR0+4ZjwklFcbFk0n+uWzPW4n4QEQ9OMU4X/37EvjHpWfH6Ma0k2GwDaPSVg+yYX8S8VG+fOG8Ul+vmLRmER7RAlzZ4OxhwLs+ps3NtvkpBgZd3n2r4D94ppUGCtg2zAU3Xj18KQp9Rtf9EO5Umen/XuJTw7rKFIOeYvUj5eS4KDYRhc1yS+Xx8A+plzPmvz1o19YrPRyIh6I7JMakfU9ZvtuV96tijNlXNdksyYE0YO53/9BFQVmn7vPHU/Cbt2zRtTdv2GPSPTKC6lifH1HjcqsqEzd/dAWVWVUVpGY6LNppx+7HhLytN85nAYpws9TZK2Y6dRUkpsNvnNVwGo3/2g7f2nfroe95VPctygm4qvHz7SWI7Si84wu51YLFyP7nphEZeSLGVMMlOQdvBwi0TJN0/NjsedGndyq5ejvEbrPVlhUc3YcaZzsu2s1wfS84/RmGjTmWv/+LH5mCpfbfT+lUN5em3RzT/eH4Cy7vO7a7V51gis5DJJSqBJiTQx3vLu28Rm008WOFeu9n8fu3GD3brd2EfuBMU/1BMAq6hotC/VaMnMfLfZWVWVtv+AMGyIibt+9Ni9VKU+Suk1H7rr3duPDrrLVmzBKZqUwKUkW95bRMJCjZJSx2vzm2xOqju+beilXHilPtzm4B6mqACI1QJAO5TXAkxpSHC9ppk7UaSNkCaOt2dk6oePQlUhCNqevc3V0LIyt50gHMd0b10jhNKkBADG+YtMVQDA7mhuFhaFeiYJ0I/kCyOeoZ1jzVi0T59tlJTeE/WP5LOqagRYTc3U844qq9e2AFOzpmK3btXWmiGus4A5M1mNnYS2k9JGmJaWf6SPsmZdc5rTzqWuslIYPlRKn6QsW6Fu3eHVcLP9bQcAx4J3mh/7wpODxD9MVNdvVj77wtM/0rhY116WXnYDSmM7GRcv3bWemC0OL/LS7inqpm/Y9Rs+zqO8jlIAGBcu1fZrHzeJZJw7b588FZIkDHkKjEHXuZRkobYGa27SjAgnQYHyvDnS7Ong+bvyMmZ9E2DJfkd+63UaEU5jY+qS/oM9rDmrxPEv1AaI4W71WrIWCE8PbsWzCdq9mzT5ZXfPk/rp5nH3dwegH//ZE2L1m201L/6e2e3yzGmgVN2yXf1mOwBp3AteLqcJwq5Y5Vj0LhRFHJ1m/b8lJCy0xZC2bQuAS+7CP/oInIqS+6UzKxsA7RwrvzbXumIp1yUJTqe6a7d50iOOHukib1SUNG2K7xTksAMgstSiJ+G6JgJwHyo3ShAhbQRpG2SUlWv7D7qUe/tOdrXCuXI11zVJznqbhLbTTxY4FmcTWeYe6UPD28tZC+zTZnspmr9UsGkLq/hFfuNPNC6WBgfr5oGNi35NUSMqku/dyyWap4ucWdn68RNczwfE3zzH9+tjKpJ+JN+55AO9sIi0DeL7pIovPK8XnoHDAVEwSi77xvRKBZIS+f79hMHH9J9Psupq5kfNeZ6GhXL9+5qNV6PwjD9MaacYccKLALS/fOtWST3vqJ53VBg+VJqRTgICjLPnHPPmQ1GYojgXL5Hnv851SbKuXl4zdpzP5qZvdfppnz19BqxWmtBZzJgMgJjnELpulF7216DLzCDB9zG7Xf3sS+cnOeZDimPS+McfBWP68RPq11vVHbtcMbHwXbryfRoVaf3oAyiq2er3vc0bNvN9epGw0CaPAhu2bp21jVffmBrlV4yC0wgIcNYabI9UqhOrVdt3wPHqm2bjB4C2Z69j7mvyW69re35qPqBulplNeD71ITAGVTPKyrVdu1lVtT+Hu+FrGhvrWPCOZ0/e8dY70vUb6q7dXo16o6zcPmW6NO0PXM8eEER97351w9e+9/jg4ZrpfxSeHswlJcBqJbLsboA0ImFOdvOmfu6CsnYdq6h0iZLnf3tI2yDTb6tbdpDAQBIaYpy/6IPyTwzQfvixYZanifHGhUs+xsPbw2JhNTXuX22dSxRbsSHSihf5z/+lWv369wACF5aE5OWGsQAAAABJRU5ErkJggg== 3 | 4 | 5 | 6 | ../resources/template/微博钱包LOGO.png 7 | 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 8 | 9 | 10 | 11 | ../resources/template/zhaoqidaka.png 12 | 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 13 | 14 | 15 | 16 | ../resources/template/微博文字.png 17 | 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 18 | 19 | 20 | 21 | ../resources/template/微博钱包文字.png 22 | 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 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /resources/template/weiboqianbao_hong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/template/weiboqianbao_hong.png -------------------------------------------------------------------------------- /resources/template/zhaoqidaka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/template/zhaoqidaka.png -------------------------------------------------------------------------------- /resources/template/微博文字.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/template/微博文字.png -------------------------------------------------------------------------------- /resources/template/微博钱包LOGO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/template/微博钱包LOGO.png -------------------------------------------------------------------------------- /resources/template/微博钱包文字.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayson/autojs/4b88ea2befec9282c8855ca4efd90d02174a74a1/resources/template/微博钱包文字.png -------------------------------------------------------------------------------- /src/common/api.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview API接口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * @author Tuple 5 | * @version 0.1 6 | */ 7 | 8 | var Env = require('../env') 9 | var Sms = require('./sms') 10 | var Utils = require('./utils') 11 | 12 | var api={ 13 | 14 | /** 15 | * 获取一个全局的配置文件 16 | */ 17 | getConfig:function() { 18 | try { 19 | // toast('开始获取配置'); 20 | let c = Env.curName; 21 | let r = http.get("http://api.tfjym.com/ai/chat/config?f="+Env.CLIENT+"&n=" + encodeURIComponent(c) + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&v=" + Env.VERSION); 22 | let body = r.body.string(); 23 | // toast('get config ok'); 24 | if (!!body) { 25 | let conf = JSON.parse(body); 26 | if (conf) { 27 | if (!conf.disabled) { 28 | Env.config = conf; 29 | } 30 | Env.token = !!Env.config.token ? Env.config.token : Env.token; 31 | Env.itemJihuo = !!Env.config.itemJihuo ? Env.config.itemJihuo : Env.itemJihuo; 32 | Env.itemLogin = !!Env.config.itemLogin ? Env.config.itemLogin : Env.itemLogin; 33 | Env.itemRegister = !!Env.config.itemRegister ? Env.config.itemRegister : Env.itemRegister; 34 | Env.exceptPhone = !!Env.config.exceptPhone ? Env.config.exceptPhone : Env.exceptPhone; 35 | Env.canReply = Env.config.canReplyDisabled ? Env.canReply : Env.config.canReply; 36 | Env.config.debug ? console.show() : console.hide(); 37 | } 38 | } 39 | return body; 40 | } catch (e) { 41 | // console.log(JSON.stringify(e)); 42 | } 43 | }, 44 | 45 | /** 46 | * 获取关键字 47 | */ 48 | getKeyword:function () { 49 | // console.log('get reply msg'); 50 | try { 51 | let r = http.get("http://api.tfjym.com/ai/chat/keyword?f="+Env.CLIENT+"&n=" + encodeURIComponent(Env.curName) + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&v=" + Env.VERSION); 52 | let body = r.body.string(); 53 | // console.log('reply msg:' + body); 54 | if (!!body) { 55 | // let conf = JSON.parse(body); 56 | // if (conf) { 57 | // Env.curKeywords = conf; 58 | // } 59 | Env.curKeyword = body; 60 | } 61 | return body; 62 | } catch (e) { 63 | Env.curKeyword = null; 64 | } 65 | 66 | }, 67 | 68 | /** 69 | * 获取评论内容 70 | * @param {*} msg 71 | */ 72 | getReplyMsg:function(msg) { 73 | // console.log('get reply msg'); 74 | try { 75 | let c = !!msg ? msg : Env.curTitleContent.substr(0, 255); 76 | let r = http.get("http://api.tfjym.com/ai/chat/reply?f="+Env.CLIENT+"&c=" + encodeURIComponent(c) + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&v=" + Env.VERSION); 77 | let body = r.body.string(); 78 | // console.log('reply msg:' + body); 79 | Env.curComment = body; 80 | return body; 81 | } catch (e) { 82 | Env.curComment = null; 83 | } 84 | 85 | }, 86 | 87 | getComment:function(){ 88 | return this.postReplyMsg(); 89 | }, 90 | 91 | getLoginPhone:function(){ 92 | return Sms.getPhone(Env.itemLogin); 93 | }, 94 | 95 | 96 | getActivePhone:function(){ 97 | return Sms.getPhone(Env.itemJihuo); 98 | }, 99 | 100 | 101 | getLoginCode:function(){ 102 | return Sms.getSMS(Env.curPhone,Env.itemLogin); 103 | }, 104 | 105 | getHotTextItem:function(){ 106 | let groupItems = ['推荐', '榜单', '社会', '搞笑', '情感', '时尚', '校园', '摄影', '艺术', '明星', '美女', 'NBA']; 107 | if (Env.config && Env.config.groupItems && Env.config.groupItems.length > 0) { 108 | groupItems = Env.config.groupItems; 109 | // toast('use Env.config group items'); 110 | } 111 | 112 | Env.curGroupId = 0; 113 | let subGroup = random(0, groupItems.length - 1); 114 | if (Env.config && Env.config.subGroupId > -1) { 115 | subGroup = Env.config.subGroupId; 116 | } 117 | Env.curHotTextItem = groupItems[subGroup]; 118 | // console.log('get hot text item api:',Env.curHotTextItem); 119 | return groupItems[subGroup]; 120 | // return "国学"; 121 | }, 122 | 123 | getGivenWeiboTitle:function(){ 124 | // return "35岁检察官带人上门打70岁空巢老人 相关部门否认寻衅滋事? 官官相护"; 125 | return "青凌巴山越岭"; 126 | }, 127 | 128 | /** 129 | * 获取评论内容 130 | * @param {*} msg 131 | */ 132 | postReplyMsg:function(msg) { 133 | let url = "http://api.tfjym.com/ai/chat/reply"; 134 | r = http.postJson(url, { 135 | n: Env.curName, 136 | c: !!msg ? msg : Env.curTitleContent, 137 | d: device.getIMEI(), 138 | t: new Date().getTime(), 139 | v: Env.VERSION, 140 | f: Env.CLIENT, 141 | }); 142 | let body = r.body.string(); 143 | // toast(body); 144 | Env.curComment = body; 145 | return body; 146 | }, 147 | 148 | /** 149 | * 获取评论内容 150 | * @param {*} msg 151 | */ 152 | postUpdateStatus:function(status) { 153 | let url = "http://api.tfjym.com/ai/chat/status"; 154 | r = http.postJson(url, { 155 | n: Env.curName, 156 | s: status, 157 | d: device.getIMEI(), 158 | t: new Date().getTime(), 159 | v: Env.VERSION, 160 | f: Env.CLIENT, 161 | }); 162 | let body = r.body.string(); 163 | // toast(body); 164 | Env.curComment = body; 165 | return body; 166 | }, 167 | 168 | getTuling:function(msg) { 169 | let url = "http://www.tuling123.com/openapi/api"; 170 | r = http.postJson(url, { 171 | key: "65458a5df537443b89b31f1c03202a80", 172 | info: "你好啊", 173 | userid: "1", 174 | }); 175 | let body = r.body.string(); 176 | toast(body); 177 | Env.curComment = body; 178 | return body; 179 | }, 180 | 181 | loginOk:function(phone, name, type,msg) { 182 | try { 183 | let c = name; 184 | let r = http.get("http://api.tfjym.com/ai/chat/loginok?f="+Env.CLIENT+"&n=" + encodeURIComponent(c) +"&msg=" + encodeURIComponent(msg) 185 | + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&p=" + phone + "&tp=" + type); 186 | let body = r.body.string(); 187 | // toast(body); 188 | // config = body; 189 | // console.log('login ok back:' + body); 190 | return body; 191 | } catch (e) { 192 | 193 | } 194 | }, 195 | /** 196 | * 获取手机号的激活码 197 | */ 198 | getCode:function(phone){ 199 | try { 200 | phone = !!phone ? phone : Env.curPhone 201 | let c = name; 202 | let r = http.get("http://api.tfjym.com/ai/chat/phone/code?f="+Env.CLIENT+"&n=" + encodeURIComponent(c) + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&p=" + phone ); 203 | let body = r.body.string(); 204 | return body; 205 | } catch (e) { 206 | 207 | } 208 | }, 209 | 210 | getRegisterPhone: function () { 211 | return Sms.getPhone(Env.itemRegister); 212 | }, 213 | 214 | getRegisterCode: function () { 215 | return Sms.getSMS(Env.curPhone, Env.itemRegister); 216 | }, 217 | 218 | getRegisterSendCode: function () { 219 | return Sms.sendSMS(Env.curPhone, Env.itemRegister, '注册验证'); 220 | }, 221 | 222 | getRegisterName: function () { 223 | try { 224 | let c = Env.curName; 225 | let r = http.get("http://api.tfjym.com/ai/chat/username?f="+Env.CLIENT+"&n=" + encodeURIComponent(c) 226 | + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&p=" + Env.curPhone ); 227 | let body = r.body.string(); 228 | Env.curUsername = body; 229 | Env.curName = body; 230 | return body; 231 | } catch (e) { 232 | 233 | } 234 | }, 235 | 236 | getRegisterPassword: function () { 237 | try { 238 | let c = Env.curName; 239 | let r = http.get("http://api.tfjym.com/ai/chat/password?f="+Env.CLIENT+"&n=" + encodeURIComponent(c) 240 | + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&p=" + Env.curPhone ); 241 | let body = r.body.string(); 242 | return Utils.isNull(body) ? Env.curDefaultPassword : body; 243 | } catch (e) { 244 | 245 | } 246 | }, 247 | 248 | getRegisterOk: function (){ 249 | let msg = {username:Env.curUsername,name:Env.curName,phone:Env.curPhone,item:Env.itemRegister,client:Env.CLIENT}; 250 | console.log('register ok:',msg) 251 | return this.loginOk(Env.curPhone,Env.curName,'register',JSON.stringify(msg)); 252 | }, 253 | 254 | getLoginName: function(){ 255 | let phones = Env.curPHoneList; 256 | return random(0, phones.length - 1); 257 | }, 258 | 259 | getLoginPassword: function(){ 260 | return '123456'; 261 | }, 262 | 263 | finish: function (){ 264 | let msg = {username:Env.curUsername,name:Env.curName,phone:Env.curPhone,item:Env.itemRegister,client:Env.CLIENT}; 265 | console.log('register ok:',msg) 266 | return this.loginOk(Env.curPhone,Env.curName,'register',JSON.stringify(msg)); 267 | }, 268 | 269 | getWeiboAccount: function () { 270 | try { 271 | let c = Env.curName; 272 | let r = http.get("http://api.tfjym.com/ai/weibo/account?f="+Env.CLIENT+"&n=" + encodeURIComponent(c) 273 | + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&s=0" ); 274 | let body = r.body.string(); 275 | Env.curUsername = body; 276 | Env.curName = body; 277 | console.log('getWeiboAccount:', Env.curUsername); 278 | return body; 279 | } catch (e) { 280 | 281 | } 282 | }, 283 | 284 | getWeiboPassword: function () { 285 | try { 286 | let c = Env.curName; 287 | let r = http.get("http://api.tfjym.com/ai/weibo/password?f="+Env.CLIENT+"&n=" + encodeURIComponent(c) 288 | + "&t=" + new Date().getTime() + "&d=" + device.getIMEI() + "&p=" + Env.curPhone ); 289 | let body = r.body.string(); 290 | console.log('getWeiboPassword phone:', Env.curPhone, ' pwd:', body); 291 | return Utils.isNull(body) ? Env.curDefaultPassword : body; 292 | } catch (e) { 293 | 294 | } 295 | }, 296 | 297 | } 298 | module.exports=api 299 | -------------------------------------------------------------------------------- /src/common/operate.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 定义可以的操作 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * @author Tuple 5 | * @version 0.1 6 | * 7 | */ 8 | 9 | /** 10 | * get 获取本地或者远程文本并写到全局变量, 11 | * set_text 设置控件的text属性, 12 | * click 点击这个按钮, 13 | * input OneByOne向控件输入文字, 14 | * swipe 滑动页面, 15 | * sleep 暂停, 16 | * refresh 下拉刷新页面, 17 | * back 点击Android的返回键, 18 | * text 获取控件的text属性值, 19 | * desc 获取控件的desc描述值, 20 | * tap 点击控件位置的屏幕, 21 | * enter 触发回车, 22 | * image 通过图片搜索控件 23 | * { name: "image", mark: { base64: wbqianbao_logo }, param:{action:"tap"} }, 24 | * 函数可以扩展 25 | */ 26 | 27 | var Utils = require('./utils'); 28 | var Funs = require('./funs'); 29 | var Api = require('./api'); 30 | var Env = require('../env'); 31 | 32 | var operate = { 33 | /** 34 | * 获取当前页面,OK 35 | * @param {*} pages 36 | */ 37 | curPage: function (pages) { 38 | // var result = []; 39 | let result = { name: '', pageid: 0 }; 40 | // pages.forEach((item, index, arr) => { 41 | // if (this.doExists(item.mark)) { 42 | // result = item; 43 | // } 44 | // }) 45 | // console.log(JSON.stringify(pages)); 46 | for (let k in pages) { 47 | if (this.doExists(pages[k].mark)) { 48 | // 增加优先级排序,区别有同样标志的页面 49 | if(!Utils.isNull(pages[k].priority) && pages[k].priority < result.priority) 50 | { 51 | console.log('same mark and priority lower',result.name, pages[k].name); 52 | }else{ 53 | result = pages[k]; 54 | } 55 | } 56 | } 57 | return result; 58 | }, 59 | 60 | /** 61 | * 获取下一个步骤 62 | * @param {*} pages 63 | */ 64 | nextStep: function (pageid, pages) { 65 | // var result = []; 66 | // console.log('nextStep:',pageid,JSON.stringify(pages)); 67 | let result = { next: 0, pageid: 0, jobs: [] }; 68 | for (let k in pages) { 69 | let item = pages[k]; 70 | if (item.pageid === pageid) { 71 | result = item; 72 | } 73 | } 74 | return result.next; 75 | }, 76 | 77 | /** 78 | * 判断是否为指定页面,OK 79 | * @param {*} mark 80 | */ 81 | isPage: function (mark) { 82 | return this.doExists(mark); 83 | }, 84 | 85 | /** 86 | * 87 | * 根据传入的属性,构建查找到对应节点的对象,OK 88 | * 89 | * @param {*} item 90 | */ 91 | build: function (item) { 92 | // let funNames = ['id','text','desc','className','depth','textStartsWith','textEndsWith']; 93 | let target = null; 94 | if (Utils.isNull(item.name)) { 95 | for (let k in item) { 96 | let v = item[k]; 97 | if (v != "" && v != null && v != undefined) { 98 | if (!!target) { 99 | target = eval('target.' + k + '(v)'); 100 | } else { 101 | target = eval(k + '(v)'); 102 | } 103 | // console.log('build target:'+JSON.stringify(target)); 104 | } 105 | } 106 | } 107 | return target; 108 | }, 109 | /** 110 | * 支持更复杂的或者表达式,目前不启用 111 | * @param {*} item 112 | */ 113 | parseItem: function (item) { 114 | let obj = JSON.parse(JSON.stringify(item)); 115 | let t = 1; 116 | for (let k in item) { 117 | let v = item[k]; 118 | if (v != "" && v != null && v != undefined) { 119 | obj[k] = v.split('||'); 120 | // t *= Math.pow(2,obj[k].length-1); 121 | t *= obj[k].length; 122 | } 123 | } 124 | // console.log(t); 125 | // console.log(JSON.stringify(obj)); 126 | let ls = Utils.fill(t, item); 127 | 128 | for (let k in obj) { 129 | let v = obj[k]; 130 | // console.log(k); 131 | // console.log(JSON.stringify(v)); 132 | if (Array.isArray(v)) { 133 | // let n = t / v.length; 134 | // let m = v.length; 135 | for (let m = 0; m < v.length; m += 1) { 136 | // console.log("m:"+m); 137 | for (let n = 0; n < t / v.length; n += 1) { 138 | // console.log("n:"+n); 139 | // console.log("v[m]:"+v[m]); 140 | let i = m * (t / v.length) + n; 141 | ls[i][k] = v[m]; 142 | // console.log("ls["+i+"]["+k+"]:"+ls[i][k]); 143 | } 144 | 145 | } 146 | } else { 147 | for (let m = 0; m < t; m += 1) { 148 | ls[m][k] = v; 149 | } 150 | } 151 | // console.log(JSON.stringify(ls)); 152 | } 153 | return ls; 154 | }, 155 | 156 | 157 | /** 158 | * 根据传入的属性,查找对应的节点并返回,OK 159 | * @param {*} mark 160 | * @param {*} param 161 | */ 162 | findNode: function (mark, param) { 163 | let target = null; 164 | // 有多个同样的,或者只有一个但是需要向上一级获取子节点 165 | if (!!param && !Utils.isNull(param.indexOf)) { 166 | //需要向上一级获取子节点 167 | if (!Utils.isNull(param.parent) && param.parent > 0) { 168 | target = this.build(mark).findOne(); 169 | let pLen = param.parent; 170 | while (pLen > 0) { 171 | target = target.parent(); 172 | pLen--; 173 | } 174 | target = target.children(); 175 | } else { 176 | target = this.build(mark).find(); 177 | } 178 | //有多个同样的,根据param.indexOf过滤节点,选择一个 179 | // {name:"click", mark:{id:"tv_userinfo"}, param:{indexOf:{tag:"text",try:10,get:{name:"given_weibo_title",uri:"api"}}}}, 180 | // {name:"click", mark:{id:"tv_userinfo"}, param:{indexOf:{tag:"text",try:10,default:"测试位置"}}}, 181 | target = this.indexOfNode(mark, param, target); 182 | } else { 183 | //只会有一个的情况 184 | target = this.build(mark).findOnce(); 185 | } 186 | if (!target) { 187 | console.log('can not find ctrl', JSON.stringify(mark), JSON.stringify(param)); 188 | } 189 | return target; 190 | 191 | }, 192 | 193 | indexOfNode: function (mark, param, target) { 194 | //没有找到尝试向上滚动一下找找 195 | let maxTry = 1; 196 | if (!Utils.isNull(param.indexOf.try) && param.indexOf.try > -1) { 197 | maxTry = param.indexOf.try; 198 | } 199 | let tryt = maxTry; 200 | while (tryt > 0 && target.length <= 0) { 201 | // console.log('find node try down',tryt,target.length); 202 | this.doSwipe({}, { count: 1 }); 203 | target = this.build(mark).find(); 204 | tryt--; 205 | } 206 | // 找到了处理一下 207 | if (target.length > 0) { 208 | if (typeof param.indexOf === 'number') { 209 | //取多个里的指定个 210 | if (param.indexOf == -1 || param.indexOf >= target.length) { 211 | target = target[target.length - 1]; 212 | } else { 213 | target = target[param.indexOf]; 214 | } 215 | } else if (typeof param.indexOf === 'object' 216 | && !Utils.isNull(param.indexOf.tag) 217 | ) { 218 | if (typeof param.indexOf.get === 'object') { 219 | let str = this.doGet(param.indexOf.get); 220 | target = eval('target.findOne(' + param.indexOf.tag + "(str))"); 221 | } else if (!Utils.isNull(param.indexOf.default)) { 222 | let str = param.indexOf.default; 223 | // console.log('find node str:',str); 224 | target = eval('target.findOne(' + param.indexOf.tag + "(str))"); 225 | } else { 226 | target = target[0]; 227 | } 228 | } else { 229 | target = target[0]; 230 | } 231 | } else { 232 | target = null; 233 | } 234 | //移动一段距离 235 | while (maxTry - tryt > 0) { 236 | // console.log('find node try up',tryt); 237 | this.doSwipe({}, { count: 1, isUp: true }); 238 | tryt++; 239 | } 240 | return target; 241 | }, 242 | /** 243 | * 调用click执行点击操作,OK 244 | * @param {*} mark 245 | * @param {*} param 246 | */ 247 | doClick: function (mark, param) { 248 | console.log('do click'); 249 | let target = this.findNode(mark, param); 250 | if (!!target) { 251 | if (target.clickable()) { 252 | return target.click(); 253 | } else { 254 | if (!!param && param.clickChild) { 255 | return this.clickChild(target); 256 | } else { 257 | return this.clickParent(target); 258 | } 259 | } 260 | } else { 261 | console.log('not do click'); 262 | } 263 | return false; 264 | }, 265 | /** 266 | * 调用tap点击界面,OK 267 | * @param {*} mark 268 | * @param {*} param 269 | */ 270 | doTap: function (mark, param) { 271 | console.log('do tap'); 272 | let target = this.findNode(mark, param); 273 | if (!!target) { 274 | Tap(target.bounds().centerX(), target.bounds().centerY()); 275 | sleep(500); 276 | Tap(target.bounds().centerX() + 1, target.bounds().centerY()) + 1; 277 | Tap(target.bounds().centerX() - 1, target.bounds().centerY()) - 1; 278 | Tap(target.bounds().centerX() + 2, target.bounds().centerY()) + 2; 279 | Tap(target.bounds().centerX() - 2, target.bounds().centerY()) - 2; 280 | return true; 281 | } else { 282 | console.log('not do tap'); 283 | } 284 | return false; 285 | }, 286 | /** 287 | * 输入到控件,只支持英文和字母,OK 288 | * @param {*} mark 289 | * @param {*} param 290 | */ 291 | doInput: function (mark, param) { 292 | console.log('do input'); 293 | let target = this.findNode(mark, param); 294 | // console.log('do input', JSON.stringify(target)); 295 | if (!!target) { 296 | Tap(target.bounds().centerX(), target.bounds().centerY()); 297 | sleep(1000); 298 | let name = {name:"login_code"}; 299 | if (!!param && !Utils.isNull(param.get)) { 300 | name = param.get; 301 | } 302 | let str = this.doGet(name); 303 | if (!!str) { 304 | Text(str); 305 | sleep(random(500,1000)); 306 | // KeyCode('KEYCODE_ENTER'); 307 | // KeyCode('KEYCODE_SEARCH'); 308 | return true; 309 | } 310 | } else { 311 | console.log('not do input'); 312 | } 313 | return false; 314 | }, 315 | /** 316 | * 一个一个输入到控件,只支持英文和字母,OK 317 | * @param {*} mark 318 | * @param {*} param 319 | */ 320 | doKeycode: function (mark, param) { 321 | console.log('do input'); 322 | let target = this.findNode(mark, param); 323 | // console.log('do input', JSON.stringify(target)); 324 | if (!!target) { 325 | Tap(target.bounds().centerX(), target.bounds().centerY()); 326 | sleep(1000); 327 | let name = {name:"login_code"}; 328 | if (!!param && !Utils.isNull(param.get)) { 329 | name = param.get; 330 | } 331 | let str = this.doGet(name); 332 | if (!!str) { 333 | let strArray = str.split(""); 334 | if (strArray.length > 0) { 335 | // setText(strArray[0]); 336 | Text(strArray[0]); 337 | sleep(random(500,1000)); 338 | } 339 | for (let i = 1; i < strArray.length; i++) { 340 | let char = strArray[i]; 341 | // input(char); 342 | Text(char); 343 | sleep(random(500, 1000)); 344 | } 345 | return true; 346 | } 347 | } else { 348 | console.log('not do input'); 349 | } 350 | return false; 351 | }, 352 | /** 353 | * 设置控件内容,OK 354 | * @param {*} mark 355 | * @param {*} param 356 | */ 357 | doSetText: function (mark, param) { 358 | console.log('do set text'); 359 | let target = this.findNode(mark, param); 360 | if (!!target) { 361 | let name = { name: 'comment' }; 362 | if (!!param && !Utils.isNull(param.get)) { 363 | name = param.get; 364 | } 365 | // let str = Api.postReplyMsg(); 366 | let str = this.doGet(name); 367 | console.log('do set text get '+name.name+':'+str); 368 | if (!!str) { 369 | return target.setText(str); 370 | } 371 | } else { 372 | console.log('not do set text'); 373 | } 374 | return false; 375 | }, 376 | /** 377 | * 获取控件text内容,OK 378 | * @param {*} mark 379 | * @param {*} param 380 | */ 381 | doText: function (mark, param) { 382 | console.log('do text'); 383 | let target = this.findNode(mark, param); 384 | if (!!target) { 385 | let name = { name: "title_content" }; 386 | if (!!param && !Utils.isNull(param.set)) { 387 | name = param.set; 388 | } 389 | let str = target.text(); 390 | this.doSet(name, { default: str }); 391 | console.log(str.substr(0, 100)); 392 | return str; 393 | } else { 394 | console.log('not do text'); 395 | } 396 | return null; 397 | }, 398 | /** 399 | * 获取控件desc内容,OK 400 | * @param {*} mark 401 | * @param {*} param 402 | */ 403 | doDesc: function (mark, param) { 404 | console.log('do desc'); 405 | let target = this.findNode(mark, param); 406 | if (!!target) { 407 | Env.curTitleContent = target.desc(); 408 | console.log(Env.curTitleContent.substr(0, 100)); 409 | return target.desc(); 410 | } else { 411 | console.log('not do desc'); 412 | } 413 | return null; 414 | }, 415 | /** 416 | * 向下滚动,OK 417 | * @param {*} mark 418 | * @param {*} param 419 | */ 420 | doSwipe: function (mark, param) { 421 | //滚动 422 | console.log('do swipe'); 423 | let rx = random(200, 400); 424 | let rm = -1; 425 | if (!!param && !Utils.isNull(param.count) && param.count > -1) { 426 | rm = parseInt(param.count); 427 | } 428 | if (rm == -1 || rm == undefined || rm == null || rm == "") { 429 | rm = random(1, 3); 430 | } 431 | let isUp = false; 432 | if (!!param && !Utils.isNull(param.isUp)) { 433 | isUp = param.isUp; 434 | } 435 | while (rm > 0) { 436 | console.log('swipe:' + rm, isUp); 437 | if (isUp) { 438 | Swipe(rx + random(0, 25), 180 + random(0, 100), rx + random(0, 29), 580 + random(0, 158), 200 + random(0, 200)); 439 | } else { 440 | Swipe(rx + random(0, 29), 580 + random(0, 158), rx + random(0, 25), 180 + random(0, 100), 200 + random(0, 200)); 441 | } 442 | sleep(random(500, 1000)); 443 | rm -= 1; 444 | } 445 | return true; 446 | }, 447 | 448 | /** 449 | * 刷新页面,Ok 450 | */ 451 | doRefresh: function (mark, param) { 452 | console.log('do refresh'); 453 | //下拉刷新 454 | Swipe(310, 250, 310, 600); 455 | // Swipe(310 + random(0, 5), 400 + random(0, 15), 310 + random(0, 25), 700 + random(0, 10)); 456 | sleep(1000 + random(0, 2000)); 457 | return true; 458 | }, 459 | /** 460 | * 执行回退操作,Ok 461 | * @param {*} mark 462 | * @param {*} param 463 | */ 464 | doBack: function (mark, param) { 465 | console.log('do back'); 466 | back(); 467 | return true; 468 | }, 469 | /** 470 | * 执行sleep,OK 471 | * @param {*} mark 472 | * @param {*} param 473 | */ 474 | doSleep: function (mark, param) { 475 | let rm = -1; 476 | if (!!param && !Utils.isNull(param.delay) && param.delay > -1) { 477 | rm = parseInt(param.delay); 478 | } 479 | if (rm == -1 || rm == undefined || rm == null || rm == "") { 480 | rm = random(1000, 2000); 481 | } 482 | console.log('do sleep', rm); 483 | sleep(rm); 484 | return true; 485 | }, 486 | doEnter: function () { 487 | console.log('do enter'); 488 | KeyCode("KEYCODE_ENTER"); 489 | }, 490 | /** 491 | * 等待控件出现 492 | * @param {*} mark 493 | * @param {*} param 494 | */ 495 | doWait: function (mark, param) { 496 | console.log('do wait for'); 497 | let target = this.build(mark); 498 | let msg = 'Wait For'; 499 | if (!Utils.isNull(mark.text)) { 500 | msg += ':Text:' + mark.text; 501 | } 502 | if (!Utils.isNull(mark.desc)) { 503 | msg += ':Desc:' + mark.desc; 504 | } 505 | if (!Utils.isNull(mark.id)) { 506 | msg += ':Id:' + mark.id; 507 | } 508 | console.log(msg); 509 | toast(msg); 510 | return target.waitFor(); 511 | }, 512 | /** 513 | * 执行shell命令 514 | * @param {*} mark 515 | * @param {*} param 516 | */ 517 | doShell: function (mark, param) { 518 | console.log('do shell'); 519 | let rs = { code: -1 }; 520 | // console.log(JSON.stringify(param)); 521 | if (!!param && !Utils.isNull(param.cmd)) { 522 | let root = false; 523 | if (!Utils.isNull(param.root) && param.root === true) { 524 | root = true; 525 | } 526 | rs = shell(param.cmd, root); 527 | if (rs.code == 0) { 528 | console.log("run shell success", JSON.stringify(rs)); 529 | } else { 530 | console.log("run shell failed", JSON.stringify(rs)); 531 | } 532 | } 533 | return rs.code == 0; 534 | }, 535 | /** 536 | * 点击指定图片 537 | * @param {*} mark 538 | * @param {*} param 539 | */ 540 | doImage: function (mark, param) { 541 | console.log('do image'); 542 | let img = null; 543 | try { 544 | if (!Utils.isNull(mark.path)) { 545 | // console.log('image read from path'); 546 | if (files.isFile(mark.path)) 547 | img = images.read(mark.path) 548 | } 549 | if (!Utils.isNull(mark.base64)) { 550 | // console.log('image from base64'); 551 | img = images.fromBase64(mark.base64); 552 | } 553 | if (!Utils.isNull(mark.url)) { 554 | // console.log('image load from url'); 555 | img = images.load(mark.url); 556 | } 557 | if (img != null) { 558 | let p = findImage(captureScreen(), img); 559 | if (p) { 560 | let x = p.x + img.getWidth() / 2; 561 | let y = p.y + img.getHeight() / 2; 562 | console.log("find image: ", p, img.getWidth(), img.getHeight(), x, y); 563 | if(!!param && !Utils.isNull(param.action) && Utils.titleCase(param.action) == 'Tap'){ 564 | Tap(x, y); 565 | sleep(1000); 566 | } 567 | return true; 568 | } else { 569 | console.log("not find image"); 570 | return false; 571 | } 572 | } 573 | console.log("not find image"); 574 | return false; 575 | } catch (error) { 576 | console.log("do image in catch", error); 577 | return false; 578 | } 579 | 580 | }, 581 | /** 582 | * 一直返回true 583 | * @param {*} mark 584 | * @param {*} param 585 | */ 586 | doUnknow:function(mark,param){ 587 | return true; 588 | }, 589 | /** 590 | * 591 | * 根据传入的属性,判断对应的节点是否存在,OK 592 | * 593 | * @param {*} mark 594 | */ 595 | doExists: function (mark, param) { 596 | // console.log('do exists'); 597 | if (!Utils.isNull(mark.name)) { 598 | return this.doFun(mark); 599 | // return eval('this.do'+Utils.titleCase(mark.name)+'(mark.mark, param)'); 600 | } else { 601 | let target = this.build(mark); 602 | // console.log(this.build(mark).exists()); 603 | let rs = !!target ? target.exists() : false; 604 | console.log('do exists:',rs); 605 | return rs; 606 | } 607 | }, 608 | /** 609 | * 换IP,OK 610 | * @param {*} mark 611 | * @param {*} param 612 | */ 613 | doFly: function (mark, param) { 614 | console.log('do fly'); 615 | let rm = -1; 616 | if (!!param && !Utils.isNull(param.delay) && param.delay > -1) { 617 | rm = parseInt(param.delay) * 1000; 618 | } 619 | if (rm == -1 || rm == undefined || rm == null || rm == "") { 620 | rm = random(30000, 60000); 621 | } 622 | //开启飞行模式 623 | Funs.closeFly(); 624 | sleep(rm); 625 | //关闭飞行模式 626 | Funs.openFly(); 627 | return true; 628 | }, 629 | /** 630 | * 点击父控件,OK 631 | * @param {*} target 632 | */ 633 | clickParent: function (target) { 634 | if (!!target) { 635 | let count = target.depth(); 636 | // console.log('depth:'+count); 637 | while (count > 0 && target != null) { 638 | if (target.clickable()) { 639 | target.click(); 640 | count = -1; 641 | break; 642 | } else { 643 | if (!!target.parent()) { 644 | target = target.parent(); 645 | count -= 1; 646 | } else { 647 | count = -1; 648 | break; 649 | } 650 | } 651 | } 652 | if (count == -1) { 653 | return true; 654 | } 655 | } else { 656 | console.log('not click parent'); 657 | } 658 | return false; 659 | }, 660 | /** 661 | * 662 | * 点击子控件 663 | * 664 | * @param {*} target 665 | */ 666 | clickChild: function (target) { 667 | if (!!target) { 668 | if (target.clickable()) { 669 | return target.click(); 670 | } else { 671 | target.children().forEach(child => { 672 | if (child.clickable()) { 673 | return child.click(); 674 | } 675 | }); 676 | } 677 | } else { 678 | console.log('not click child'); 679 | } 680 | return false; 681 | }, 682 | /** 683 | * 设置全局变量 684 | * @param {*} mark 685 | * @param {*} param 686 | */ 687 | doSet: function (mark, param) { 688 | console.log('do set'); 689 | if (!!mark && !Utils.isNull(mark.name)) { 690 | let valName = "cur" + Utils.titleCase(mark.name); 691 | let value = ''; 692 | if (!!param && !Utils.isNull(param.default)) { 693 | value = param.default; 694 | } 695 | return eval("Env." + valName + "=value;"); 696 | } 697 | return null; 698 | }, 699 | /** 700 | * 获取全局变量的内容或者调用指定API获取内容并设置全局变量 701 | * @param {*} mark 702 | * @param {*} param 703 | */ 704 | doGet: function (mark, param) { 705 | console.log('do get'); 706 | let result = null; 707 | //增加默认值,默认值写在mark里 708 | if (!!mark && !Utils.isNull(mark.default)){ 709 | result = mark.default; 710 | } 711 | if (!!mark && !Utils.isNull(mark.name)) { 712 | 713 | let valName = "Env.cur" + Utils.titleCase(mark.name); 714 | if (!Utils.isNull(mark.uri)) { 715 | if (mark.uri == 'api') { 716 | valName = Utils.titleCase(mark.uri) + "." + "get" + Utils.titleCase(mark.name) + "();"; 717 | } 718 | let rs = eval(valName); 719 | let setName = { name: mark.name }; 720 | if (!!param && !Utils.isNull(param.set)) { 721 | setName = param.set; 722 | } 723 | this.doSet(setName, { default: rs }); 724 | return rs; 725 | } else { 726 | return eval(valName); 727 | } 728 | } 729 | return result; 730 | }, 731 | /** 732 | * 调用指定名称的函数,OK 733 | * @param {*} name 734 | * @param {*} mark 735 | * @param {*} params 736 | */ 737 | doFun: function ({ name, mark, param }) { 738 | let delay = 1000; 739 | if (!!param && param.delay > -1) { 740 | delay = param.delay; 741 | } 742 | sleep(delay); 743 | if (!!name) { 744 | let funName = "do" + Utils.titleCase(name); 745 | // 增加循环执行,解决某些标记问题 746 | let loops = 1; 747 | let result = false; 748 | if(!!param && !Utils.isNull(param.loops) && param.loops > 1){ 749 | loops = param.loops; 750 | } 751 | while(loops > 0){ 752 | result = eval("this." + funName + "(mark,param);"); 753 | loops--; 754 | } 755 | return result; 756 | } else { 757 | console.log('not do fun:' + name); 758 | } 759 | }, 760 | delay: function () { 761 | let type = arguments[0] === false ? false : true; 762 | let delay = typeof (arguments[0]) === "number" ? arguments[0] : 1000; 763 | if (type) { 764 | sleep(delay); 765 | console.log('delay', delay); 766 | } else { 767 | console.log('not delay'); 768 | } 769 | } 770 | } 771 | 772 | module.exports = operate; 773 | 774 | 775 | -------------------------------------------------------------------------------- /src/common/sms.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 短信指定接收,目前采用51短信平台 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * @author Tuple 5 | * @version 0.1 6 | */ 7 | 8 | 9 | var Env = require('../env'); 10 | 11 | var sms={ 12 | 13 | _errorCode: { 14 | 1001: '参数token不能为空', 15 | 1002: '参数action不能为空', 16 | 1003: '参数action错误', 17 | 1004: 'token失效', 18 | 1005: '用户名或密码错误', 19 | 1006: '用户名不能为空', 20 | 1007: '密码不能为空', 21 | 1008: '账户余额不足', 22 | 1009: '账户被禁用', 23 | 1010: '参数错误', 24 | 1011: '账户待审核', 25 | 1012: '登录数达到上限', 26 | 2001: '参数itemid不能为空', 27 | 2002: '项目不存在', 28 | 2003: '项目未启用', 29 | 2004: '暂时没有可用的号码', 30 | 2005: '获取号码数量已达到上限', 31 | 2006: '参数mobile不能为空', 32 | 2007: '号码已被释放', 33 | 2008: '号码已离线', 34 | 2009: '发送内容不能为空', 35 | 2010: '号码正在使用中', 36 | 3001: '尚未收到短信', 37 | 3002: '等待发送', 38 | 3003: '正在发送', 39 | 3004: '发送失败', 40 | 3005: '订单不存在', 41 | 3006: '专属通道不存在', 42 | 3007: '专属通道未启用', 43 | 3008: '专属通道密码与项目不匹配', 44 | 9001: '系统错误', 45 | 9002: '系统异常', 46 | 9003: '系统繁忙' 47 | }, 48 | 49 | getPhone:function(itemid) { 50 | 51 | var baseUrl = 'http://api.fxhyd.cn/UserInterface.aspx?action=getmobile&token=' + Env.token + '&itemid=' + itemid + '&excludeno=' + Env.exceptPhone + '×tamp=' + new Date().getTime() // 52 | var r = http.get(baseUrl); 53 | console.log("从平台获取手机号码code = " + r.statusCode); 54 | var result = r.body.string() 55 | console.log("从平台获取手机号码html = " + result); 56 | if (result.indexOf('success') != -1) { 57 | result = result.split('|'); 58 | var phone = result[1] 59 | console.log('手机号码=', phone) 60 | return phone 61 | } else { 62 | console.log(this._errorCode[result]) 63 | console.log('从平台获取手机号码异常,请检查网络或者token是否失效,脚本停止') 64 | return null; 65 | } 66 | }, 67 | 68 | getSMS:function(phone, itemid) { 69 | var count = 50; 70 | var r = null; 71 | var result = null; 72 | var baseUrl = 'http://api.fxhyd.cn/UserInterface.aspx?action=getsms&token=' + Env.token + '&itemid=' + itemid + '&mobile=' + phone + '&release=1×tamp=' + new Date().getTime(); 73 | while (count > 0) { 74 | r = http.get(baseUrl); 75 | console.log("从平台获取手机验证码code = " + r.statusCode); 76 | result = r.body.string(); 77 | console.log("从平台获取手机验证码html = " + result); 78 | toast(result); 79 | if (result != 3001) { 80 | break; 81 | } 82 | count -= 1; 83 | sleep(3000); 84 | } 85 | if (!!result && result.indexOf('success') != -1) { 86 | result = result.split('|'); 87 | var code = result[1].match(/\d{6}/g).join(""); 88 | console.log('验证码=', code) 89 | return code 90 | } else { 91 | 92 | console.log(this._errorCode[result]) 93 | console.log('从平台获取手机验证码异常,请检查网络或者token是否失效') 94 | return null 95 | } 96 | }, 97 | 98 | sendSMS:function(phone, itemid, msg) { 99 | 100 | var baseUrl = 'http://api.fxhyd.cn/UserInterface.aspx?action=sendsms&token=' + Env.token + '&itemid=' + itemid + '&mobile=' + phone + '&sms=' + msg + '×tamp=' + new Date().getTime(); 101 | var r = http.get(baseUrl); 102 | console.log("从手机号码发送code = " + r.statusCode); 103 | var result = r.body.string(); 104 | toast(result); 105 | console.log("从平台发送手机号码html = " + result); 106 | if (result.indexOf('success') != -1) { 107 | return result 108 | } else { 109 | console.log(this._errorCode[result]) 110 | console.log('从平台发送短信异常,请检查网络或者Env.是否失效,脚本停止') 111 | return null 112 | } 113 | }, 114 | 115 | addPhoneBack:function(phone, itemid) { 116 | var baseUrl = 'http://api.fxhyd.cn/UserInterface.aspx?action=addignore&token=' + Env.token + '&itemid=' + itemid + '&mobile=' + phone + '×tamp=' + new Date().getTime() // 117 | var r = http.get(baseUrl); 118 | console.log("拉黑手机号码code = " + r.statusCode); 119 | var result = r.body.string() 120 | console.log("拉黑手机号码html = " + result); 121 | if (result.indexOf('success') != -1) { 122 | console.log('手机号码拉黑成功=', phone) 123 | } else { 124 | console.log(this._errorCode[result]) 125 | console.log('拉黑手机号码异常,请检查网络或者token是否失效,脚本停止') 126 | return null; 127 | } 128 | } 129 | } 130 | module.exports=sms 131 | -------------------------------------------------------------------------------- /src/common/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 工具函数类 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * @author Tuple 5 | * @version 0.1 6 | */ 7 | 8 | var Utils = { 9 | /** 10 | * 首字母大写 11 | * @param {*} str 12 | */ 13 | titleCase: function (str) { 14 | var a = str.toLowerCase().split('_'); 15 | var b = a.map(function (val) { return val.replace(val.charAt(0), val.charAt(0).toUpperCase()) }) 16 | return b.join(''); 17 | }, 18 | fill: function (len, item) { 19 | var l = []; 20 | for (var i = 0; i < len; i += 1) { 21 | l.push(JSON.parse(JSON.stringify(item))); 22 | } 23 | return l; 24 | }, 25 | get: function (arr, name, value) { 26 | return arr.find(function (obj) { if (eval("obj." + name + " == value")) { return obj; } }); 27 | }, 28 | isNull: function (str) { 29 | //为空判断函数 30 | return !str && str !== 0 && typeof str !== "boolean" ? true : false; 31 | } 32 | 33 | } 34 | module.exports = Utils; -------------------------------------------------------------------------------- /src/common/work.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | var Env = require('../env'); 20 | var Api = require('./api'); 21 | var Utils = require('./utils'); 22 | var Operate = require('./operate'); 23 | 24 | 25 | var work = { 26 | 27 | _curPage: 0, 28 | _curConf: null, 29 | _pageList: [], 30 | _curStep: 0, 31 | _curJob: {}, 32 | _needExit:false, 33 | 34 | init: function (job) { 35 | auto(); 36 | 37 | var _curRa = new RootAutomator(); 38 | events.on('exit', function () { 39 | _curRa.exit(); 40 | }); 41 | //获取截屏的权限 42 | requestScreenCapture(); 43 | 44 | let package = job.package; 45 | 46 | if (currentPackage() != package) { 47 | launch(package); 48 | waitForPackage(package); 49 | sleep(5000); 50 | } 51 | let activity = job.activity; 52 | if(!Utils.isNull){ 53 | toast('Wait For Activity:',activity); 54 | console.log('Wait For Activity:',activity); 55 | waitForActivity(activity); 56 | } 57 | //远程获取配置 58 | Api.getConfig(); 59 | toast('获取配置成功'); 60 | console.log('获取配置成功'); 61 | sleep(1000); 62 | 63 | }, 64 | 65 | /** 66 | * 主函数 67 | */ 68 | main: function (jib, afterInit) { 69 | //初始化变量 70 | this._curJob = jib; 71 | 72 | //初始化 73 | this.init(this._curJob); 74 | 75 | //执行回调 76 | if (typeof afterInit === 'function') { 77 | afterInit(this._curJob); 78 | } 79 | 80 | 81 | // let items = { 82 | // login: JSON.parse(JSON.stringify(this._curJob.login)), 83 | // nickname: JSON.parse(JSON.stringify(this._curJob.nickname)), 84 | // write: JSON.parse(JSON.stringify(this._curJob.write)), 85 | // logout: JSON.parse(JSON.stringify(this._curJob.logout)), 86 | // running: JSON.parse(JSON.stringify(this._curJob.running)), 87 | // }; 88 | //初始化 89 | while (!this._needExit) { 90 | //判断下一步的位置 91 | this.nextStep(); 92 | for( let item of this._curJob.default.steps){ 93 | if(item.step == this._curStep){ 94 | this.run(JSON.parse(JSON.stringify(item))); 95 | } 96 | } 97 | 98 | sleep(1000); 99 | } 100 | //结束 101 | Api.finish(); 102 | 103 | }, 104 | 105 | /** 106 | * 判断下一步执行什么 107 | */ 108 | nextStep: function () { 109 | let conf = Operate.curPage(this._curJob.pages); 110 | if (this._curPage != conf.pageid) { 111 | if (!!conf.operates && !!conf.operates.finish && conf.operates.finish.length > 0) { 112 | // this._pageList.splice(0,0,conf); 113 | this._pageList.push(conf); 114 | } 115 | this._curPage = conf.pageid; 116 | this._curConf = conf; 117 | } 118 | let someone = this._curJob.default.someone; 119 | for (let item of this._curJob.default.steps) { 120 | if (item.step === this._curStep && someone.length > 0) { 121 | someone = item.step.someone; 122 | break; 123 | } 124 | } 125 | this._curStep = Operate.nextStep(this._curPage, someone); 126 | toast('find:' + conf.name, this._curStep); 127 | console.log('find:' + conf.name, this._curStep); 128 | 129 | }, 130 | 131 | /** 132 | * 执行指定任务 133 | * @param {*} items 134 | */ 135 | run: function (items) { 136 | this.doPage(items, this._curConf); 137 | sleep(1000); 138 | }, 139 | /** 140 | * 处理页面的操作 141 | * @param {*} items 142 | * @param {*} conf 143 | */ 144 | doPage: function (items, conf) { 145 | let _job = null; 146 | console.log('items.length start', items.must.length, this._curStep); 147 | if (!!conf && !!conf.pageid && items.must.length > 0) { 148 | for (let m in items.must) { 149 | if (conf.pageid === items.must[m].pageid) { 150 | // toast(conf.name); 151 | // console.log(JSON.stringify(items[m].jobs)); 152 | _job = items.must[m]; 153 | // console.log(m,items[m].pageid); 154 | items.must.splice(m, 1); 155 | break; 156 | } 157 | } 158 | // console.log('in do page job 1:', JSON.stringify(_job)); 159 | if (_job == null) { 160 | for (let m in this._curJob.default.someone) { 161 | if (conf.pageid === this._curJob.default.someone[m].pageid) { 162 | // toast(conf.name); 163 | // console.log(JSON.stringify(this._curJob.default[m].jobs)); 164 | _job = this._curJob.default.someone[m]; 165 | // console.log(m,this._curJob.default[m].pageid); 166 | break; 167 | } 168 | } 169 | } 170 | // console.log('in do page job:', JSON.stringify(_job)); 171 | if (_job != null) { 172 | if (!!_job.next) { 173 | this._curStep = _job.next; 174 | } 175 | // console.log('in do page this._curjob.jobs:', JSON.stringify(_job.jobs)); 176 | if (!!_job && !!_job.jobs) { 177 | for (let im of _job.jobs) { 178 | // console.log('in do page conf.mark:', JSON.stringify(conf.mark)); 179 | if (conf.pageid !== Env.PageEnum.UNKNOW && Operate.isPage(conf.mark)) { 180 | // console.log('loop job:', JSON.stringify(im)); 181 | Operate.doFun(im); 182 | } else { 183 | // console.log('not in right page:', conf.name); 184 | break; 185 | } 186 | } 187 | 188 | } 189 | if (!Utils.isNull(_job.exit) && _job.exit === true) { 190 | this._needExit = true; 191 | } 192 | } 193 | } 194 | console.log('items.must.length end', items.must.length, this._curStep); 195 | 196 | }, 197 | 198 | /** 199 | * 通过返回操作,回到首页 200 | */ 201 | reset: function () { 202 | while (true) { 203 | let conf = Operate.curPage(this._curJob.pages); 204 | if (Env.PageEnum.HOME != conf.pageid) { 205 | toast('找到:' + conf.name); 206 | console.log('找到:' + conf.name); 207 | break; 208 | } else { 209 | this.doBack(); 210 | } 211 | sleep(1000); 212 | 213 | } 214 | }, 215 | /** 216 | * 返回操作 217 | */ 218 | doBack: function () { 219 | let im = { name: "back" }; 220 | Operate.doFun(im); 221 | }, 222 | 223 | /** 224 | * 处理页面的finish操作 225 | * @param {*} pageList 226 | */ 227 | finishPage: function (pageList) { 228 | result = false; 229 | for (let k = pageList.length - 1; k >= 0; k--) { 230 | let item = pageList[k]; 231 | //执行finish 232 | if (!!item.operates && !!item.operates.finish) { 233 | if (Operate.isPage(item.mark)) { 234 | for (let im of item.operates.finish) { 235 | Operate.doFun(im); 236 | } 237 | pageList.splice(k, 1); 238 | console.log('delete finish page:', item.name); 239 | } else { 240 | console.log('finish, but not in right page:', item.name); 241 | } 242 | } 243 | sleep(1000); 244 | }; 245 | if (pageList.length <= 0) { 246 | result = false; 247 | } 248 | console.log('finishPage:', JSON.stringify(pageList), result); 249 | return result; 250 | }, 251 | } 252 | module.exports = work; 253 | -------------------------------------------------------------------------------- /src/env.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 全局变量 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * @author Tuple 5 | * @version 0.1 6 | */ 7 | 8 | 9 | var Env = { 10 | 11 | VERSION: "3.0", 12 | CLIENT: 'weibo', 13 | 14 | STATUS_NEED_ACTIVE: 1, 15 | STATUS_NEED_LOGIN: 2, 16 | 17 | log: '', 18 | curAct: '', 19 | curTitleContent: '',//详情页的标题 20 | curComment: '键(shui)盘(jun)侠你们清楚自己在干嘛吗?', 21 | curName: '', 22 | deviceIMEI: '', 23 | nickname: '', //登陆的账号 24 | curGroupId: 0, // 25 | curTitle: '', //列表页的标题 26 | canReply: false, 27 | mainActName: 'com.sina.weibo.MainTabActivity', 28 | isLogined: true, 29 | needExit: false, 30 | maxReplyCount: 2, 31 | curReplyCount: 0, //一次可以回复的最大次数 32 | lastReplyTime: 0, 33 | curMinReplyIntv: 1800, //30分钟才能回复第二条 34 | curLoop: false, 35 | isComment: 1, //0评论,1转发 36 | curKeyword: null, 37 | curKeywords: ['十年沧桑谁解'], 38 | // login 39 | itemLogin: '11698', 40 | itemJihuo: '1507', 41 | token: '01612967355ef542176c2740c0855e2a5921725c4701', 42 | exceptPhone: '170.171.180.198.165.166', 43 | curPhone: '', //当前使用的手机号 44 | curLoginCode: '', 45 | curHotTextItem: '', 46 | curUsername: '', 47 | curPassword: '', 48 | curRegisterCode: '', 49 | itemRegister: '47028', //网易邮箱 50 | curDefaultPassword:'123.youshui.Ren', 51 | curPHoneList:[], 52 | // console.show(), 53 | config: { 54 | debug: false, 55 | disabled: false, 56 | canReply: false, 57 | canReplyDisabled: false, 58 | exit: false, 59 | model: 0, //0为趁热点,1为通过搜索指定关键字回复 60 | groupId: 0, 61 | topOfGroup: 10, 62 | groupDelay: 2000, 63 | subGroupId: -1, 64 | groupItems: ['推荐', '榜单', '社会', '搞笑', '情感', '时尚', '校园', '摄影', '艺术', '明星', '美女', 'NBA'], 65 | keywords: ['十年沧桑谁解'], 66 | addFollowRate: 30, 67 | showDetialRate: 5, 68 | maxReplyCount: 2, 69 | minReplyIntv: 1800, 70 | loop: false, //循环 71 | isComment: 1, 72 | itemLogin: '11698', 73 | itemJihuo: '1507', 74 | itemRegister: '47028', 75 | exceptPhone: '170.171.180.198.165.166', 76 | token: '01612967355ef542176c2740c0855e2a5921725c4701', 77 | }, 78 | 79 | PRIORITY:{ 80 | LEVEL_0:0, //默认级别 81 | LEVEL_1:1, 82 | LEVEL_2:2, 83 | LEVEL_3:3, 84 | LEVEL_4:4, 85 | LEVEL_5:5, 86 | LEVEL_6:6, 87 | LEVEL_7:7, 88 | LEVEL_8:8, 89 | LEVEL_9:9, //最高优先级 90 | }, 91 | PageEnum: { 92 | UNKNOW:0, 93 | LOGIN: 1, 94 | INPUT_CODE: 2, 95 | ACCOUNT_CONFIRM: 3, 96 | SELECT_CLASS: 4, 97 | RECOMMEND: 5, 98 | SIGEN: 6, 99 | USER_CENTER: 7, 100 | DETAIL: 8, 101 | HOME_HOT: 9, 102 | MINE: 10, 103 | SETTING: 11, 104 | ACCOUNTS: 12, 105 | HOME_FOLLOW: 13, 106 | HOME_SEARCH: 14, 107 | SEARCH: 15, 108 | SEARCH_HOT: 16, 109 | SEARCH_TALK: 17, 110 | SEARCH_TOP: 18, 111 | SEARCH_SUPTALK: 19, 112 | HOME_MESSAGE: 20, 113 | USER_WEIBO: 21, 114 | EDIT_SHARE: 22, 115 | ADD_FOLLOW_WITH_SHARE: 23, 116 | ACCOUNT_ERROR: 24, 117 | WELCOME_CAMEBACK: 25, 118 | WRITE_WEIBO: 26, 119 | WELCOME_WEIBO: 27, 120 | ACCOUNT_ERROR_2: 28, 121 | ACCOUNT_ERROR_3: 29, 122 | ACCOUNT_ERROR_4: 30, 123 | HOME: 31, 124 | ACCOUNT_ERROR_5: 32, 125 | ACCOUNT_ERROR_6: 33, 126 | REGISTER: 35, 127 | ACCOUNT_SEND_CONFIRM: 36, 128 | REGISTER_OK: 37, 129 | UPDATED:38, 130 | INPUT_PHONE: 39, 131 | INPUT_PASSWORD: 40, 132 | FIND_PASSWORD:41, 133 | RED_PAGE:42, 134 | RED_FRIEND_PAGE:43, 135 | RED_BUY_PAGE:44, 136 | SHARE:45, 137 | DELETE_CONFIRM:46, 138 | LOGIN_CODE:47, 139 | LOGIN_ACCOUNT:48, 140 | DELETE_FRAM:49, 141 | }, 142 | 143 | /** 144 | * @description 定义各步骤的标志 145 | */ 146 | STEP: { 147 | NOCHANGE: 0, 148 | LOGIN: 1, 149 | WRITE: 3, 150 | LOGOUT: 9, 151 | NICKNAME: 2, 152 | ISSTEP: 5, 153 | NEEDLOGOUT: 6, 154 | LOGINED: 7, 155 | RUNNING: 8, 156 | BEFORE:9, 157 | }, 158 | 159 | } 160 | module.exports = Env; 161 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | var Work = require('./common/work'); 20 | var Env = require('./env'); 21 | 22 | /** 23 | * 注意:如果一个页面有多个特征码匹配,以最后一个为准 24 | */ 25 | var Job = { 26 | CLIENT: '云闪付-签到', 27 | package: 'com.unionpay', 28 | activity: "com.unionpay.activity.UPActivityMain", 29 | /** 30 | * @description 默认配置,自动加载 31 | */ 32 | get default() { 33 | return { 34 | /** 35 | * @description steps定义当前任务需要完成工作的步骤 36 | */ 37 | steps: [this.running], 38 | /** 39 | * @description 指定某一步骤的最大重复次数 40 | */ 41 | maxTimes: [-1], 42 | /** 43 | * @description 定义可能遇到的页面默认处理方式; next:为强制跳转,pageid:为页面ID,jobs:为具体的执行操作 44 | */ 45 | someone: [ 46 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.SELECT_CLASS, jobs: this.pages.SELECT_CLASS.operates.next }, 47 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 48 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.LOGIN, jobs: this.pages.LOGIN.operates.next }, 49 | ], 50 | } 51 | }, 52 | /** 53 | * @description Running步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 54 | */ 55 | get running() { 56 | return { 57 | step: Env.STEP.RUNNING, 58 | must: [ 59 | { pageid: Env.PageEnum.SELECT_CLASS, jobs: this.pages.SELECT_CLASS.operates.next }, 60 | { pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 61 | { pageid: Env.PageEnum.LOGIN, jobs: this.pages.LOGIN.operates.next }, 62 | ], 63 | someone: [], 64 | } 65 | }, 66 | 67 | /** 68 | * ... 还可以定义更多的步骤 69 | */ 70 | /** 71 | * 定义页面的识别标志及具体的各操作 72 | */ 73 | pages: { 74 | SELECT_CLASS: { 75 | desc: "关闭更新弹窗", 76 | name: "关闭更新弹窗", 77 | pageid: Env.PageEnum.SELECT_CLASS, 78 | mark: { id: "btn_cancel" }, 79 | next: [], 80 | operates: { 81 | next: [ 82 | { name: "click", mark: { id: "btn_cancel" } }, 83 | ] 84 | }, 85 | }, 86 | LOGIN: { 87 | desc: "进入签到页按钮", 88 | name: "进入签到页按钮", 89 | /** 90 | * mark: 页面的标志控件,当页面找到匹配mark属性的控件时,我们认为它就位于这个页面 91 | * mark可能的属性:id,text,desc,className,textStartsWith,textEndsWith, 92 | * descStartsWith,descEndsWith 具体可以参考Autojs控件uiselector的函数 93 | */ 94 | mark: { id: "frog_float_gif" }, 95 | pageid: Env.PageEnum.LOGIN, 96 | next: [], 97 | operates: { 98 | next: [ 99 | { name: "click", mark: { id: "frog_float_gif" } }, 100 | ], 101 | }, 102 | }, 103 | 104 | HOME: { 105 | desc: "签到", 106 | name: "签到", 107 | pageid: Env.PageEnum.HOME, 108 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 109 | mark: { id: "签到" }, 110 | next: [], 111 | operates: { 112 | next: [ 113 | { name: "click", mark: { id: "签到" } }, 114 | ], 115 | finish: [{ name: "sleep" }], 116 | }, 117 | }, 118 | }, 119 | }; 120 | 121 | /** 122 | * 初始化后执行 123 | */ 124 | function afterInit() { 125 | sleep(1000); 126 | } 127 | 128 | var __curJob = JSON.parse(JSON.stringify(Job)); 129 | //运行 130 | Work.main(__curJob, afterInit); 131 | -------------------------------------------------------------------------------- /src/layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/work/test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 测试文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * @author Tuple 5 | * @version 0.1 6 | */ 7 | 8 | var Env = require('../env'); 9 | var Api = require('../common/api'); 10 | var Utils = require('../common/utils'); 11 | var Operate = require('../common/operate'); 12 | const weiboqianbao_hong = "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"; 13 | const zhaoqidaka = "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"; 14 | 15 | var _curRa = new RootAutomator(); 16 | events.on('exit', function () { 17 | _curRa.exit(); 18 | }); 19 | //获取截屏的权限 20 | requestScreenCapture(); 21 | 22 | 23 | function test() { 24 | // var item = {id: "mmmm||kkkkkkkk", text: "微博||我们一起||smmkkksss", desc: "555555555", className: "444444||mm5888885" }; 25 | let item = { 26 | name: "微博正文", pageid: Env.PageEnum.DETAIL, 27 | mark: { id: "detail_activity_header_title_text", text: "微博正文", desc: "", className: "" }, 28 | operates: { 29 | config: { loop: 1 }, 30 | init: [], 31 | jobs: [ 32 | //点击微博详情的关注按钮 33 | // { name: "click", mark: { id: "tv_op_button", text: "关注" } }, 34 | //点击微博详情的赞按钮,两种可能 35 | // { name: "click", mark: { id: "liked", desc: "赞" } }, 36 | // { name: "click", mark: { id: "tvButton", text: "赞" } }, 37 | //点击微博详情的转发按钮 38 | // { name: "click", mark: { id: "forward", desc: "转发" } }, 39 | // { name: "click", mark: { id: "tvButton", text: "转发" } }, 40 | //点击微博详情的评论按钮 41 | // {name:"click",mark:{id:"comment",desc:"评论"}}, 42 | // {name:"click",mark:{id:"tvButton",text:"评论"}}, 43 | // {name:"swipe"}, 44 | // {name:"swipe",param:{count:-1}}, 45 | // {name:"swipe",param:{count:0}}, 46 | // {name:"swipe",param:{count:5}}, 47 | // {name:"swipe",param:{count:"1"}}, 48 | // {name:"refresh"}, 49 | // {name:"sleep"}, 50 | // {name:"sleep",param:{delay:-1}}, 51 | // {name:"sleep",param:{delay:0}}, 52 | // {name:"sleep",param:{delay:500}}, 53 | // {name:"sleep",param:{delay:""}}, 54 | // {name:"desc",mark:{id:"contentTextView"}}, 55 | // {name:"text",mark:{id:"tv_groupName"}}, 56 | // {name:"text",mark:{id:"tvNick"},param:{set:"name"}}, 57 | // {name:"set",mark:{name:"name"},param:{default:"surpaimb"}}, 58 | // {name:"set",mark:{name:"title_content"},param:{default:"title is ok"}}, 59 | // {name:"get",mark:{name:"title_content"}}, 60 | // {name:"get",mark:{name:"name"}}, 61 | // {name:"get",mark:{name:"keyword",uri:"api"},param:{set:{name:"keyword"}}}, 62 | // {name:"get",mark:{name:"keyword",uri:"api"}}, 63 | // {name: "set_text", mark:{id:"tv_search_keyword"},param:{get:{name:"keyword"}}}, 64 | // {name:"enter"}, 65 | // {name:"desc",mark:{className:"android.view.ViewGroup",desc:"我"}}, 66 | // {name:"tap",mark:{className:"android.view.ViewGroup",desc:"我"}}, 67 | // {name:"input",mark:{id:"edit_view"},param:{type:"reply"}}, //type:reply|code 68 | // {name:"get",mark:{name:"login_phone",uri:"api"},param:{set:{name:"phone"}}}, 69 | // {name:"set_text",mark:{id:"et_phone"},param:{get:{name:"phone"}}}, 70 | // {name:"click", mark:{id:"bnLogin",text:"获取验证码"}}, 71 | // // {name:"get",mark:{name:"login_code",uri:"api"},param:{set:{name:"login_code"}}}, 72 | // {name:"input",mark:{id:"verification_code"},param:{get:{name:"login_code",uri:"api"}}}, 73 | // { name: "click", mark: { id: "next" } }, 74 | // { name: "sleep" }, 75 | // { name: "click", mark: { id: "next" } }, 76 | // { name: "click", mark: { id: "contentTextView" }, param: { indexOf: -1 } }, 77 | 78 | // {name:"click", mark:{id:"button_more_columns"}}, 79 | // {name:"click", mark:{id:"text_item"}, param:{indexOf:{tag:"text",get:{name:"hot_text_item",uri:"api"}}}}, 80 | 81 | // {name:"click", mark:{id:"rltitleSave"}}, 82 | // {name:"exists", mark:{id:"iv_groupStateIndicator"}}, 83 | // {name:"exists", mark:{id:"tv_groupName"}}, 84 | // {name:"exists", mark:{className:"android.widget.TextView",text:"写微博"}}, 85 | // {name:"click", mark:{className:"android.widget.TextView",text:"写微博"}}, 86 | // {name:"exists", mark:{desc:"写微博"}}, 87 | 88 | // { name: "click", mark: { id: "checkbox" } }, 89 | // { name: "set_text", mark: { id: "edit_view" }, param: { get: { name: "comment", uri: "api" } } }, 90 | // { name: "click", mark: { id: "rltitleSave" } }, 91 | 92 | // {name:"click", mark:{id:"tv_content1"}, param:{indexOf:{tag:"text",try:10,get:{name:"given_weibo_title",uri:"api"}}}}, 93 | //寻找指定的文章 94 | // {name:"click", mark:{id:"tv_userinfo"}, param:{indexOf:{tag:"text",try:10,get:{name:"given_weibo_title",uri:"api"}}}}, 95 | // failed {name:"click", mark:{id:"tv_content1"}, param:{indexOf:{tag:"textContains", try:10,get:{name:"given_weibo_title",uri:"api"}}}}, 96 | // 进入自己发布的文件列表 97 | // { name: "back"}, 98 | // {name:"swipe"}, 99 | // { name: "image", mark: { base64: weiboqianbao_hong }} 100 | // { name: "input", mark:{ className:"android.widget.TextView", text: "取消" },param:{get:{default:"mail.163.com"},parent:1,indexOf:{tag:"className", default:"android.view.View"}}}, 101 | // { name: "sleep"}, 102 | // { name: "tap", mark:{ className:"android.widget.TextView", text: "进入"}}, 103 | // { name :"exists", mark:{className:"com.tencent.mtt.browser.homepage.view.fastlink.g", text: "直播交友"}}, 104 | // { name :"exists", mark:{text: "进入"}}, 105 | { name: "exists", mark: { className:"android.widget.Button", desc:"关注" } }, //喜欢 106 | { name: "exists", mark: { className:"android.widget.ImageView", descStartsWith:"未选中," } }, //喜欢 107 | { name: "tap", mark: { className:"android.widget.ImageView", descStartsWith:"未选中," } }, //喜欢 108 | { name: "click", mark: { className:"android.widget.ImageView", descStartsWith:"未选中," } }, //喜欢 109 | { name: "swipe"}, 110 | ], 111 | // finish: [{ name: "click", mark: { id: "tv_userinfo" }, param: { indexOf: { tag: "text", try: 10, get: { name: "given_weibo_title", uri: "api" } } } }], 112 | } 113 | }; 114 | 115 | //循环执行run 116 | if (!!item && !!item.operates && !!item.operates.jobs) { 117 | let loops = 1; 118 | if (!!item.operates.config.loop && item.operates.config.loop > -1) { 119 | loops = item.operates.config.loop; 120 | } 121 | while (loops > 0) { 122 | loops -= 1; 123 | for (let im of item.operates.jobs) { 124 | console.log('loop job:', loops, JSON.stringify(im)); 125 | // if (Operate.isPage(item.mark)) { 126 | if (true) { 127 | let rs = Operate.doFun(im); 128 | toast(rs); 129 | console.log('do fun return', rs); 130 | } else { 131 | console.log('not in right page:', item.name); 132 | break; 133 | } 134 | } 135 | sleep(500); 136 | } 137 | } 138 | 139 | console.log('curName:', Env.curName); 140 | console.log('curTitleContent:', Env.curTitleContent); 141 | console.log('curKeyword:', Env.curKeyword); 142 | console.log('curHotTextItem:', Env.curHotTextItem); 143 | 144 | // var ls = Operate.parseItem(item); 145 | // console.log("length:"+ls.length+":"+JSON.stringify(ls)); 146 | } 147 | 148 | 149 | test(); 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /src/work/云闪付-签到.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | 20 | var Work = require("../common/work"); 21 | var Env = require('../env'); 22 | 23 | /** 24 | * 注意:如果一个页面有多个特征码匹配,以最后一个为准 25 | */ 26 | var Job = { 27 | CLIENT: '云闪付-签到', 28 | package: 'com.unionpay', 29 | activity: "com.unionpay.activity.UPActivityMain", 30 | /** 31 | * @description 默认配置,自动加载 32 | */ 33 | get default() { 34 | return { 35 | /** 36 | * @description steps定义当前任务需要完成工作的步骤 37 | */ 38 | steps: [this.running], 39 | /** 40 | * @description 指定某一步骤的最大重复次数 41 | */ 42 | maxTimes: [-1], 43 | /** 44 | * @description 定义可能遇到的页面默认处理方式; next:为强制跳转,pageid:为页面ID,jobs:为具体的执行操作 45 | */ 46 | someone: [ 47 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.SELECT_CLASS, jobs: this.pages.SELECT_CLASS.operates.next }, 48 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 49 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.LOGIN, jobs: this.pages.LOGIN.operates.next }, 50 | ], 51 | } 52 | }, 53 | /** 54 | * @description Running步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 55 | */ 56 | get running() { 57 | return { 58 | step: Env.STEP.RUNNING, 59 | must: [ 60 | { pageid: Env.PageEnum.SELECT_CLASS, jobs: this.pages.SELECT_CLASS.operates.next }, 61 | { pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 62 | { pageid: Env.PageEnum.LOGIN, jobs: this.pages.LOGIN.operates.next }, 63 | ], 64 | someone: [], 65 | } 66 | }, 67 | 68 | /** 69 | * ... 还可以定义更多的步骤 70 | */ 71 | /** 72 | * 定义页面的识别标志及具体的各操作 73 | */ 74 | pages: { 75 | SELECT_CLASS: { 76 | desc: "关闭更新弹窗", 77 | name: "关闭更新弹窗", 78 | pageid: Env.PageEnum.SELECT_CLASS, 79 | mark: { id: "btn_cancel" }, 80 | next: [], 81 | operates: { 82 | next: [ 83 | { name: "click", mark: { id: "btn_cancel" } }, 84 | ] 85 | }, 86 | }, 87 | LOGIN: { 88 | desc: "进入签到页按钮", 89 | name: "进入签到页按钮", 90 | /** 91 | * mark: 页面的标志控件,当页面找到匹配mark属性的控件时,我们认为它就位于这个页面 92 | * mark可能的属性:id,text,desc,className,textStartsWith,textEndsWith, 93 | * descStartsWith,descEndsWith 具体可以参考Autojs控件uiselector的函数 94 | */ 95 | mark: { id: "frog_float_gif" }, 96 | pageid: Env.PageEnum.LOGIN, 97 | next: [], 98 | operates: { 99 | next: [ 100 | { name: "click", mark: { id: "frog_float_gif" } }, 101 | ], 102 | }, 103 | }, 104 | 105 | HOME: { 106 | desc: "签到", 107 | name: "签到", 108 | pageid: Env.PageEnum.HOME, 109 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 110 | mark: { id: "签到" }, 111 | next: [], 112 | operates: { 113 | next: [ 114 | { name: "click", mark: { text: "签到" } }, 115 | ], 116 | finish: [{ name: "sleep" }], 117 | }, 118 | }, 119 | }, 120 | }; 121 | 122 | /** 123 | * 初始化后执行 124 | */ 125 | function afterInit() { 126 | sleep(1000); 127 | } 128 | 129 | var __curJob = JSON.parse(JSON.stringify(Job)); 130 | //运行 131 | Work.main(__curJob, afterInit); -------------------------------------------------------------------------------- /src/work/叮咚买菜-签到.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | 20 | var Work = require("../common/work"); 21 | var Env = require('../env'); 22 | 23 | /** 24 | * 注意:如果一个页面有多个特征码匹配,以最后一个为准 25 | */ 26 | var Job = { 27 | version: '9.0.2', 28 | CLIENT: '叮咚买菜-签到', 29 | package: 'com.yaya.zone', 30 | activity: "com.yaya.zone.activity.HomeActivity", 31 | /** 32 | * @description 默认配置,自动加载 33 | */ 34 | get default() { 35 | return { 36 | /** 37 | * @description steps定义当前任务需要完成工作的步骤 38 | */ 39 | steps: [this.running], 40 | /** 41 | * @description 指定某一步骤的最大重复次数 42 | */ 43 | maxTimes: [-1], 44 | /** 45 | * @description 定义可能遇到的页面默认处理方式; next:为强制跳转,pageid:为页面ID,jobs:为具体的执行操作 46 | */ 47 | someone: [ 48 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.UPDATED, jobs: this.pages.UPDATED.operates.next }, 49 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next}, 50 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.next}, 51 | // { next: Env.STEP.RUNNING, pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next}, 52 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME_MESSAGE, jobs: this.pages.HOME_MESSAGE.operates.next, exit:true}, 53 | ], 54 | } 55 | }, 56 | /** 57 | * @description Running步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 58 | */ 59 | get running() { 60 | return { 61 | step: Env.STEP.RUNNING, 62 | must: [ 63 | { pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 64 | { pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.next }, 65 | { pageid: Env.PageEnum.HOME_MESSAGE, jobs: this.pages.HOME_MESSAGE.operates.next, exit:true }, 66 | ], 67 | someone: [], 68 | } 69 | }, 70 | 71 | /** 72 | * ... 还可以定义更多的步骤 73 | */ 74 | /** 75 | * 定义页面的识别标志及具体的各操作 76 | */ 77 | pages: { 78 | UPDATED: { 79 | desc: "关闭弹窗", 80 | name: "关闭弹窗", 81 | pageid: Env.PageEnum.UPDATED, 82 | mark: { id: "iv_image" }, 83 | next: [], 84 | operates: { 85 | next: [ 86 | { name: "click", mark: { id: "iv_close" } }, 87 | ] 88 | }, 89 | }, 90 | 91 | 92 | MINE: { 93 | desc: "个人中心", 94 | name: "个人中心", 95 | pageid: Env.PageEnum.MINE, 96 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 97 | mark: { id: "avatar" }, 98 | next: [], 99 | operates: { 100 | next: [ 101 | { name: "click", mark: { id: "rl_sign" } }, 102 | { name: "sleep"}, 103 | ], 104 | finish: [{ name: "back" }], 105 | }, 106 | }, 107 | 108 | 109 | HOME: { 110 | desc: "首页", 111 | name: "首页", 112 | pageid: Env.PageEnum.HOME, 113 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 114 | mark: { id: "ll_addr" }, 115 | next: [], 116 | operates: { 117 | next: [ 118 | { name: "click", mark: { id: "tab_rb_me" } }, 119 | { name: "sleep"}, 120 | ], 121 | finish: [{ name: "back" }], 122 | }, 123 | }, 124 | 125 | SIGEN: { 126 | desc: "我在这里", 127 | name: "我在这里", 128 | pageid: Env.PageEnum.SIGEN, 129 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 130 | mark: { id:"tv_title_text", text: "我在这里" }, 131 | next: [], 132 | operates: { 133 | next: [ 134 | { name: "click", mark: { text: "不选择地点" } }, 135 | { name: "sleep"}, 136 | { name: "click", mark: { id: "sign_name" } }, 137 | { name: "sleep"}, 138 | ], 139 | }, 140 | }, 141 | 142 | HOME_MESSAGE: { 143 | desc: "签到成功", 144 | name: "签到成功", 145 | pageid: Env.PageEnum.HOME_MESSAGE, 146 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 147 | mark: { id:"center_tv"}, 148 | next: [], 149 | operates: { 150 | next: [ 151 | { name: "click", mark: { id: "left_navigation_ll" } }, 152 | { name: "sleep"}, 153 | ], 154 | finish: [{ name: "back" }], 155 | }, 156 | }, 157 | }, 158 | }; 159 | 160 | /** 161 | * 初始化后执行 162 | */ 163 | function afterInit() { 164 | sleep(1000); 165 | } 166 | 167 | var __curJob = JSON.parse(JSON.stringify(Job)); 168 | //运行 169 | Work.main(__curJob, afterInit); -------------------------------------------------------------------------------- /src/work/微博-登录.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | var Work = require('../common/work'); 20 | var Env = require('../env'); 21 | 22 | /** 23 | * 注意:如果一个页面有多个特征码匹配,以最后一个为准 24 | */ 25 | var Job = { 26 | version: '9.6.3', 27 | CLIENT: 'weibo', 28 | package: 'com.sina.weibo', 29 | activity: "com.sina.weibo.MainTabActivity", 30 | 31 | /** 32 | * @description 默认配置,自动加载 33 | */ 34 | get default() { 35 | return { 36 | /** 37 | * @description steps定义当前任务需要完成工作的步骤 38 | */ 39 | steps: [this.login, this.nickname, this.write, this.logout], 40 | /** 41 | * @description 指定某一步骤的最大重复次数 42 | */ 43 | maxTimes: [-1, -1, 3, -1], 44 | /** 45 | * @description 定义可能遇到的页面默认处理方式; next:为强制跳转,pageid:为页面ID,jobs:为具体的执行操作 46 | */ 47 | someone: [ 48 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.UNKNOW, jobs: this.pages.UNKNOW.operates.next }, 49 | { next: Env.STEP.LOGIN, pageid: Env.PageEnum.LOGIN, jobs: this.pages.LOGIN.operates.login }, 50 | { next: Env.STEP.LOGIN, pageid: Env.PageEnum.INPUT_CODE, jobs: this.pages.INPUT_CODE.operates.code }, 51 | { next: Env.STEP.WRITE, pageid: Env.PageEnum.DETAIL, jobs: this.pages.DETAIL.operates.follow }, 52 | { next: Env.STEP.WRITE, pageid: Env.PageEnum.HOME_HOT, jobs: this.pages.HOME_HOT.operates.write }, 53 | { next: Env.STEP.WRITE, pageid: Env.PageEnum.HOME_FOLLOW, jobs: this.pages.HOME_FOLLOW.operates.write }, 54 | { next: Env.STEP.WRITE, pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.nickname }, 55 | { next: Env.STEP.WRITE, pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.home }, 56 | { next: Env.STEP.WRITE, pageid: Env.PageEnum.WRITE_WEIBO, jobs: this.pages.WRITE_WEIBO.operates.write }, 57 | { next: Env.STEP.WRITE, pageid: Env.PageEnum.EDIT_SHARE, jobs: this.pages.EDIT_SHARE.operates.comment }, 58 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.setting }, 59 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.SETTING, jobs: this.pages.SETTING.operates.accounts }, 60 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNTS, jobs: this.pages.ACCOUNTS.operates.add }, 61 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_2, jobs: this.pages.ACCOUNT_ERROR_2.operates.next }, 62 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_3, jobs: this.pages.ACCOUNT_ERROR_3.operates.next }, 63 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_4, jobs: this.pages.ACCOUNT_ERROR_4.operates.next }, 64 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_5, jobs: this.pages.ACCOUNT_ERROR_5.operates.next }, 65 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_CONFIRM, jobs: this.pages.ACCOUNT_CONFIRM.operates.finish }, 66 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR, jobs: this.pages.ACCOUNT_ERROR.operates.cancel }, 67 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next }, 68 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.USER_CENTER, jobs: this.pages.USER_CENTER.operates.next }, 69 | ], 70 | } 71 | }, 72 | /** 73 | * @description Login步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 74 | */ 75 | get login() { 76 | return { 77 | step: Env.STEP.LOGIN, 78 | must: [ 79 | { pageid: Env.PageEnum.LOGIN, jobs: this.pages.LOGIN.operates.login }, 80 | { pageid: Env.PageEnum.INPUT_CODE, jobs: this.pages.INPUT_CODE.operates.code }, 81 | ], 82 | someone: [ 83 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.HOME_HOT, jobs: this.pages.HOME_HOT.operates.mine }, 84 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.HOME_FOLLOW, jobs: this.pages.HOME_FOLLOW.operates.mine }, 85 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.ACCOUNT_CONFIRM, jobs: this.pages.ACCOUNT_CONFIRM.operates.finish }, 86 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR, jobs: this.pages.ACCOUNT_ERROR.operates.cancel }, 87 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.WELCOME_CAMEBACK, jobs: this.pages.WELCOME_CAMEBACK.operates.next }, 88 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.SELECT_CLASS, jobs: this.pages.SELECT_CLASS.operates.next }, 89 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.RECOMMEND, jobs: this.pages.RECOMMEND.operates.next }, 90 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next }, 91 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.USER_CENTER, jobs: this.pages.USER_CENTER.operates.next }, 92 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.WELCOME_WEIBO, jobs: this.pages.WELCOME_WEIBO.operates.next }, 93 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_2, jobs: this.pages.ACCOUNT_ERROR_2.operates.next }, 94 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_3, jobs: this.pages.ACCOUNT_ERROR_3.operates.next }, 95 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_4, jobs: this.pages.ACCOUNT_ERROR_4.operates.next }, 96 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_5, jobs: this.pages.ACCOUNT_ERROR_5.operates.next }, 97 | { next: Env.STEP.LOGOUT, pageid: Env.PageEnum.ACCOUNT_ERROR_6, jobs: this.pages.ACCOUNT_ERROR_6.operates.next }, 98 | ], 99 | } 100 | 101 | }, 102 | /** 103 | * 写微博 104 | */ 105 | get write() { 106 | return { 107 | step: Env.STEP.WRITE, 108 | must: [ 109 | { isLogined: true, pageid: Env.PageEnum.HOME_FOLLOW, jobs: this.pages.HOME_FOLLOW.operates.write }, 110 | { isLogined: true, pageid: Env.PageEnum.WRITE_WEIBO, jobs: this.pages.WRITE_WEIBO.operates.write }, 111 | { isLogined: true, pageid: Env.PageEnum.EDIT_SHARE, jobs: this.pages.EDIT_SHARE.operates.comment }, 112 | ], 113 | someone: [], 114 | } 115 | }, 116 | /** 117 | * 退出登录 118 | */ 119 | get logout() { 120 | return { 121 | step: Env.STEP.LOGOUT, 122 | must: [ 123 | { pageid: Env.PageEnum.HOME_FOLLOW, jobs: this.pages.HOME_FOLLOW.operates.mine }, 124 | { pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.setting }, 125 | { pageid: Env.PageEnum.SETTING, jobs: this.pages.SETTING.operates.accounts }, 126 | { pageid: Env.PageEnum.ACCOUNTS, jobs: this.pages.ACCOUNTS.operates.add }, 127 | ], 128 | someone: [], 129 | } 130 | }, 131 | /** 132 | * 获取登录昵称 133 | */ 134 | get nickname() { 135 | return { 136 | step: Env.STEP.NICKNAME, 137 | must: [ 138 | { pageid: Env.PageEnum.HOME_FOLLOW, jobs: this.pages.HOME_FOLLOW.operates.mine }, 139 | { pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.nickname }, 140 | ], 141 | someone: [], 142 | } 143 | }, 144 | /** 145 | * ... 还可以定义更多的步骤 146 | */ 147 | /** 148 | * 定义页面的识别标志及具体的各操作 149 | */ 150 | pages: { 151 | UNKNOW: { 152 | desc: "未知页面", 153 | name: "未知页面", 154 | pageid: Env.PageEnum.UNKNOW, 155 | mark: { name: "unknow" }, 156 | next: [], 157 | operates: { 158 | next: [ 159 | { name: "click", mark: { className: "android.widget.TextView", text:"以后再说" } }, 160 | ] 161 | }, 162 | }, 163 | LOGIN: { 164 | desc: "登陆页输入手机号", 165 | name: "登录", 166 | /** 167 | * mark: 页面的标志控件,当页面找到匹配mark属性的控件时,我们认为它就位于这个页面 168 | * mark可能的属性:id,text,desc,className,textStartsWith,textEndsWith, 169 | * descStartsWith,descEndsWith 具体可以参考Autojs控件uiselector的函数 170 | */ 171 | mark: { id: "", text: "登录注册更精彩", desc: "", className: "android.widget.TextView" }, 172 | pageid: Env.PageEnum.LOGIN, 173 | next: [], 174 | /** 175 | * 定义这个页面可以的操作:name是操作名称目前支持 176 | * get 获取本地或者远程文本并写到全局变量,调用operate.js中的do函数处理, 177 | * set_text 设置控件的text属性,调用operate.js中的do函数处理, 178 | * click 点击这个按钮,调用operate.js中的do函数处理, 179 | * input OneByOne向控件输入文字,调用operate.js中的do函数处理, 180 | * swipe 滑动页面,调用operate.js中的do函数处理, 181 | * sleep 暂停,调用operate.js中的do函数处理, 182 | * refresh 下拉刷新页面,调用operate.js中的do函数处理, 183 | * back 点击Android的返回键,调用operate.js中的do函数处理, 184 | * text 获取控件的text属性值,调用operate.js中的do函数处理, 185 | * desc 获取控件的desc描述值,调用operate.js中的do函数处理, 186 | * tap 点击控件位置的屏幕,调用operate.js中的do函数处理, 187 | * enter 触发回车,调用operate.js中的do函数处理, 188 | */ 189 | operates: { 190 | login: [ 191 | { name: "get", mark: { name: "login_phone", uri: "api" }, param: { set: { name: "phone" } } }, 192 | { name: "set_text", mark: { id: "et_phone" }, param: { get: { name: "phone" } } }, 193 | { name: "click", mark: { id: "bnLogin", text: "获取验证码" } }, 194 | ], 195 | }, 196 | }, 197 | INPUT_CODE: { 198 | desc: "验证码输入页", 199 | name: "请输入验证码", pageid: Env.PageEnum.INPUT_CODE, mark: { id: "tv_verification_title", text: "请输入验证码", desc: "", className: "" }, 200 | next: [], 201 | operates: { 202 | code: [ 203 | { name: "input", mark: { id: "verification_code" }, param: { get: { name: "login_code", uri: "api" } } }, 204 | ], 205 | finish: [{ name: "back" }], 206 | }, 207 | }, 208 | ACCOUNT_CONFIRM: { 209 | desc: "帐号确认", 210 | name: "帐号确认", pageid: Env.PageEnum.ACCOUNT_CONFIRM, mark: { id: "", text: "帐号确认", desc: "", className: "android.widget.TextView" }, 211 | next: [], 212 | operates: { 213 | finish: [{ name: "back" }], 214 | }, 215 | }, 216 | DETAIL: { 217 | desc: "微博正文", 218 | name: "微博正文", pageid: Env.PageEnum.DETAIL, 219 | mark: { id: "detail_activity_header_title_text", text: "微博正文", desc: "", className: "" }, 220 | next: [], 221 | operates: { 222 | follow: [ 223 | //点击微博详情的关注按钮 224 | { name: "click", mark: { id: "tv_op_button", text: "关注" } }, 225 | ], 226 | liked: [ 227 | //点击微博详情的赞按钮,两种可能 228 | { name: "click", mark: { id: "liked", desc: "赞" } }, 229 | { name: "click", mark: { id: "tvButton", text: "赞" } }, 230 | ], 231 | forward: [ 232 | //点击微博详情的转发按钮 233 | { name: "click", mark: { id: "forward", desc: "转发" } }, 234 | { name: "click", mark: { id: "tvButton", text: "转发" } }, 235 | ], 236 | finish: [{ name: "back" }], 237 | }, 238 | }, 239 | MINE: { 240 | desc: "我", 241 | name: "我", pageid: Env.PageEnum.MINE, mark: { id: "titleText", text: "我", desc: "", className: "" }, 242 | next: [], 243 | operates: { 244 | nickname: [ 245 | //取用户昵称,保存到环境变量name 246 | { name: "text", mark: { id: "tvNick" }, param: { set: "name" } }, 247 | // 248 | ], 249 | home: [ 250 | // 首页 251 | { name: "click", mark: { desc: "首页" } }, 252 | ], 253 | setting: [ 254 | // 点设置 255 | { name: "click", mark: { id: "rltitleSave" } }, 256 | ], 257 | finish: [{ name: "back" }], 258 | }, 259 | }, 260 | SETTING: { 261 | desc: "设置", 262 | name: "设置", pageid: Env.PageEnum.SETTING, mark: { id: "titleText", text: "设置", desc: "", className: "" }, 263 | next: [], 264 | operates: { 265 | accounts: [ 266 | { name: "click", mark: { id: "accountLayout" } } 267 | ], 268 | finish: [{ name: "back" }], 269 | }, 270 | }, 271 | ACCOUNTS: { 272 | desc: "帐号管理", 273 | name: "帐号管理", pageid: Env.PageEnum.ACCOUNTS, mark: { id: "titleText", text: "帐号管理", desc: "", className: "" }, 274 | next: [], 275 | operates: { 276 | add: [ 277 | { name: "click", mark: { id: "tvAccountName", text: "添加帐号" } } 278 | ], 279 | finish: [{ name: "back" }], 280 | }, 281 | }, 282 | HOME_FOLLOW: { 283 | desc: "首页关注", 284 | name: "首页关注", pageid: Env.PageEnum.HOME_FOLLOW, mark: { id: "iv_groupStateIndicator", className: "android.widget.ImageView" }, 285 | next: [], 286 | operates: { 287 | mine: [ 288 | { name: "click", mark: { desc: "我" } }, 289 | ], 290 | write: [ 291 | { name: "click", mark: { id: "rltitleSave" } }, 292 | ], 293 | search: [ 294 | { name: "tap", mark: { id: "tv_search_keyword" } }, 295 | ], 296 | find: [ 297 | //写完后找到刚才的文章 298 | { name: "click", mark: { id: "tv_userinfo" }, param: { indexOf: { tag: "text", try: 10, get: { name: "given_weibo_title", uri: "api" } } } } 299 | ], 300 | finish: [{ name: "swipe" }], 301 | }, 302 | }, 303 | HOME_HOT: { 304 | desc: "首页热门", 305 | name: "首页热门", pageid: Env.PageEnum.HOME_HOT, mark: { id: "tv_groupName", text: "热门", desc: "", className: "" }, 306 | next: [], 307 | operates: { 308 | mine: [ 309 | { name: "click", mark: { desc: "我" } }, 310 | ], 311 | write: [ 312 | { name: "click", mark: { id: "rltitleSave" } }, 313 | ], 314 | search: [ 315 | { name: "tap", mark: { id: "tv_search_keyword" } }, 316 | ], 317 | select_item: [ 318 | //选择热门栏目 319 | { name: "click", mark: { id: "button_more_columns" } }, 320 | { name: "click", mark: { id: "text_item" }, param: { indexOf: { tag: "text", get: { name: "hot_text_item", uri: "api" } } } }, 321 | ], 322 | detail: [//点击列表,跳到微博详情页面 323 | { name: "click", mark: { id: "contentTextView" }, param: { indexOf: -1 } } 324 | ], 325 | finish: [{ name: "swipe" }], 326 | }, 327 | }, 328 | SEARCH: { 329 | desc: "搜索页", 330 | name: "搜索页", pageid: Env.PageEnum.SEARCH, mark: { id: "btn_search_or_back", text: "", desc: "", className: "" }, 331 | next: [], 332 | operates: { 333 | keyword: [ 334 | { name: "get", mark: { name: "keyword", uri: "api" }, param: { set: { name: "keyword" } } }, 335 | { name: "set_text", mark: { id: "tv_search_keyword" }, param: { get: { name: "keyword" } } }, 336 | { name: "enter" }, 337 | ], 338 | finish: [{ name: "swipe" }], 339 | }, 340 | }, 341 | EDIT_SHARE: { 342 | desc: "转发微博", 343 | name: "转发微博", pageid: Env.PageEnum.EDIT_SHARE, mark: { id: "titleText", textEndsWith: "发微博" }, 344 | next: [], 345 | operates: { 346 | comment: [ 347 | { name: "click", mark: { id: "checkbox" } }, 348 | { name: "set_text", mark: { id: "edit_view" }, param: { get: { name: "comment", uri: "api" } } }, 349 | { name: "click", mark: { id: "rltitleSave" } }, 350 | ] 351 | }, 352 | }, 353 | HOME_SEARCH: { 354 | desc: "首页搜索", 355 | name: "首页搜索", pageid: Env.PageEnum.HOME_SEARCH, mark: { id: "textView_title", text: "微博热搜", desc: "", className: "android.widget.TextView" }, 356 | next: [], 357 | operates: { 358 | search: [ 359 | { name: "tap", mark: { id: "tv_search_keyword" } }, 360 | ], 361 | finish: [{ name: "swipe" }], 362 | }, 363 | }, 364 | ADD_FOLLOW_WITH_SHARE: { 365 | desc: "加关注才能转发", 366 | name: "加关注才能转发", pageid: Env.PageEnum.ADD_FOLLOW_WITH_SHARE, mark: { className: "android.widget.TextView", text: "由于对方的设置,你需要先关注他,才能评论。" }, 367 | next: [], 368 | operates: { 369 | follow: [{ name: "click", mark: { className: "android.widget.TextView", text: "加关注" } }], 370 | }, 371 | }, 372 | ACCOUNT_ERROR: { 373 | desc: "帐号异常", 374 | name: "帐号异常", pageid: Env.PageEnum.ACCOUNT_ERROR, mark: { className: "android.widget.TextView", text: "帐号异常" }, 375 | next: [], 376 | operates: { 377 | cancel: [ 378 | { name: "click", mark: { className: "android.widget.TextView", text: "取消" } }, 379 | ] 380 | }, 381 | }, 382 | WELCOME_CAMEBACK: { 383 | desc: "好久不见,欢迎回来", 384 | name: "好久不见,欢迎回来", pageid: Env.PageEnum.WELCOME_CAMEBACK, mark: { id: "tv_top_title", text: "好久不见,欢迎回来" }, 385 | next: [], 386 | operates: { 387 | next: [ 388 | { name: "click", mark: { id: "next" } }, 389 | { name: "sleep" }, 390 | { name: "click", mark: { id: "next" } }, 391 | ] 392 | }, 393 | }, 394 | WRITE_WEIBO: { 395 | desc: "首页上写微博", 396 | name: "首页上写微博", pageid: Env.PageEnum.WRITE_WEIBO, mark: { className: "android.widget.TextView", text: "写微博" }, 397 | next: [], 398 | operates: { 399 | write: [ 400 | { name: "click", mark: { className: "android.widget.TextView", text: "写微博" } }, 401 | ], 402 | }, 403 | }, 404 | SELECT_CLASS: { 405 | desc: "选择你感兴趣的分类", 406 | name: "选择你感兴趣的分类", pageid: Env.PageEnum.SELECT_CLASS, mark: { id: "tv_top_title", text: "选择你感兴趣的分类", desc: "", className: "" }, 407 | next: [], 408 | operates: { 409 | next: [ 410 | { name: "click", mark: { id: "next" } }, 411 | ] 412 | }, 413 | }, 414 | RECOMMEND: { 415 | desc: "为你推荐以下博主", 416 | name: "为你推荐以下博主", pageid: Env.PageEnum.RECOMMEND, mark: { id: "", text: "为你推荐以下博主", desc: "", className: "" }, 417 | next: [], 418 | operates: { 419 | next: [ 420 | { name: "click", mark: { id: "next" } }, 421 | ] 422 | }, 423 | }, 424 | SIGEN: { 425 | desc: "连续签到领取红包", 426 | name: "马上参与", pageid: Env.PageEnum.SIGEN, mark: { id: "iv_content" }, 427 | next: [ 428 | ], 429 | operates: { 430 | next: [ 431 | { name: "click", mark: { id: "iv_content" } } 432 | ], 433 | finish: [{ name: "back" }], 434 | }, 435 | }, 436 | USER_CENTER: { 437 | desc: "用户任务中心", 438 | name: "用户任务中心", pageid: Env.PageEnum.USER_CENTER, mark: { id: "titleText", text: "用户任务中心", desc: "", className: "" }, 439 | next: [ 440 | ], 441 | operates: { 442 | next: [ 443 | { name: "click", mark: { className: "android.view.View", desc: "连续签到有大红包奖励!做任务获补签机会,越努力越幸运!" }, param: { parent: 1, indexOf: { tag: "clickable", default: 'true' } } } 444 | ], 445 | finish: [{ name: "back" }], 446 | }, 447 | }, 448 | USER_WEIBO: { 449 | desc: "用户微博", 450 | name: "微博", pageid: Env.PageEnum.USER_WEIBO, mark: { id: "titleText", text: "微博", desc: "", className: "" }, 451 | next: [], 452 | operates: { 453 | finish: [{ name: "back" }], 454 | }, 455 | }, 456 | HOME_MESSAGE: { 457 | desc: "消息", 458 | name: "消息", pageid: Env.PageEnum.HOME_MESSAGE, mark: { id: "tab_text_view", text: "消息", desc: "", className: "android.widget.TextView" }, 459 | next: [], 460 | operates: { 461 | finish: [{ name: "back" }], 462 | }, 463 | }, 464 | WELCOME_WEIBO: { 465 | desc: "欢迎继续使用微博", 466 | name: "欢迎继续使用微博", pageid: Env.PageEnum.WELCOME_WEIBO, mark: { className: "android.widget.TextView", text: "欢迎继续使用微博" }, 467 | next: [], 468 | operates: { 469 | next: [{ name: "click", mark: { id: "bt_next", text: "查看推荐" } }], 470 | find: [ 471 | { name: "click", mark: { id: "tv_userinfo" }, param: { indexOf: { tag: "text", try: 10, get: { name: "given_weibo_title", uri: "api" } } } } 472 | ], 473 | finish: [{ name: "swipe" }], 474 | }, 475 | }, 476 | ACCOUNT_ERROR_2: { 477 | desc: "帐号异常", 478 | name: "帐号异常", pageid: Env.PageEnum.ACCOUNT_ERROR_2, mark: { className: "android.widget.TextView", text: "解除异常" }, 479 | next: [], 480 | operates: { 481 | next: [ 482 | { name: "click", mark: { className: "android.widget.TextView", text: "取消" } }, 483 | ], 484 | finish: [{ name: "back" }], 485 | }, 486 | }, 487 | ACCOUNT_ERROR_3: { 488 | desc: "帐号异常", 489 | name: "帐号异常", pageid: Env.PageEnum.ACCOUNT_ERROR_3, mark: { className: "android.widget.TextView", text: "知道了" }, 490 | next: [], 491 | operates: { 492 | next: [ 493 | { name: "click", mark: { className: "android.widget.TextView", text: "知道了" } }, 494 | ], 495 | finish: [{ name: "back" }], 496 | }, 497 | }, 498 | ACCOUNT_ERROR_4: { 499 | desc: "帐号异常", 500 | name: "帐号异常", pageid: Env.PageEnum.ACCOUNT_ERROR_4, mark: { id: "tvContent", className: "android.widget.TextView", text: "有内容发送失败,已存入草稿箱" }, 501 | next: [], 502 | operates: { 503 | next: [ 504 | { name: "click", mark: { desc: "我" } }, 505 | ], 506 | finish: [{ name: "back" }], 507 | }, 508 | }, 509 | ACCOUNT_ERROR_5: { 510 | desc: "帐号异常,请先验证身份", 511 | name: "帐号异常,请先验证身份", pageid: Env.PageEnum.ACCOUNT_ERROR_5, mark: { id: "titleText", className: "android.widget.TextView", text: "请先验证身份" }, 512 | next: [], 513 | operates: { 514 | next: [ 515 | { name: "click", mark: { id: "titleLeft" } }, 516 | { name: "click", mark: { id: "tv_title_bar_back" } }, 517 | ], 518 | finish: [{ name: "back" }], 519 | }, 520 | }, 521 | ACCOUNT_ERROR_6: { 522 | desc: "清除数据", 523 | name: "清除数据", pageid: Env.PageEnum.ACCOUNT_ERROR_6, mark: { id: "btn_restart", text: "清除数据" }, 524 | next: [], 525 | operates: { 526 | next: [ 527 | { name: "click", mark: { id: "btn_restart" } }, 528 | ], 529 | skip: [ 530 | { name: "click", mark: { id: "btn_skip" } }, 531 | ], 532 | finish: [{ name: "back" }], 533 | }, 534 | }, 535 | }, 536 | }; 537 | 538 | /** 539 | * 初始化后执行 540 | */ 541 | function afterInit() { 542 | sleep(1000); 543 | } 544 | 545 | var __curJob = JSON.parse(JSON.stringify(Job)); 546 | //运行 547 | Work.main(Job, afterInit); 548 | 549 | 550 | 551 | -------------------------------------------------------------------------------- /src/work/拼多多-签到.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | 20 | var Work = require("../common/work"); 21 | var Env = require('../env'); 22 | 23 | /** 24 | * 注意:如果一个页面有多个特征码匹配,以最后一个为准 25 | */ 26 | var Job = { 27 | version: '4.68.0', 28 | CLIENT: '拼多多-签到', 29 | package: 'com.xunmeng.pinduoduo', 30 | activity: "com.xunmeng.pinduoduo.ui.activity.HomeActivity", 31 | /** 32 | * @description 默认配置,自动加载 33 | */ 34 | get default() { 35 | return { 36 | /** 37 | * @description steps定义当前任务需要完成工作的步骤 38 | */ 39 | steps: [this.running], 40 | /** 41 | * @description 指定某一步骤的最大重复次数 42 | */ 43 | maxTimes: [-1], 44 | /** 45 | * @description 定义可能遇到的页面默认处理方式; next:为强制跳转,pageid:为页面ID,jobs:为具体的执行操作 46 | */ 47 | someone: [ 48 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.UNKNOW, jobs: this.pages.UNKNOW.operates.next }, 49 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 50 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.next }, 51 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next }, 52 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME_MESSAGE, jobs: this.pages.HOME_MESSAGE.operates.next, exit: true }, 53 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.RED_PAGE, jobs: this.pages.RED_PAGE.operates.next }, 54 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.RED_BUY_PAGE, jobs: this.pages.RED_BUY_PAGE.operates.next }, 55 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.RED_FRIEND_PAGE, jobs: this.pages.RED_FRIEND_PAGE.operates.next, exit: true }, 56 | ], 57 | } 58 | }, 59 | /** 60 | * @description Running步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 61 | */ 62 | get running() { 63 | return { 64 | step: Env.STEP.RUNNING, 65 | must: [ 66 | { pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 67 | { pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next }, 68 | { pageid: Env.PageEnum.HOME_MESSAGE, jobs: this.pages.HOME_MESSAGE.operates.next, exit: true }, 69 | { pageid: Env.PageEnum.RED_PAGE, jobs: this.pages.RED_PAGE.operates.next }, 70 | { pageid: Env.PageEnum.RED_BUY_PAGE, jobs: this.pages.RED_BUY_PAGE.operates.next }, 71 | { pageid: Env.PageEnum.RED_FRIEND_PAGE, jobs: this.pages.RED_FRIEND_PAGE.operates.next, exit: true }, 72 | ], 73 | someone: [], 74 | } 75 | }, 76 | 77 | /** 78 | * ... 还可以定义更多的步骤 79 | */ 80 | /** 81 | * 定义页面的识别标志及具体的各操作 82 | */ 83 | pages: { 84 | UNKNOW: { 85 | desc: "未知页面", 86 | name: "未知页面", 87 | pageid: Env.PageEnum.UNKNOW, 88 | mark: { id: "tv_title" }, 89 | next: [], 90 | operates: { 91 | next: [ 92 | { name: "click", mark: { id: "h_" } }, 93 | { name: "click", mark: { id: "i_" } }, 94 | { name: "click", mark: { id: "ii_" } }, 95 | { name: "click", mark: { id: "is" } }, 96 | ] 97 | }, 98 | }, 99 | 100 | 101 | MINE: { 102 | desc: "个人中心", 103 | name: "个人中心", 104 | pageid: Env.PageEnum.MINE, 105 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 106 | mark: { id: "azs", className: "android.widget.ImageView", }, 107 | next: [], 108 | operates: { 109 | next: [ 110 | // { name: "click", mark: { id: "user_head_portrait_icon" } }, 111 | // { name: "sleep"}, 112 | { name: "click", mark: { className: "android.widget.TextView", text: "首页" } }, 113 | { name: "sleep" }, 114 | ], 115 | finish: [{ name: "back" }], 116 | }, 117 | }, 118 | 119 | 120 | HOME: { 121 | desc: "首页", 122 | name: "首页", 123 | pageid: Env.PageEnum.HOME, 124 | mark: { text: "现金签到" }, 125 | next: [], 126 | operates: { 127 | next: [ 128 | { name: "click", mark: { text: "现金签到" } }, 129 | { name: "sleep" }, 130 | ], 131 | finish: [{ name: "back" }], 132 | }, 133 | }, 134 | 135 | SIGEN: { 136 | desc: "签到领现金", 137 | name: "签到领现金", 138 | pageid: Env.PageEnum.SIGEN, 139 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 140 | mark: { id: "tv_title", text: "签到领现金" }, 141 | next: [], 142 | operates: { 143 | next: [ 144 | { name: "click", mark: { className: "android.view.View", text: "签到领现金" } }, 145 | { name: "sleep" }, 146 | { name: "back" }, 147 | ], 148 | }, 149 | }, 150 | 151 | RED_PAGE: { 152 | desc: "定时领红包", 153 | name: "定时领红包", 154 | pageid: Env.PageEnum.RED_PAGE, 155 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 156 | mark: { id: "tv_title", text: "定时领红包" }, 157 | next: [], 158 | operates: { 159 | next: [ 160 | { name: "click", mark: { className: "android.widget.Image", text: "daily_bonus_mid_limited_reward_btn" } }, 161 | { name: "sleep" }, 162 | { name: "click", mark: { className: "android.view.View", text: "选我" } }, 163 | { name: "sleep" }, 164 | ], 165 | finish: [ 166 | { name: "back" }, 167 | { name: "back" }, 168 | ], 169 | }, 170 | }, 171 | 172 | RED_FRIEND_PAGE: { 173 | desc: "好友红包", 174 | name: "好友红包", 175 | pageid: Env.PageEnum.RED_FRIEND_PAGE, 176 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 177 | mark: { id: "tv_title", text: "好友红包" }, 178 | next: [], 179 | operates: { 180 | next: [ 181 | { name: "click", mark: { className: "android.view.View", text: "官方账号" }, param: { parent: 1, indexOf: { tag: "clickable", default: "true" } } }, 182 | { name: "sleep" }, 183 | { name: "click", mark: { className: "android.view.View", text: "拼多多签到" }, param: { parent: 1, indexOf: { tag: "clickable", default: "true" } } }, 184 | { name: "sleep" }, 185 | ], 186 | finish: [ 187 | { name: "back" }, 188 | { name: "back" }, 189 | ], 190 | }, 191 | }, 192 | 193 | 194 | RED_BUY_PAGE: { 195 | desc: "拼单返现", 196 | name: "拼单返现", 197 | pageid: Env.PageEnum.RED_BUY_PAGE, 198 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 199 | mark: { id: "tv_title", text: "拼单返现" }, 200 | next: [], 201 | operates: { 202 | next: [ 203 | { name: "swipe", param: { count: 20 } }, 204 | { name: "back" }, 205 | { name: "click", mark: { className: "android.view.View", text: "不赚钱,离开" } }, 206 | { name: "sleep" }, 207 | ], 208 | finish: [ 209 | { name: "back" }, 210 | { name: "back" }, 211 | ], 212 | }, 213 | }, 214 | 215 | HOME_MESSAGE: { 216 | desc: "今日已签到,请明天再来", 217 | name: "今日已签到,请明天再来", 218 | pageid: Env.PageEnum.HOME_MESSAGE, 219 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 220 | mark: { className: "android.view.View", text: "今日已签到,请明天再来" }, 221 | next: [], 222 | operates: { 223 | next: [ 224 | { name: "click", mark: { className: "android.view.View", text: "定时领红包" } }, 225 | { name: "sleep" }, 226 | { name: "click", mark: { className: "android.view.View", text: "抢红包" } }, 227 | { name: "sleep" }, 228 | { name: "back" }, 229 | { name: "click", mark: { className: "android.view.View", text: "逛街领红包" } }, 230 | { name: "sleep" }, 231 | { name: "back" }, 232 | 233 | ], 234 | finish: [{ name: "back" }], 235 | }, 236 | }, 237 | }, 238 | }; 239 | 240 | /** 241 | * 初始化后执行 242 | */ 243 | function afterInit() { 244 | sleep(1000); 245 | } 246 | 247 | var __curJob = JSON.parse(JSON.stringify(Job)); 248 | //运行 249 | Work.main(__curJob, afterInit); -------------------------------------------------------------------------------- /src/work/新浪微博-早起打卡.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | 20 | var Work = require("../common/work"); 21 | var Env = require('../env'); 22 | 23 | // const wb_wz = "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"; 24 | const wbqianbao_logo = "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"; 25 | // const wbqianbao_wz = "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"; 26 | const weiboqianbao_hong = "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"; 27 | const zhaoqidaka = "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"; 28 | 29 | 30 | /** 31 | * 注意:如果一个页面有多个特征码匹配,以最后一个为准 32 | */ 33 | var Job = { 34 | version: '9.6.3', 35 | CLIENT: '新浪微博-早起打卡', 36 | package: 'com.sina.weibo', 37 | activity: "com.sina.weibo.MainTabActivity", 38 | /** 39 | * @description 默认配置,自动加载 40 | */ 41 | get default() { 42 | return { 43 | /** 44 | * @description steps定义当前任务需要完成工作的步骤 45 | */ 46 | steps: [this.running], 47 | /** 48 | * @description 指定某一步骤的最大重复次数 49 | */ 50 | maxTimes: [-1], 51 | /** 52 | * @description 定义可能遇到的页面默认处理方式; next:为强制跳转,pageid:为页面ID,jobs:为具体的执行操作 53 | */ 54 | someone: [ 55 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.UNKNOW, jobs: this.pages.UNKNOW.operates.next }, 56 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME_HOT, jobs: this.pages.HOME_HOT.operates.next }, 57 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME_FOLLOW, jobs: this.pages.HOME_FOLLOW.operates.next }, 58 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.next }, 59 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next }, 60 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME_MESSAGE, jobs: this.pages.HOME_MESSAGE.operates.next, exit: true }, 61 | ], 62 | } 63 | }, 64 | /** 65 | * @description Running步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 66 | */ 67 | get running() { 68 | return { 69 | step: Env.STEP.RUNNING, 70 | must: [ 71 | { pageid: Env.PageEnum.HOME_HOT, jobs: this.pages.HOME_HOT.operates.next }, 72 | { pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.next }, 73 | { pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next }, 74 | { pageid: Env.PageEnum.HOME_MESSAGE, jobs: this.pages.HOME_MESSAGE.operates.next, exit: true }, 75 | ], 76 | someone: [], 77 | } 78 | }, 79 | 80 | /** 81 | * ... 还可以定义更多的步骤 82 | */ 83 | /** 84 | * 定义页面的识别标志及具体的各操作 85 | */ 86 | pages: { 87 | UNKNOW: { 88 | desc: "关闭弹窗", 89 | name: "关闭弹窗", 90 | pageid: Env.PageEnum.UNKNOW, 91 | mark: { name: "unknow" }, 92 | next: [], 93 | operates: { 94 | next: [ 95 | { name: "click", mark: { id: "cancel_update" } }, 96 | ] 97 | }, 98 | }, 99 | 100 | 101 | MINE: { 102 | desc: "个人中心", 103 | name: "个人中心", 104 | pageid: Env.PageEnum.MINE, 105 | mark: { id: "titleText", text: "我" }, 106 | next: [], 107 | operates: { 108 | next: [ 109 | { name: "image", mark: { base64: wbqianbao_logo }, param:{action:"tap"} }, 110 | ], 111 | finish: [{ name: "back" }], 112 | }, 113 | }, 114 | 115 | HOME_HOT: { 116 | desc: "首页热门", 117 | name: "首页热门", 118 | pageid: Env.PageEnum.HOME_HOT, 119 | mark: { id: "tv_groupName", text: "热门", desc: "", className: "" }, 120 | next: [], 121 | operates: { 122 | next: [ 123 | // { name: "click", mark: { id: "redpacket_container" } }, 124 | { name: "click", mark: { desc: "我" } }, 125 | ], 126 | finish: [{ name: "swipe" }], 127 | }, 128 | }, 129 | 130 | HOME_FOLLOW: { 131 | desc: "首页关注", 132 | name: "首页关注", 133 | pageid: Env.PageEnum.HOME_FOLLOW, 134 | mark: { id: "iv_groupStateIndicator", className: "android.widget.ImageView" }, 135 | next: [], 136 | operates: { 137 | next: [ 138 | { name: "click", mark: { desc: "我" } }, 139 | ], 140 | finish: [{ name: "back" }], 141 | }, 142 | }, 143 | 144 | SIGEN: { 145 | desc: "微博钱包", 146 | name: "微博钱包", 147 | pageid: Env.PageEnum.SIGEN, 148 | mark: { name: "image", mark: { base64: weiboqianbao_hong }}, 149 | next: [], 150 | operates: { 151 | next: [ 152 | { name: "image", mark: { base64: zhaoqidaka }, param:{action:"tap"} }, 153 | { name: "sleep" }, 154 | { name: "click", mark: { id: "sign_name" } }, 155 | { name: "sleep" }, 156 | ], 157 | }, 158 | }, 159 | 160 | HOME_MESSAGE: { 161 | desc: "打卡页面", 162 | name: "打卡页面", 163 | pageid: Env.PageEnum.HOME_MESSAGE, 164 | mark: { id: "listview_header_no_hider_ll_sign_in" }, 165 | next: [], 166 | operates: { 167 | next: [ 168 | { name: "click", mark: { id: "listview_header_no_hider_ll_sign_in" } }, 169 | { name: "sleep" }, 170 | ], 171 | finish: [{ name: "back" }], 172 | }, 173 | }, 174 | }, 175 | }; 176 | 177 | /** 178 | * 初始化后执行 179 | */ 180 | function afterInit() { 181 | sleep(1000); 182 | } 183 | 184 | var __curJob = JSON.parse(JSON.stringify(Job)); 185 | //运行 186 | Work.main(__curJob, afterInit); -------------------------------------------------------------------------------- /src/work/百度地图-签到.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | 20 | var Work = require("../common/work"); 21 | var Env = require('../env'); 22 | 23 | /** 24 | * 注意:如果一个页面有多个特征码匹配,以最后一个为准 25 | */ 26 | var Job = { 27 | version: '10.17.4.928', 28 | CLIENT: '百度地图-签到', 29 | package: 'com.baidu.BaiduMap', 30 | activity: "com.baidu.baidumaps.MapsActivity", 31 | /** 32 | * @description 默认配置,自动加载 33 | */ 34 | get default() { 35 | return { 36 | /** 37 | * @description steps定义当前任务需要完成工作的步骤 38 | */ 39 | steps: [this.running], 40 | /** 41 | * @description 指定某一步骤的最大重复次数 42 | */ 43 | maxTimes: [-1], 44 | /** 45 | * @description 定义可能遇到的页面默认处理方式; next:为强制跳转,pageid:为页面ID,jobs:为具体的执行操作 46 | */ 47 | someone: [ 48 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.UPDATED, jobs: this.pages.UPDATED.operates.next }, 49 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next}, 50 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.next}, 51 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next}, 52 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME_MESSAGE, jobs: this.pages.HOME_MESSAGE.operates.next, exit:true}, 53 | ], 54 | } 55 | }, 56 | /** 57 | * @description Running步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 58 | */ 59 | get running() { 60 | return { 61 | step: Env.STEP.RUNNING, 62 | must: [ 63 | { pageid: Env.PageEnum.UPDATED, jobs: this.pages.UPDATED.operates.next }, 64 | { pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 65 | { pageid: Env.PageEnum.MINE, jobs: this.pages.MINE.operates.next }, 66 | { pageid: Env.PageEnum.SIGEN, jobs: this.pages.SIGEN.operates.next }, 67 | { pageid: Env.PageEnum.HOME_MESSAGE, jobs: this.pages.HOME_MESSAGE.operates.next, exit:true }, 68 | ], 69 | someone: [], 70 | } 71 | }, 72 | 73 | /** 74 | * ... 还可以定义更多的步骤 75 | */ 76 | /** 77 | * 定义页面的识别标志及具体的各操作 78 | */ 79 | pages: { 80 | UPDATED: { 81 | desc: "关闭更新弹窗", 82 | name: "关闭更新弹窗", 83 | pageid: Env.PageEnum.UPDATED, 84 | mark: { id: "cancel_update" }, 85 | next: [], 86 | operates: { 87 | next: [ 88 | { name: "click", mark: { id: "cancel_update" } }, 89 | ] 90 | }, 91 | }, 92 | 93 | 94 | MINE: { 95 | desc: "个人中心", 96 | name: "个人中心", 97 | pageid: Env.PageEnum.MINE, 98 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 99 | mark: { id: "user_info_user_head_icon" }, 100 | next: [], 101 | operates: { 102 | next: [ 103 | // { name: "click", mark: { id: "user_head_portrait_icon" } }, 104 | // { name: "sleep"}, 105 | { name: "click", mark: { id: "ll_lv_signin" } }, 106 | { name: "sleep"}, 107 | { name: "click", mark: { text: "不选择地点" } }, 108 | { name: "sleep"}, 109 | ], 110 | finish: [{ name: "back" }], 111 | }, 112 | }, 113 | 114 | 115 | HOME: { 116 | desc: "首页", 117 | name: "首页", 118 | pageid: Env.PageEnum.HOME, 119 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 120 | mark: { id: "user_head_portrait_icon" }, 121 | next: [], 122 | operates: { 123 | next: [ 124 | { name: "click", mark: { id: "user_head_portrait_icon" } }, 125 | { name: "sleep"}, 126 | ], 127 | finish: [{ name: "back" }], 128 | }, 129 | }, 130 | 131 | SIGEN: { 132 | desc: "我在这里", 133 | name: "我在这里", 134 | pageid: Env.PageEnum.SIGEN, 135 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 136 | mark: { id:"tv_title_text", text: "我在这里" }, 137 | next: [], 138 | operates: { 139 | next: [ 140 | { name: "click", mark: { text: "不选择地点" } }, 141 | { name: "sleep"}, 142 | { name: "click", mark: { id: "sign_name" } }, 143 | { name: "sleep"}, 144 | ], 145 | }, 146 | }, 147 | 148 | HOME_MESSAGE: { 149 | desc: "聊天页面", 150 | name: "聊天页面", 151 | pageid: Env.PageEnum.HOME_MESSAGE, 152 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 153 | mark: { id:"user_sys_question_btn"}, 154 | next: [], 155 | operates: { 156 | next: [ 157 | { name: "click", mark: { id: "iv_left_btn" } }, 158 | { name: "sleep"}, 159 | ], 160 | finish: [{ name: "back" }], 161 | }, 162 | }, 163 | }, 164 | }; 165 | 166 | /** 167 | * 初始化后执行 168 | */ 169 | function afterInit() { 170 | sleep(1000); 171 | } 172 | 173 | var __curJob = JSON.parse(JSON.stringify(Job)); 174 | //运行 175 | Work.main(__curJob, afterInit); -------------------------------------------------------------------------------- /src/work/网易邮箱-注册.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 入口文件 3 | * @description 本脚本在Auto.Js 4.0.1版本中,自动化控制Android微博版本号:9.6.3版测试通过! 4 | * 欢迎使用和提交bug反馈 5 | * 设备要求: 6 | * 1.需要root 7 | * 2.安卓5.0以上 8 | * 3.Auto.js软件版本4.0以上 9 | * 10 | * 使用方法: 11 | * 1.将脚本与./dist/main.js放于同一目录下 12 | * 2.直接启动脚本即可 13 | * 3.暂时不支持解锁手机 14 | * 15 | * @author Tuple 16 | * @version 0.1 17 | */ 18 | 19 | 20 | var Work = require("../common/work"); 21 | var Env = require('../env'); 22 | 23 | /** 24 | * 注意:如果一个页面有多个特征码匹配,以最后一个为准 25 | */ 26 | var Job = { 27 | CLIENT: 'mail.163.com', 28 | package: 'com.tencent.mtt',//qq浏览器 29 | activity: "com.tencent.mtt.MainActivity", 30 | 31 | /** 32 | * @description 默认配置,自动加载 33 | */ 34 | get default() { 35 | return { 36 | /** 37 | * @description steps定义当前任务需要完成工作的步骤 38 | */ 39 | steps: [this.running], 40 | /** 41 | * @description 指定某一步骤的最大重复次数 42 | */ 43 | maxTimes: [-1], 44 | /** 45 | * @description 定义可能遇到的页面默认处理方式; next:为强制跳转,pageid:为页面ID,jobs:为具体的执行操作 46 | */ 47 | someone: [ 48 | { next: Env.STEP.NOCHANGE, pageid: Env.PageEnum.UNKNOW, jobs: this.pages.UNKNOW.operates.next }, 49 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.LOGIN, jobs: this.pages.LOGIN.operates.register }, 50 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.REGISTER, jobs: this.pages.REGISTER.operates.input }, 51 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.ACCOUNT_CONFIRM, jobs: this.pages.ACCOUNT_CONFIRM.operates.input }, 52 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.ACCOUNT_SEND_CONFIRM, jobs: this.pages.ACCOUNT_SEND_CONFIRM.operates.send }, 53 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.REGISTER_OK, jobs: this.pages.REGISTER_OK.operates.send }, 54 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.SELECT_CLASS, jobs: this.pages.SELECT_CLASS.operates.next }, 55 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 56 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME_SEARCH, jobs: this.pages.HOME_SEARCH.operates.next }, 57 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.SEARCH, jobs: this.pages.SEARCH.operates.next }, 58 | { next: Env.STEP.RUNNING, pageid: Env.PageEnum.HOME_HOT, jobs: this.pages.HOME_HOT.operates.send, exit: true }, 59 | ], 60 | } 61 | }, 62 | /** 63 | * @description Login步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 64 | */ 65 | get login() { 66 | return { 67 | step: Env.STEP.LOGIN, 68 | must: [ 69 | { pageid: Env.PageEnum.HOME, jobs: this.pages.HOME.operates.next }, 70 | { pageid: Env.PageEnum.HOME_SEARCH, jobs: this.pages.HOME_SEARCH.operates.next }, 71 | { pageid: Env.PageEnum.SEARCH, jobs: this.pages.SEARCH.operates.next }, 72 | ], 73 | someone: [ 74 | ], 75 | } 76 | 77 | }, 78 | 79 | /** 80 | * @description Login步骤,为登陆步骤:分为必须步骤(must)和可能步骤(someone) 81 | */ 82 | get running() { 83 | return { 84 | step: Env.STEP.RUNNING, 85 | must: [ 86 | { pageid: Env.PageEnum.REGISTER, jobs: this.pages.REGISTER.operates.input }, 87 | { pageid: Env.PageEnum.ACCOUNT_SEND_CONFIRM, jobs: this.pages.ACCOUNT_SEND_CONFIRM.operates.send }, 88 | { pageid: Env.PageEnum.HOME_HOT, jobs: this.pages.HOME_HOT.operates.send, exit: true }, 89 | ], 90 | someone: [ 91 | ], 92 | } 93 | 94 | }, 95 | 96 | /** 97 | * ... 还可以定义更多的步骤 98 | */ 99 | /** 100 | * 定义页面的识别标志及具体的各操作 101 | */ 102 | pages: { 103 | UNKNOW: { 104 | desc: "未知页面", 105 | name: "未知页面", 106 | pageid: Env.PageEnum.UNKNOW, 107 | mark: { name: "unknow" }, 108 | priority:0, 109 | next: [], 110 | operates: { 111 | next: [ 112 | { name: "click", mark: { className: "android.widget.TextView", text: "立即体验" } }, 113 | { name: "click", mark: { text: "先进入网页版邮箱>" } }, 114 | { name: "click", mark: { text: "以后再说" } }, 115 | ] 116 | }, 117 | }, 118 | HOME: { 119 | desc: "浏览器首页", 120 | name: "浏览器首页", 121 | priority:0, 122 | pageid: Env.PageEnum.HOME, 123 | mark: { className: "com.tencent.mtt.browser.homepage.view.fastlink.g", text: "直播交友" }, 124 | next: [], 125 | operates: { 126 | next: [ 127 | { name: "click", mark: { className: "android.widget.TextView", text: "搜免费小说 影视 游戏 App" } }, 128 | ], 129 | finish: [{ name: "sleep" }], 130 | }, 131 | }, 132 | HOME_SEARCH: { 133 | desc: "首页搜索", 134 | name: "首页搜索", 135 | priority:1, 136 | pageid: Env.PageEnum.HOME_SEARCH, 137 | mark: { desc: "智能语音" }, 138 | next: [], 139 | operates: { 140 | next: [ 141 | { name: "input", mark: { className: "android.widget.TextView", text: "取消" }, param: { get: { default: "mail.163.com" }, parent: 1, indexOf: { tag: "className", default: "android.view.View" } } }, 142 | { name: "sleep" }, 143 | { name: "tap", mark: { className: "android.widget.TextView", text: "进入" } }, 144 | ], 145 | finish: [{ name: "sleep" }], 146 | }, 147 | }, 148 | SEARCH: { 149 | desc: "搜索页", 150 | name: "搜索页", 151 | priority:2, 152 | pageid: Env.PageEnum.SEARCH, 153 | mark: { className: "android.widget.TextView", text: "进入" }, 154 | next: [], 155 | operates: { 156 | next: [ 157 | { name: "click", mark: { className: "android.widget.TextView", text: "进入" } }, 158 | ], 159 | finish: [{ name: "sleep" }], 160 | }, 161 | }, 162 | SELECT_CLASS: { 163 | desc: "先进入网页版邮箱", 164 | name: "先进入网页版邮箱", 165 | priority:0, 166 | pageid: Env.PageEnum.SELECT_CLASS, 167 | mark: { className: "android.view.View", text: "先进入网页版邮箱>" }, 168 | next: [], 169 | operates: { 170 | next: [ 171 | { name: "click", mark: { className: "android.view.View", text: "先进入网页版邮箱>" } }, 172 | ] 173 | }, 174 | }, 175 | LOGIN: { 176 | desc: "登陆页输入手机号", 177 | name: "登录", 178 | /** 179 | * mark: 页面的标志控件,当页面找到匹配mark属性的控件时,我们认为它就位于这个页面 180 | * mark可能的属性:id,text,desc,className,textStartsWith,textEndsWith, 181 | * descStartsWith,descEndsWith 具体可以参考Autojs控件uiselector的函数 182 | */ 183 | mark: { className: "android.view.View", text: "登  录" }, 184 | priority:0, 185 | pageid: Env.PageEnum.LOGIN, 186 | next: [], 187 | operates: { 188 | login: [ 189 | { name: "get", mark: { name: "login_phone", uri: "api" }, param: { set: { name: "phone" } } }, 190 | { name: "set_text", mark: { className: "android.widget.EditText", text: "用户名" }, param: { get: { name: "phone" } } }, 191 | { name: "set_text", mark: { className: "android.widget.EditText", text: "密码" }, param: { get: { name: "password" } } }, 192 | { name: "click", mark: { id: "dologin", text: "登 录" } }, 193 | ], 194 | register: [ 195 | { name: "click", mark: { className: "android.view.View", text: "去注册" } }, 196 | ] 197 | }, 198 | }, 199 | REGISTER: { 200 | desc: "注册页", 201 | name: "注册页", 202 | priority:0, 203 | pageid: Env.PageEnum.REGISTER, 204 | mark: { className: "android.view.View", text: "用户注册即代表同意" }, 205 | next: [], 206 | operates: { 207 | input: [ 208 | { name: "get", mark: { name: "register_name", uri: "api" }, param: { set: { name: "name" } } }, 209 | { name: "set_text", mark: { className: "android.widget.EditText", text: "6-18位字母数字组合" }, param: { get: { name: "name" } } }, 210 | { name: "wait", mark: { className: "android.view.View", text: "6-16位字母数字字符组合密码" } }, 211 | { name: "get", mark: { name: "register_password", uri: "api" }, param: { set: { name: "password" } } }, 212 | { name: "set_text", mark: { className: "android.widget.EditText", text: "6-16位字母数字字符组合密码" }, param: { get: { name: "password" } } }, 213 | { name: "click", mark: { className: "android.widget.CheckBox" } }, 214 | { name: "tap", mark: { className: "android.view.View", text: "点此进行验证" } }, 215 | { name: "wait", mark: { className: "android.view.View", text: "验证成功" } }, 216 | { name: "click", mark: { className: "android.view.View", text: "下一步" } }, 217 | ], 218 | finish: [{ name: "sleep" }], 219 | }, 220 | }, 221 | ACCOUNT_CONFIRM: { 222 | desc: "验证手机号", 223 | name: "验证手机号", 224 | priority:0, 225 | pageid: Env.PageEnum.ACCOUNT_CONFIRM, 226 | mark: { className: "android.view.View", text: "注 册" }, 227 | next: [], 228 | operates: { 229 | input: [ 230 | { name: "get", mark: { name: "register_phone", uri: "api" }, param: { set: { name: "phone" } } }, 231 | { name: "set_text", mark: { className: "android.widget.EditText", text: "输入验证手机号" }, param: { get: { name: "phone" } } }, 232 | { name: "click", mark: { className: "android.view.View", text: "获取验证码" } }, 233 | // { name: "get", mark: { name: "register_code", uri: "api" }, param: { set: { name: "register_code" } } }, 234 | // { name: "set_text", mark: { className:"android.widget.EditText", text:"输入短信验证码" }, param: { get: { name: "register_code" } } }, 235 | // { name: "click", mark: { className:"android.view.View", text: "注 册" } }, 236 | ], 237 | finish: [{ name: "sleep" }], 238 | }, 239 | }, 240 | ACCOUNT_SEND_CONFIRM: { 241 | desc: "前往发送短信确认", 242 | name: "前往发送短信", 243 | priority:0, 244 | pageid: Env.PageEnum.ACCOUNT_SEND_CONFIRM, 245 | // mark: { className:"android.view.View", text: "编辑短信:注册验证" }, 246 | mark: { className: "android.view.View", text: "前往发送短信" }, 247 | next: [], 248 | operates: { 249 | send: [ 250 | { name: "get", mark: { name: "register_send_code", uri: "api" }, param: {} }, 251 | { name: "sleep", param: { delay: 12000 } }, 252 | { name: "click", mark: { className: "android.view.View", text: "我已发送短信,注册" }, param:{loops:5,delay:5000} }, 253 | // { name: "sleep", param:{delay:10000}}, 254 | // { name: "click", mark: { className:"android.view.View", text: "我已发送短信,注册" } }, 255 | // // 系统未收到短信,请重新发送短信验证 256 | ], 257 | finish: [{ name: "sleep" }], 258 | }, 259 | }, 260 | REGISTER_OK: { 261 | desc: "恭喜您,注册成功", 262 | name: "注册成功", 263 | priority:0, 264 | pageid: Env.PageEnum.REGISTER_OK, 265 | mark: { className: "android.view.View", text: "恭喜您," }, 266 | next: [], 267 | operates: { 268 | send: [ 269 | ], 270 | finish: [{ name: "sleep" }], 271 | }, 272 | }, 273 | HOME_HOT: { 274 | desc: "邮箱首页", 275 | name: "邮箱首页", 276 | priority:0, 277 | pageid: Env.PageEnum.HOME_HOT, 278 | mark: { className: "android.view.View", text: "收件箱" }, 279 | next: [], 280 | operates: { 281 | send: [ 282 | { name: "get", mark: { name: "register_ok", uri: "api" }}, 283 | ], 284 | finish: [{ name: "sleep" }], 285 | }, 286 | }, 287 | 288 | 289 | }, 290 | }; 291 | /** 292 | * 初始化并获取配置 293 | */ 294 | function afterInit() { 295 | sleep(1000); 296 | } 297 | 298 | var __curJob = JSON.parse(JSON.stringify(Job)); 299 | //运行 300 | Work.main(__curJob, afterInit); -------------------------------------------------------------------------------- /tools/image2base64: -------------------------------------------------------------------------------- 1 | python image2base64.py -------------------------------------------------------------------------------- /tools/image2base64.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import base64 4 | import os 5 | 6 | imgBase64 = '../resources/template/base64.txt' 7 | file_dir = '../resources/template/' 8 | 9 | os.remove(imgBase64) 10 | 11 | print(file_dir, imgBase64) 12 | for root, dirs, files in os.walk(file_dir): 13 | for file in files: 14 | if os.path.splitext(file)[1] == '.png': 15 | print(file) 16 | img = os.path.join(root,file) 17 | with open(img,"rb") as f: 18 | # b64encode是编码,b64decode是解码 19 | base64_data = base64.b64encode(f.read()) 20 | # # base64.b64decode(base64data) 21 | # print(base64_data) 22 | #print('create base64 ok :', os.path.splitext(img)[0]) 23 | f = open(imgBase64,'a+') 24 | f.writelines(os.path.splitext(img)) 25 | f.writelines("\r\n") 26 | # f.writelines('data:image/png;base64,'+base64_data) 27 | f.writelines(base64_data) 28 | f.writelines("\r\n\r\n\r\n\r\n") 29 | f.close() 30 | print('create base64 ok') 31 | 32 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | // webpack.config.js 2 | 3 | const path = require('path'); 4 | const glob = require('glob'); 5 | 6 | var addUI = require('./addUI'); 7 | 8 | // let entry = getEntry('./src/work/**.js'); 9 | 10 | function getEntry(globPath, options) { 11 | options = options || {}; 12 | var entries = {}, 13 | basename, tmp, pathname; 14 | 15 | glob.sync(globPath, options).forEach(function (entry) { 16 | pathname = entry.replace(/\.js$/,'').replace(/^\.\/src\/work\//,''); 17 | let fpath = entry; 18 | if(options.cwd){ 19 | fpath = path.join(options.cwd, entry); 20 | } 21 | entries[pathname] = [fpath]; 22 | }); 23 | return entries; 24 | } 25 | 26 | var config = { 27 | // entry: getEntry('./src/work/*.js'), 28 | entry: getEntry('./src/work/微博-删除重复微博.js'), 29 | output: { 30 | // filename: 'main.js', 31 | //注意:使用[name]确保每个文件名都不重复 32 | filename: '[name].js', 33 | // filename: '[name]-[hash].js', 34 | path: path.resolve(__dirname, 'dist') 35 | }, 36 | plugins: [ 37 | new addUI({ options: true }) 38 | ] 39 | }; 40 | 41 | 42 | 43 | module.exports = (env, argv) => { 44 | 45 | if (argv.mode === 'development') { 46 | config.devtool = 'source-map'; 47 | } 48 | 49 | if (argv.mode === 'production') { 50 | //... 51 | } 52 | 53 | return config; 54 | }; -------------------------------------------------------------------------------- /webpack.development.config.js: -------------------------------------------------------------------------------- 1 | // webpack.development.config.js 2 | 3 | const path = require('path'); 4 | 5 | module.exports = { 6 | mode: 'development', 7 | entry: './src/index.js', 8 | output: { 9 | filename: 'main.js', 10 | path: path.resolve(__dirname, 'dist') 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /webpack.production.config.js: -------------------------------------------------------------------------------- 1 | // webpack.production.config.js 2 | 3 | const path = require('path'); 4 | 5 | module.exports = { 6 | mode: 'production', 7 | entry: './src/index.js', 8 | output: { 9 | filename: 'main.js', 10 | path: path.resolve(__dirname, 'dist') 11 | } 12 | }; 13 | --------------------------------------------------------------------------------