autojs05autojspro常用的代码和公共函数如何用Autojs来写脚本
如何用Autojs来写脚本,一部手机除了睡觉的时间之外,都可以给你来赚钱,手机不是用来看的,手机是用来赚钱的。我劝你把手机仍在一个角落里面,让它乖乖地给你去赚钱,而你呢,你应该去做你自己想做的事情,比如对于我来说,我喜欢写程序,看书,喝茶,做家务,陪儿子玩。那么这个时间你就不要去玩手机了,极简主义者连手机这种东西都是不碰的,所以我今天要给大家倡导一个理念:让手机给你赚零花钱。
植入了理念,后面就谈怎么去做,如果你要让手机给你赚钱,赚的是什么钱,我们这里不做违法的事情,不做黄色的,不做赌博的,那么我们做什么,简单来说就是薅羊毛,就是通过自动阅读新闻,观看视频,获取平台的收益,本来这个事情是需要你的手指去疯狂点击的,现在呢,就不需要了,要让计算机脚本语言帮助你去实现。
今天我介绍的一款软件是Autojs,这个是一个写手机运行脚本的工具,这个是国人开发的,自豪!!!
这个大家可以在模拟器上面去安装,具体的操作步骤我就不讲了,我主要来讲解一下我们怎么去做这个薅羊毛的事情,
模拟器上面装好以后,就是看到这个界面
我们现在以刷宝为例子,来讲解,首先先下载“刷宝短视频”, 百度搜索一下就可以了,安装后注册你的账号,通常是以微信号来登陆,绑定一下,这样才能够提现。
然后我们要下载一个JS code的软件,这个软件是方便你在电脑上去写脚本,原理上你从手机上去写也是可以的,完全可以,小编就是在去公司的班车上,在手机上来写薅金脚本的!但是在手机上写,你会很累,所以你在JS code上下载一个插件,就可以来写了。这边我以手机端举例子,我们来讲解一个最简单的例子,循序渐进地讲,其实要很快学会一门计算机编程语言,最快的方法,就是你想要去实现一个东西,然后你带着这个目标去学怎么写,这样是最快的。
今天我们就写一句代码,如何自动打开像趣头条,今日头条之类的平台,
launchApp("刷宝短视频");
1
lanchApp("刷宝短视频“) 解析
好的,我们来讲解一下这个代码的意思,launchApp的意思就是英文“加载App的意思”,这是一个函数,函数是用括号括起来的,大家学过初中数学的话知道函数是 y=f(x), 这个x是自变量,y是应变量,就是说y和x存在一个对应的关系,输入一个x,通过一定的规则法则,就出来一个y, 这个就是一个规则,比如说:y=2x, 就是你放大了2倍, y=1/2*x,就是缩小了一倍。这个是数学的概念,其实函数的思想可以用来阐述各种事物,计算机编程语言中的函数其实也是这个意思,launchApp就是一个规则,x是什么呢,就是“刷宝短视频“,那么y是什么呢,这里没有给定,那就是一个空的返回值,可以不返回任何值,”刷宝短视频“就是你下载的应用App的名字,同样,你可以写“趣头条”,“今日头条”等等。
给大家看看,效果,执行这个脚本以后,程序自动开启“刷宝短视频”了,怎么样,好玩吗
——————————
autojspro常用的代码和公共函数搜集整理,史上最全最完整
1 /**
2 * 整理者: 家
3 * 日期: 20190224
4 * 妈呀: 整理了一宿,现在是早上6:34
5 * 功能: 把某些常用的函数集中起来,方便调用
6 * 函数来源: 都是群里的大佬写的,稻草人,+攀登,Ai,破晓的星辰,灶猫,家,浩然,白酒煮饭,生僻字大佬,内个谁,Xero,无名小姐,壞蛋┭,锦瑟安年Ω,专业滥竽充数,膜拜以上几位大神,不管你们同意不同意,我都把你们的代码搬到一块了,O(∩_∩)O哈哈~
7 * git: https://github.com/snailuncle/autojsCommonFunctions/blob/master/autojsCommonFunctions.js
8 */
9
10 //此代码由飞云脚本圈整理提供(www.feiyunjs.com)
11
12 // //导入模块
13 // function 导入常用函数模块(){
14 // var url='https://raw.githubusercontent.com/snailuncle/autojsCommonFunctions/master/autojsCommonFunctions.js'
15 // var r = http.get(url)
16 // log("code = " + r.statusCode);
17 // var html=r.body.bytes()
18 // files.writeBytes('./autojsCommonFunctions.js',html)
19 // var common=require('./autojsCommonFunctions.js')
20 // return common
21 // }
22 // var common=导入常用函数模块()
23 // log(common)
24 // for(let i=0;i<33;i++){
25 // common.闪光弹('fire in the hole')
26 // }
27
28
29
30
31 [
32 '点击控件',
33 '铃声',
34 '启动app',
35 '停止app',
36 '卸载app',
37 '卸载app没root',
38 '清除app数据',
39 '启动最新安装的app',
40 '停止最新安装的app',
41 '卸载最新安装的app',
42 '清除最新安装的app数据',
43 '静默安装app',
44 '获取app图标',
45 '控制app联网',
46 '获取手机上所有的app名字',
47 '点击输入框弹出输入法',
48 '使所有输入框点击时都能弹出输入法',
49 '失去焦点',
50 '是否root',
51 '获取指定应用的版本号',
52 '打开qq群名片',
53 '打开qq名片',
54 'qq强制聊天',
55 '字节变为gbk中文',
56 '最新安装的app',
57 '文件修改时间',
58 '文件大小',
59 '字符串变字节',
60 '日期加N天',
61 'md5',
62 '是横屏还是竖屏',
63 '截图',
64 '随机字符',
65 '获取时间',
66 '调整手机音量',
67 '微信扫一扫',
68 '公共字符串',
69 '网络',
70 '安卓intent源码',
71 '获取手机ip地理位置',
72 '替换系统文件',
73 '编辑距离',
74 '数组交集',
75 '提取包含关键字的app',
76 '获取页面所有文字',
77 '悬浮控制',
78 '闪光弹',
79 '打开开发者选项',
80 '气泡',
81 '随机字符串',
82 'wifi状态',
83 '开关飞行模式',
84 '上滑',
85 '获取deflate网页内容',
86 '获取gzip网页内容'
87 ]
88
89
90
91
92
93 var common = {}
94 Array.prototype.intersect = function () {
95 var result = new Array();
96 var obj = {};
97 for (var i = 0; i < arguments.length; i++) {
98 for (var j = 0; j < arguments[i].length; j++) {
99 var str = arguments[i][j];
100 if (!obj[str]) {
101 obj[str] = 1;
102 } else {
103 obj[str]++;
104 if (obj[str] == arguments.length) {
105 result.push(str);
106 }
107 } //end else
108 } //end for j
109 } //end for i
110 return result;
111 }
112 //集合去掉重复
113 Array.prototype.uniquelize = function () {
114 var tmp = {},
115 ret = [];
116 for (var i = 0, j = this.length; i < j; i++) {
117 if (!tmp[this[i]]) {
118 tmp[this[i]] = 1;
119 ret.push(this[i]);
120 }
121 }
122 return ret;
123 }
124 //并集
125 Array.prototype.union = function () {
126 var arr = new Array();
127 var obj = {};
128 for (var i = 0; i < arguments.length; i++) {
129 for (var j = 0; j < arguments[i].length; j++) {
130 var str = arguments[i][j];
131 if (!obj[str]) {
132 obj[str] = 1;
133 arr.push(str);
134 }
135 } //end for j
136 } //end for i
137 return arr;
138 }
139 //2个集合的差集 在arr不存在
140 Array.prototype.minus = function (arr) {
141 var result = new Array();
142 var obj = {};
143 for (var i = 0; i < arr.length; i++) {
144 obj[arr[i]] = 1;
145 }
146 for (var j = 0; j < this.length; j++) {
147 if (!obj[this[j]]) {
148 obj[this[j]] = 1;
149 result.push(this[j]);
150 }
151 }
152 return result;
153 };
154 // console.log(Array.intersect(["1", "2", "3"], ["2", "3", "4", "5", "6"])); //[2,3]
155 // console.log([1, 2, 3, 2, 3, 4, 5, 6].uniquelize()); //[1,2,3,4,5,6]
156 // console.log(Array.union(["1", "2", "3"], ["2", "3", "4", "5", "6"], ["5", "6", "7", "8", "9"]))
157 // console.log(["2", "3", "4", "5", "6"].minus(["1", "2", "3"]));
158
159 common.点击控件 = function (view) {
160 log(arguments.callee.name + '开始')
161 log(view)
162 if (view) {
163 var x = view.bounds().centerX()
164 var y = view.bounds().centerY()
165 log('将要点击的坐标 %s,%s', x, y)
166 press(x, y, 1)
167 } else {
168 throw '传入点击控件中的view异常'
169 }
170 log(arguments.callee.name + '结束')
171 }
172 common.铃声 = function (铃声类型, 是否循环播放, 播放时长) {
173 var 铃声类型 = 铃声类型 || 0
174 var 播放时长 = 播放时长 || 6000
175 var 是否循环播放 = 是否循环播放 || false
176 if (是否循环播放) {
177 播放时长 = 666 * 1000
178 }
179 var 铃声选择结果 = android.media.RingtoneManager.TYPE_NOTIFICATION
180 switch (铃声类型) {
181 case 0:
182 铃声选择结果 = android.media.RingtoneManager.TYPE_RINGTONE
183 break;
184 case 1:
185 铃声选择结果 = android.media.RingtoneManager.TYPE_ALARM
186 break;
187 case 2:
188 铃声选择结果 = android.media.RingtoneManager.TYPE_ALL
189 break;
190 default:
191 break;
192 }
193 var mp = new android.media.MediaPlayer();
194 mp.setDataSource(context, android.media.RingtoneManager.getDefaultUri(铃声选择结果));
195 if (是否循环播放) mp.setLooping(true);
196 mp.prepare();
197 mp.start();
198 threads.start(function () {
199 sleep(播放时长)
200 if (mp.isPlaying()) {
201 mp.stop()
202 }
203 });
204 return mp;
205 }
206
207 common.启动app = function (appName) {
208 launchApp(appName)
209 }
210
211 common.停止app = function (appName) {
212 var packageName=getPackageName(appName);
213 shell('am force-stop ' + packageName,true);
214
215 }
216 common.卸载app = function (appName) {
217 var packageName=getPackageName(appName);
218 shell("pm uninstall "+packageName,true)
219 }
220
221 common.清除app数据 = function (appName) {
222 var packageName=getPackageName(appName);
223 shell('pm clear ' + packageName,true);
224 }
225
226
227 common.卸载最新安装的app=function (){
228 var pm = context.getPackageManager()
229 var appList=pm.getInstalledApplications(0)
230 var appInfoList=[]
231 for(let i=0;i<appList.size();i++){
232 var app=appList.get(i)
233 var appInfo={
234 appName:app.loadLabel(pm),
235 packageName:app.packageName,
236 isSystemApp:app.isSystemApp(),
237 firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
238 }
239 appInfoList.push(appInfo)
240
241 }
242 appInfoList.sort((a,b)=>{
243 return b.firstInstallTime-a.firstInstallTime
244 })
245 log('最新安装的app是=%j',appInfoList[0])
246
247 var packageName=appInfoList[0].packageName
248 shell("pm uninstall "+packageName,true)
249 return appInfoList[0].appName
250 }
251 common.清除最新安装的app数据=function (){
252 var pm = context.getPackageManager()
253 var appList=pm.getInstalledApplications(0)
254 var appInfoList=[]
255 for(let i=0;i<appList.size();i++){
256 var app=appList.get(i)
257 var appInfo={
258 appName:app.loadLabel(pm),
259 packageName:app.packageName,
260 isSystemApp:app.isSystemApp(),
261 firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
262 }
263 appInfoList.push(appInfo)
264
265 }
266 appInfoList.sort((a,b)=>{
267 return b.firstInstallTime-a.firstInstallTime
268 })
269 log('最新安装的app是=%j',appInfoList[0])
270
271 var packageName=appInfoList[0].packageName
272 shell('pm clear ' + packageName,true);
273 return appInfoList[0].appName
274 }
275 common.停止最新安装的app=function (){
276 var pm = context.getPackageManager()
277 var appList=pm.getInstalledApplications(0)
278 var appInfoList=[]
279 for(let i=0;i<appList.size();i++){
280 var app=appList.get(i)
281 var appInfo={
282 appName:app.loadLabel(pm),
283 packageName:app.packageName,
284 isSystemApp:app.isSystemApp(),
285 firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
286 }
287 appInfoList.push(appInfo)
288
289 }
290 appInfoList.sort((a,b)=>{
291 return b.firstInstallTime-a.firstInstallTime
292 })
293 log('最新安装的app是=%j',appInfoList[0])
294
295
296
297
298 var packageName=appInfoList[0].packageName
299 shell('am force-stop ' + packageName,true);
300 return appInfoList[0].appName
301 }
302
303 common.启动最新安装的app=function (){
304 var pm = context.getPackageManager()
305 var appList=pm.getInstalledApplications(0)
306 var appInfoList=[]
307 for(let i=0;i<appList.size();i++){
308 var app=appList.get(i)
309 var appInfo={
310 appName:app.loadLabel(pm),
311 packageName:app.packageName,
312 isSystemApp:app.isSystemApp(),
313 firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
314 }
315 appInfoList.push(appInfo)
316
317 }
318 appInfoList.sort((a,b)=>{
319 return b.firstInstallTime-a.firstInstallTime
320 })
321 log('最新安装的app是=%j',appInfoList[0])
322
323
324
325
326 var packageName=appInfoList[0].packageName
327 launch(packageName)
328 return appInfoList[0].appName
329 }
330
331 common.点击输入框弹出输入法=function (window,view){
332 view.on(
333 "touch_down", function () {
334 window.requestFocus();
335 view.requestFocus();
336 }
337 )
338 view.on(
339 "key", function (keyCode,event) {
340 if(event.getAction()==event.ACTION_DOWN && keyCode == keys.back){
341 window.disableFocus()
342 event.consumed=true
343 }
344 window.requestFocus();
345 view.requestFocus();
346 }
347 )
348
349 }
350
351
352 common.使所有输入框点击时都能弹出输入法=function (window,inputBoxViewArr){
353 for(let i=0;i<inputBoxViewArr.length;i++){
354 var view=inputBoxViewArr[i]
355 common.点击输入框弹出输入法(window,view)
356 }
357 }
358
359
360
361 common.失去焦点=function (window){
362 window.disableFocus()
363 }
364
365
366
367
368
369 common.是否root=function(){
370 var r=shell("ls /system/bin",true).result.toString()
371 if(r.length>50){
372 return true
373 }else{
374 return false
375 }
376 }
377 common.获取指定应用的版本号 = function (appName) {
378 /**
379 * 获取指定应用的版本号
380 * @param {string} packageName 应用包名
381 */
382 function getPackageVersion(packageName) {
383 importPackage(android.content);
384 var pckMan = context.getPackageManager();
385 var packageInfo = pckMan.getPackageInfo(packageName, 0);
386 return packageInfo.versionName;
387 }
388 var packageName = getPackageName(appName);
389 return getPackageVersion(packageName)
390 }
391
392
393 common.打开qq群名片=function (qq群号){
394 app.startActivity({
395 action: "android.intent.action.VIEW",
396 data:"mqqapi://card/show_pslcard?card_type=group&uin="+qq群号,
397 packageName: "com.tencent.mobileqq",
398 });//打开qq群名片
399
400
401 }
402
403
404
405 common.打开qq名片=function (qq号){
406 app.startActivity({
407 action: "android.intent.action.VIEW",
408 data:"mqqapi://card/show_pslcard?uin="+qq号,
409 packageName: "com.tencent.mobileqq",
410 });//打开qq名片
411
412
413 }
414
415 common.qq强制聊天=function (qq号){
416 app.startActivity({
417 action: "android.intent.action.VIEW",
418 data:"mqq://im/chat?chat_type=wpa&version=1&src_type=web&uin="+qq号,
419 packageName: "com.tencent.mobileqq",
420 });//qq强制聊天
421
422 }
423
424 common.字节变为gbk中文 = function (bytesContent) {
425 var str = new java.lang.String(bytesContent, "gbk")
426 return str
427 }
428 common.最新安装的app = function () {
429
430 var pm = context.getPackageManager()
431 var appList=pm.getInstalledApplications(0)
432 var appInfoList=[]
433 for(let i=0;i<appList.size();i++){
434 var app=appList.get(i)
435 var appInfo={
436 appName:app.loadLabel(pm),
437 packageName:app.packageName,
438 isSystemApp:app.isSystemApp(),
439 firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
440 }
441 appInfoList.push(appInfo)
442 }
443 appInfoList.sort((a,b)=>{
444 return b.firstInstallTime-a.firstInstallTime
445 })
446 log('最新安装的app是=%j',appInfoList[0])
447 return appInfoList[0]
448
449
450 }
451 common.文件修改时间 = function (path) {
452 var time=new java.io.File(files.path(path)).lastModified();
453 return time
454 }
455 common.文件大小 = function (path) {
456 var size = new java.io.File(path).length()
457 return size
458 }
459 common.字符串变字节 = function (string) {
460 return new java.lang.String(string).getBytes();
461 }
462 common.日期加N天 = function (n) {
463 var now = new Date();
464 now.setDate(now.getDate()+n);
465 return (now);
466 }
467 common.md5 = function (string) {
468 return java.math.BigInteger(1,java.security.MessageDigest.getInstance("MD5")
469 .digest(java.lang.String(string).getBytes())).toString(16);
470 }
471 common.是横屏还是竖屏 = function () {
472 var a = (context.resources.configuration.orientation);
473 if (a === 1) {
474 toastLog("这是竖屏!!");
475 return '竖屏'
476 }
477
478 else {
479 toastLog("这是横屏!!");}
480 return '横屏'
481
482 }
483 common.截图 = function (path) {
484 var path=path || '/sdcard/1temp.png'
485
486 var dd = shell("screencap -p "+path,true)
487 var img
488 if(dd.code ==0){
489 img = images.read(path)
490 }else{
491 log("错误信息:")
492 log(dd.error)
493 }
494 return img
495
496
497 }
498 common.随机字符=function (n){
499 var n= n || 8
500 var str="";
501 for(var i=0;i<n;i++){
502 str+=String.fromCharCode(random(0,65535));
503 }
504 return str;
505 }
506
507 common.获取时间=function (time) {
508 if (time) {
509 return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time));
510 } else {
511 return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
512 }
513 }
514
515 common.调整手机音量=function (){
516
517 var am = context.getSystemService(context.AUDIO_SERVICE)
518 // STREAM_MUSIC这个自己试试,是调整那种音量,范围0-6 自己试试,我也不知道
519 var STREAM_MUSIC = 1
520 // 1 增大音量 -1 降低音量 0 不变
521 var ADJUST_RAISE = -1
522 // 1 显示调整音量界面 0 不显示界面
523 var FLAG_SHOW_UI = 1
524 am.adjustStreamVolume(STREAM_MUSIC, ADJUST_RAISE, FLAG_SHOW_UI)
525
526
527 //获取最大音量
528 var max = am.getStreamMaxVolume(STREAM_MUSIC);
529 log(max)
530 //获取当前音量
531 toastLog('最大音量'+max)
532 sleep(2000)
533 var current = am.getStreamVolume(STREAM_MUSIC);
534 log(current)
535 toastLog('当前音量'+current)
536
537 }
538
539 common.微信扫一扫=function (){
540 context.startActivity(app.intent({
541 action: "VIEW",
542 className:"com.tencent.mm.ui.LauncherUI",
543 packageName:"com.tencent.mm",
544 extras: {
545 "LauncherUI.From.Scaner.Shortcut": true
546 }
547 }).setFlags(335544320));
548 }
549 common.公共字符串=function (str1,str2){
550 // var str1 = "aaabbba"
551 // var str2 = " bbbcaaa"
552
553 function find(str1, str2) {
554 //创建存放重复内容的数组
555 var all = new Array();
556 //字符串转字符数组
557 var str_1 = str1.split("");
558 var str_2 = str2.split("");
559 for (var i = 0; i < str_1.length; i++) {
560 for (var l = 0; l < str_2.length; l++) {
561 //判断是否重复
562 var lo = all.length;
563 all[lo] = "";
564 //判断之后的字符串是否相同
565 for (var k = 0; str_1[i + k] == str_2[l + k]; k++) {
566 all[lo] = all[lo] + str_1[i + k];
567 //防止数组越界,提前停止循环
568 if (i + k == str_1.length-1||i+k==str_2.length-1) {
569 break;
570 }
571 }
572 }
573 }
574
575 var most = 0;
576 var fu = new Array();
577 for (var j = 0; j < all.length; j++) {
578 //去除空的内容
579 if (all[j] != "") {
580 //按照大小排序(删除部分小的)
581 if (all[j].split("").length >= most) {
582 most = all[j].split("").length;
583 fu[fu.length] = all[j];
584 }
585 }
586 }
587
588 //将不重复内容写到新数组
589 var wu=new Array();
590 for(var i=0;i<fu.length;i++){
591 var c=false;
592 for(var l=0;l<wu.length;l++){
593 if(fu[i]==wu[l]){
594 c=true;
595 }
596 }
597 if(!c){
598 wu[wu.length]=fu[i];
599 }
600 }
601
602 //将最长的内容写到新数组
603 var ml=new Array();
604 //获得最后一个字符串的长度(最长)
605 var longest=wu[wu.length-1].split("").length;
606 //长度等于最长的内容放到新数组
607 for(var i=wu.length-1;i>=0;i--){
608 if(wu[i].split("").length==longest){
609 ml[ml.length]=wu[i];
610 }else{
611 //提前结束循环
612 break;
613 }
614 }
615
616 return ml
617 }
618 var result=find(str1, str2)
619 log(result)
620 return result
621 }
622
623 common.网络=function (){
624 var intent = new Intent();
625 importClass(android.content.BroadcastReceiver);
626 importClass(android.content.ContextWrapper);
627 importClass(android.content.IntentFilter);
628 importClass(android.net.ConnectivityManager);
629 var filter = new IntentFilter();
630 filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
631 new ContextWrapper(context).registerReceiver(a = new BroadcastReceiver({
632 onReceive: function(context, intent) {
633 var action = intent.getAction();
634 if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
635 var mConnectivityManager = context.getSystemService(context.CONNECTIVITY_SERVICE);
636 netInfo = mConnectivityManager.getActiveNetworkInfo();
637 if (netInfo != null && netInfo.isAvailable()) {
638
639 /////////////网络连接
640 var name = netInfo.getTypeName();
641
642 if (netInfo.getType() == ConnectivityManager.TYPE_WIFI) {
643 /////WiFi网络
644 toastLog("WiFi网络");
645 return "WiFi网络"
646 } else if (netInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
647 /////有线网络
648 toastLog("有线网络");
649 return "有线网络"
650
651 } else if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
652 /////////3g网络
653 toastLog("3g网络");
654 return "3g网络"
655
656 }
657 } else {
658 ////////网络断开
659 toastLog("网络断开");
660 return "网络断开"
661
662 }
663 }
664
665 }
666 }), filter);
667
668 }
669
670 common.安卓intent源码=function (){
671 var intent = new Intent();
672 intent.setAction("android.settings.ACCESSIBILITY_SETTINGS");
673 //辅助功能
674 //intent.setAction("android.settings.ADD_ACCOUNT_SETTINGS");
675 //添加账户
676 //intent.setAction("android.settings.AIRPLANE_MODE_SETTINGS");
677 //系统设置首页
678 //intent.setAction("android.settings.APN_SETTINGS");
679 //APN设置
680 //intent.setAction("android.settings.APPLICATION_SETTINGS");
681 //应用管理
682 //intent.setAction("android.settings.BATTERY_SAVER_SETTINGS");
683 //节电助手
684 //intent.setAction("android.settings.BLUETOOTH_SETTINGS");
685 //蓝牙
686 //intent.setAction("android.settings.CAPTIONING_SETTINGS");
687 //字幕
688 //intent.setAction("android.settings.CAST_SETTINGS");
689 //无线显示
690 //intent.setAction("android.settings.DATA_ROAMING_SETTINGS");
691 //移动网络
692 //intent.setAction("android.settings.DATE_SETTINGS");
693 //日期和时间设置
694 //intent.setAction("android.settings.DEVICE_INFO_SETTINGS");
695 //关于手机
696 //intent.setAction("android.settings.DISPLAY_SETTINGS");
697 //显示设置
698 //intent.setAction("android.settings.DREAM_SETTINGS");
699 //互动屏保设置
700 //intent.setAction("android.settings.HARD_KEYBOARD_SETTINGS");
701 //实体键盘
702 //intent.setAction("android.settings.HOME_SETTINGS");
703 //应用权限,默认应用设置,特殊权限
704 //intent.setAction("android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS");
705 //忽略电池优化设置
706 //intent.setAction("android.settings.INPUT_METHOD_SETTINGS");
707 //可用虚拟键盘设置
708 //intent.setAction("android.settings.INPUT_METHOD_SUBTYPE_SETTINGS");
709 //安卓键盘语言设置(AOSP)
710 //intent.setAction("android.settings.INTERNAL_STORAGE_SETTINGS");
711 //内存和存储
712 //intent.setAction("android.settings.LOCALE_SETTINGS");
713 //语言偏好设置
714 //intent.setAction("android.settings.LOCATION_SOURCE_SETTINGS");
715 //定位服务设置
716 //intent.setAction("android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS");
717 //所有应用
718 //intent.setAction("android.settings.MANAGE_APPLICATIONS_SETTINGS");
719 //应用管理
720 //intent.setAction("android.settings.MANAGE_DEFAULT_APPS_SETTINGS");
721 //与ACTION_HOME_SETTINGS相同
722 //intent.setAction("android.settings.action.MANAGE_OVERLAY_PERMISSION");
723 //在其他应用上层显示,悬浮窗
724 //intent.setAction("android.settings.MANAGE_UNKNOWN_APP_SOURCES");
725 //安装未知应用 安卓8.0
726 //intent.setAction("android.settings.action.MANAGE_WRITE_SETTINGS");
727 //可修改系统设置 权限
728 //intent.setAction("android.settings.MEMORY_CARD_SETTINGS");
729 //内存与存储
730 //intent.setAction("android.settings.NETWORK_OPERATOR_SETTINGS");
731 //可用网络选择
732 //intent.setAction("android.settings.NFCSHARING_SETTINGS");
733 //NFC设置
734 //intent.setAction("android.settings.NFC_SETTINGS");
735 //网络中的 更多设置
736 //intent.setAction("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
737 //通知权限设置
738 //intent.setAction("android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS");
739 //勿扰权限设置
740 //intent.setAction("android.settings.ACTION_PRINT_SETTINGS");
741 //打印服务设置
742 //intent.setAction("android.settings.PRIVACY_SETTINGS");
743 //备份和重置
744 //intent.setAction("android.settings.SECURITY_SETTINGS");
745 //安全设置
746 //intent.setAction("android.settings.SHOW_REGULATORY_INFO");
747 //监管信息
748 //intent.setAction("android.settings.SOUND_SETTINGS");
749 //声音设置
750 //intent.setAction("android.settings.SYNC_SETTINGS");
751 //添加账户设置
752 //intent.setAction("android.settings.USAGE_ACCESS_SETTINGS");
753 //有权查看使用情况的应用
754 //intent.setAction("android.settings.USER_DICTIONARY_SETTINGS");
755 //个人词典
756 //intent.setAction("android.settings.VOICE_INPUT_SETTINGS");
757 //辅助应用和语音输入
758 //intent.setAction("android.settings.VPN_SETTINGS");
759 //VPN设置
760 //intent.setAction("android.settings.VR_LISTENER_SETTINGS");
761 //VR助手
762 //intent.setAction("android.settings.WEBVIEW_SETTINGS");
763 //选择webview
764 //intent.setAction("android.settings.WIFI_IP_SETTINGS");
765 //高级WLAN设置
766 //intent.setAction("android.settings.WIFI_SETTINGS");
767 //选择WIFI,连接WIFI
768 app.startActivity(intent);
769
770 }
771
772 common.获取手机ip地理位置=function (){
773 var ip地理位置 = false
774 var ip地理位置正则 = /本机IP: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}<\/span>([\s\S]*?)<\/td/
775 var ipUrl = "http://www.baidu.com/s?ie=UTF-8&wd=ip%E5%BD%92%E5%B1%9E%E5%9C%B0%E6%9F%A5%E8%AF%A2"
776 var r = http.get(ipUrl);
777 log("code = " + r.statusCode);
778 var htmlResult = r.body.string()
779 ip地理位置 = ip地理位置正则.exec(htmlResult)
780 if (ip地理位置) {
781 ip地理位置 = ip地理位置正则.exec(ip地理位置)
782 ip地理位置 = ip地理位置[1]
783 toastLog(ip地理位置)
784 return ip地理位置
785 } else {
786 log('没有查询到Ip地理位置,脚本停止')
787 return false
788 }
789
790 }
791
792 common.获取app图标=function (appName){
793 importClass(java.io.File);
794 importClass(java.io.FileOutputStream);
795 importClass(android.graphics.Bitmap);
796 var pm = context.getPackageManager();
797 importClass(android.util.DisplayMetrics)
798 var name = appName
799 var packageName = app.getPackageName(name);
800 var appInfo = pm.getApplicationInfo(packageName, 0);
801 var bmp = appInfo.loadIcon(pm).getBitmap();
802 files.create("/sdcard/"+name+".jpg");
803 var f = new File("/sdcard/"+name+"qq.jpg");
804 var fOut = new FileOutputStream(f);
805 bmp.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
806 fOut.flush();
807 fOut.close();
808
809 var img=images.read("sdcard/"+name+".jpg")
810 return img
811 // app.viewFile("sdcard/"+name+".jpg")
812 }
813
814 common.替换系统文件 = function (syspath,sdpath) {
815 // // var path = "/data/data/com.aaa.bbb"
816 // // var pathSD = "/sdcard/com.aaa.bbb"
817 // //删除原来的文件
818 // shell('chown root:root ' + path, true)
819 // shell('rm ' + path + " -rf", true);
820 // shell('rm ' + pathSD + " -rf", true);
821 // sleep(2000)
822
823 // // 解压备份的文件
824 // var inkeSdacrdPath = "/sdcard/com.aaa.bbb.zip"
825 // var 文件路径 = inkeSdacrdPath
826 // var 文件夹路径 = "/sdcard"
827 // com.stardust.io.Zip.unzip(new java.io.File(文件路径), new java.io.File(文件夹路径))
828 // sleep(2000)
829
830 // //移动解压后的文件
831 // shell("mv -f /sdcard/com.aaa.bbb /data/data/com.aaa.bbb", true);
832
833 // //修改权限
834 // shell("chmod -R 777 /data/data/com.aaa.bbb", true);
835
836 //------------------------------------------------
837 //------------------------------------------------
838 //------------------------------------------------
839 // var path = "/data/data/com.aaa.bbb"
840 // var pathSD = "/sdcard/com.aaa.bbb"
841 //删除原来的文件
842 shell('chown root:root ' + syspath, true)
843 shell('rm ' + path + " -rf", true);
844 sleep(2000)
845
846 //移动解压后的文件
847 shell("mv -f "+sdpath+" "+syspath, true);
848
849 //修改权限
850 shell("chmod -R 777 "+syspath, true);
851
852
853
854 }
855
856 common.编辑距离 = function (sm,sn){
857 var m=sm.length+1
858 var n=sn.length+1
859 var matrix = new Array();
860 for ( var i = 0; i < m; i++) {
861 matrix[i] = new Array();
862 for ( var j = 0; j < n; j++) {
863 matrix[i][j] = 0;
864 }
865 }
866 matrix[0][0]=0
867 for(let i=1;i<m;i++){
868 matrix[i][0] = matrix[i-1][0] + 1
869 }
870 for(let j=1;j<n;j++){
871 matrix[0][j] = matrix[0][j-1]+1
872 }
873 cost = 0
874 for(let i=1;i<m;i++){
875 for(let j=1;j<n;j++){
876 if(sm[i-1]==sn[j-1]){
877 cost = 0
878 }
879 else{
880 cost = 1
881 }
882 matrix[i][j]=Math.min(matrix[i-1][j]+1,matrix[i][j-1]+1,matrix[i-1][j-1]+cost)
883 }
884 }
885 return matrix[m-1][n-1]
886 // var mindist=minEditDist("126","456")
887 // print(mindist)
888 }
889 common.静默安装app = function (apk路径) {
890 shell("pm install -r " + apk路径 , true)
891 }
892
893
894
895 common.获取手机上所有的app名字 = function () {
896 var 所有的app名字=[]
897 var pm=context.getPackageManager()
898 let list=pm.getInstalledApplications(0)
899 for(let i=0;i<list.size();i++){
900 let p=list.get(i)
901 var app={
902 appName:p.loadLabel(pm),
903 packageName:p.packageName
904 }
905 所有的app名字.push(app.appName)
906 }
907 return 所有的app名字
908 }
909 common.数组交集=function(){
910
911 var 交集 = Array.intersect(arr1, arr2)
912 log(交集)
913 return 交集
914 }
915 common.控制app联网 = function (appName, 是否允许联网联网) {
916 var 是否允许联网联网 = 是否允许联网联网 || true
917 //作者: 家 QQ203118908
918
919
920 //本来打算用iptables-restore用文件形式更新防火墙规则,
921 //可是iptables-restore出现了bug,2013年就有人提过这个bug
922 //https://linux.debian.bugs.dist.narkive.com/J0hbJiR6/bug-710379-xtables-addons-common-quota2-module-iptables-save-creates-invalid-record
923 //又得改,坑爹
924
925 //马丹,iptables -D INPUT -lineNumber也有BUG,
926 //提示 index of deletion too big
927 //日了够了
928 //又得改,坑爹
929 // sudo iptables -D OUTPUT 1 -t nat
930 //
931 // uid=`cat /data/system/packages.list | grep com.sohu.inputmethod.sogou | busybox awk '{print $2}'`
932 // iptables -t filter -A OUTPUT -m owner --uid-owner=$uid -j DROP
933
934 // 以上是android iptables 屏蔽某个app网络访问的内容,
935
936 function 联网控制(appName) {
937 // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
938 // -A OUTPUT -m owner --uid-owner 10105 -j DROP
939 this.等待shell执行完毕的时间 = 0
940 this.防火墙规则路径 = '/sdcard/iptables.txt'
941 this.uid路径 = '/sdcard/' + appName + 'uidOwner.txt'
942 this.appName = appName
943 this.packageName = getPackageName(this.appName)
944 this.执行shell = (cmd) => {
945 var result = shell(cmd, true);
946 console.show();
947 log(result);
948 if (result.code == 0) {
949 toastLog("执行成功");
950 } else {
951 toastLog("执行失败!请到控制台查看错误信息");
952 }
953 sleep(this.等待shell执行完毕的时间)
954 }
955 this.uid = () => {
956 var cmd = 'cat /data/system/packages.list | grep ' + this.packageName + ' > ' + this.uid路径
957 log('cmd=', cmd)
958 this.执行shell(cmd)
959 // cat /data/system/packages.list | grep com.tencent.mobileqq > /sdcard/QQuidOwner.txt
960 var 包含uid的文本 = files.read('/sdcard/' + appName + 'uidOwner.txt')
961 log('包含uid的文本=', 包含uid的文本)
962 var uidReg = new RegExp(this.packageName + '\\s*(\\d+)')
963 log('uidReg=', uidReg)
964 var uid = 包含uid的文本.match(uidReg)[1]
965 log(uid)
966 return uid
967 }
968 this.允许联网规则 = 'iptables -t filter -A OUTPUT -m owner --uid-owner ' + this.uid() + ' -j ACCEPT'
969 this.禁止联网规则 = 'iptables -t filter -A OUTPUT -m owner --uid-owner ' + this.uid() + ' -j DROP'
970 this.允许 = () => {
971 this.清空该app的防火墙规则()
972 this.将防火墙规则写入系统(this.允许联网规则)
973 }
974 this.禁止 = () => {
975 this.清空该app的防火墙规则()
976 this.将防火墙规则写入系统(this.禁止联网规则)
977 }
978
979 this.将防火墙规则写入系统 = (防火墙规则) => {
980 var cmd = 防火墙规则
981 this.执行shell(cmd)
982 }
983 this.导出防火墙规则 = () => {
984 var cmd = 'iptables-save > ' + this.防火墙规则路径
985 this.执行shell(cmd)
986 }
987 this.防火墙规则 = () => {
988 this.导出防火墙规则()
989 var 防火墙规则 = files.read(this.防火墙规则路径)
990 log('防火墙规则=', 防火墙规则)
991 return 防火墙规则
992 }
993 this.清空该app的防火墙规则 = () => {
994 var 防火墙规则 = this.防火墙规则()
995 // stringObject.replace(regexp/substr,replacement)
996 // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
997 // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
998 // -A OUTPUT -m owner --uid-owner 10105 -j DROP
999 // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
1000 // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
1001 // 删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):
1002 // [root@test ~]# iptables -D INPUT -s 192.168.1.5 -j DROP
1003 // iptables -t filter -A OUTPUT -m owner --uid-owner=$uid -j DROP
1004 var 要删除的规则reg = new RegExp('-A (OUT|IN)PUT -m owner --uid-owner ' + this.uid() + ' -j (ACCEPT|DROP)', 'g')
1005 // 要删除的规则reg= /-A OUTPUT -m owner --uid-owner 10105 -j (ACCEPT|DROP)/
1006 // -A OUTPUT -m owner --uid-owner 10105 -j (ACCEPT|DROP)
1007 // iptables -D OUTPUT -m owner --uid-owner 10105 -j ACCEPT
1008 log('要删除的规则reg=', 要删除的规则reg)
1009 var new防火墙规则 = 防火墙规则.match(要删除的规则reg, '')
1010 log('new防火墙规则=', new防火墙规则)
1011 // new防火墙规则= [
1012 // '-A OUTPUT -m owner --uid-owner 10105 -j ACCEPT',
1013 // '-A OUTPUT -m owner --uid-owner 10105 -j DROP'
1014 // ]
1015 if (new防火墙规则) {
1016 for (let i = 0; i < new防火墙规则.length; i++) {
1017 var 规则 = new防火墙规则[i]
1018 规则 = 规则.replace('-A', '-D')
1019 var cmd = 'iptables ' + 规则
1020 this.执行shell(cmd)
1021 }
1022 }
1023 log('清空了指定app的防火墙规则')
1024 }
1025 }
1026 // var appName = 'QQ'
1027 // var appName = '哔哩哔哩'
1028 var appName = '微信'
1029 var app联网控制 = new 联网控制(appName)
1030 if (是否允许联网联网) {
1031 app联网控制.允许()
1032 } else {
1033 app联网控制.禁止()
1034 }
1035
1036
1037 }
1038 common.提取包含关键字的app = function (app关键字) {
1039 importClass(android.content.pm.PackageManager)
1040 var uc应用 = []
1041 var ucapp = {}
1042 pm = context.getPackageManager();
1043 var 有的 = pm.getInstalledPackages(PackageManager.GET_SHARED_LIBRARY_FILES)
1044 有的 = pm.getInstalledPackages(PackageManager.GET_META_DATA)
1045 有的 = 有的 + ""
1046 有的 = 有的.replace(/PackageInfo[^ ]+ /g, "")
1047 有的 = 有的.replace(/[\}|\[|\]| ]/g, "")
1048 有的 = 有的.split(",")
1049 for (let i of 有的) {
1050 var packageInfo = pm.getPackageInfo(i, 0);
1051 var appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString()
1052 //appName = app.getAppName(i)
1053 if (appName.match(app关键字)) {
1054 // log(appName)
1055 // log("包名:" + i)
1056 ucapp = {
1057 "包名": i,
1058 "名称": appName
1059 }
1060 uc应用.push(ucapp)
1061 }
1062 }
1063 return uc应用
1064 }
1065 common.卸载app没root = function (appName) {
1066 var packageName=getPackageName(appName);
1067 app.uninstall(packageName);
1068
1069
1070 }
1071
1072 common.获取页面所有文字 = function (setting) {
1073 var setting = setting || {}
1074 var defaultSetting = {
1075 getText: true,
1076 getDesc: true,
1077 getId: false,
1078 removeRepetitiveElements: true
1079 }
1080 Object.assign(defaultSetting, setting);
1081 log(defaultSetting)
1082 var allStr = []
1083 var getDescAndTextAndIdOfNode = function (node) {
1084 if (node) {
1085 if (defaultSetting.getText) {
1086 var text = node.text()
1087 if (!!text) {
1088 allStr.push(text)
1089 }
1090 }
1091 if (defaultSetting.getDesc) {
1092 var desc = node.desc()
1093 if (!!desc) {
1094 allStr.push(desc)
1095 }
1096 }
1097 if (defaultSetting.getId) {
1098 var id = node.id()
1099 if (!!id) {
1100 allStr.push(id)
1101 }
1102 }
1103 }
1104 for (let i = 0; i < node.childCount(); i++) {
1105 getDescAndTextAndIdOfNode(node.child(i));
1106 }
1107 }
1108 var getFrameLayoutNode = function () {
1109 return className('FrameLayout').findOne(2000)
1110 }
1111 getDescAndTextAndIdOfNode(getFrameLayoutNode())
1112
1113 function removeRepetitiveElements(arr) {
1114 var obj = {}
1115 for (let i = 0; i < arr.length; i++) {
1116 if (obj.hasOwnProperty(arr[i])) {} else {
1117 obj[arr[i]] = true
1118 }
1119 }
1120 return Object.keys(obj)
1121 }
1122 if (defaultSetting.removeRepetitiveElements) {
1123 allStr = removeRepetitiveElements(allStr)
1124 }
1125 return allStr
1126 }
1127
1128 common.悬浮控制 = function (window, windowid, ar) {
1129 this.Orientation = context.resources.configuration.orientation;
1130 this.Width = this.Orientation == 1 ? device.width : device.height;
1131 this.Height = this.Orientation == 2 ? device.width : device.height;
1132 this.Click = function () {};
1133 this.Move = function () {};
1134 this.LongClick = function () {};
1135 this.setClick = (fun) => {
1136 fun = fun || function () {};
1137 this.Click = fun;
1138 };
1139 this.setMove = (fun) => {
1140 fun = fun || function () {};
1141 this.Move = fun;
1142 };
1143 this.setLongClick = (fun, ji) => {
1144 fun = fun || function () {};
1145 this.LongClick = fun;
1146 if (parseInt(ji)) {
1147 this.Tjitime = parseInt(ji) / 50;
1148 };
1149 };
1150 setInterval(() => {
1151 if (context.resources.configuration.orientation != this.Orientation) {
1152 this.Orientation = context.resources.configuration.orientation;
1153 this.Width = this.Orientation == 1 ? device.width : device.height;
1154 this.Height = this.Orientation == 2 ? device.width : device.height;
1155 var xy = this.windowGXY(window.getX(), window.getY(), this.G(window));
1156 this.windowyidong([
1157 [window.getX(), window.getY()],
1158 [xy.x, xy.y]
1159 ]);
1160 };
1161 }, 100);
1162 this.TX = 0;
1163 this.TY = 0;
1164 this.Tx = 0;
1165 this.Ty = 0;
1166 this.Tyidong = false;
1167 this.Tkeep = false;
1168 this.Tjitime = 12;
1169 this.Ttime = 0;
1170 setInterval(() => {
1171 if (this.Tkeep) {
1172 this.Ttime++;
1173 if (!this.Tyidong && this.Ttime > this.Tjitime) {
1174 //非移动且按下时长超过1秒判断为长按
1175 this.Tkeep = false;
1176 this.Ttime = 0;
1177 this.LongClick();
1178 };
1179 };
1180 }, 50);
1181 if (windowid) {
1182 windowid.setOnTouchListener(new android.view.View.OnTouchListener((view, event) => {
1183 this.Move(view, event);
1184 switch (event.getAction()) {
1185 case event.ACTION_DOWN:
1186 this.Tx = event.getRawX();
1187 this.Ty = event.getRawY();
1188 this.TX = window.getX();
1189 this.TY = window.getY();
1190 this.Tkeep = true; //按下,开启计时
1191 break;
1192 case event.ACTION_MOVE:
1193 var sx = event.getRawX() - this.Tx;
1194 var sy = event.getRawY() - this.Ty;
1195 if (!this.Tyidong && this.Tkeep && this.weiyi(sx, sy) >= 10) {
1196 this.Tyidong = true;
1197 };
1198 if (this.Tyidong && this.Tkeep) {
1199 window.setPosition(this.TX + sx, this.TY + sy);
1200 };
1201 break;
1202 case event.ACTION_UP:
1203 if (!this.Tyidong && this.Tkeep && this.Ttime < 7) {
1204 this.Click();
1205 };
1206 this.Tkeep = false;
1207 this.Ttime = 0;
1208 if (this.Tyidong) {
1209 var A = this.windowGXY(window.getX(), window.getY(), this.G(window));
1210 threads.start(new java.lang.Runnable(() => {
1211 this.windowyidong([
1212 [window.getX(), window.getY()],
1213 [A.x, A.y]
1214 ]);
1215 }));
1216 this.Tyidong = false;
1217 };
1218 break;
1219 };
1220 return true;
1221 }));
1222 };
1223 this.G = (win) => {
1224 var K = 35, //悬浮窗的隐形边矩
1225 H = 66; //手机通知栏的高度
1226 if (!ar) {
1227 return [
1228 [-K, -K],
1229 [this.Width - win.getWidth() + K, this.Height - win.getHeight() - H + K]
1230 ];
1231 } else {
1232 return [
1233 [0, H],
1234 [this.Width - win.getWidth(), this.Height - win.getHeight()]
1235 ];
1236 };
1237 };
1238 this.weiyi = function () { //平方和开方
1239 var num = 0;
1240 for (var i = 0; i < arguments.length; i++) {
1241 num += arguments[i] * arguments[i];
1242 };
1243 return Math.round(Math.sqrt(num) * 1000) / 1000
1244 };
1245 this.windowGXY = function (x, y, k) {
1246 x = (k[0][0] < x && x < k[1][0]) ? x : (k[0][0] < x ? k[1][0] : k[0][0]);
1247 y = (k[0][1] < y && y < k[1][1]) ? y : (k[0][1] < y ? k[1][1] : k[0][1]);
1248 return {
1249 x: x,
1250 y: y
1251 };
1252 };
1253 this.windowyidong = (A, s, w) => {
1254 w = w || window;
1255 s = s || 10;
1256 var sx = A[1][0] - A[0][0],
1257 sy = A[1][1] - A[0][1];
1258 var sd = this.weiyi(sx, sy) / s;
1259 var X = sx / sd,
1260 Y = sy / sd;
1261 var x = 0,
1262 y = 0;
1263 for (var i = 0; i < sd; i++) {
1264 x += X;
1265 y += Y;
1266 sleep(1);
1267 w.setPosition(A[0][0] + x, A[0][1] + y);
1268 };
1269 w.setPosition(A[1][0], A[1][1]);
1270 };
1271 this.OutScreen = () => {
1272 var F = this.G(window);
1273 var x = window.getX(),
1274 y = window.getY();
1275 var sx = window.getX() + window.getWidth() / 2,
1276 sy = window.getY() + window.getHeight() / 2 + 66;
1277 var cx = Math.abs(sx < (this.Width - sx) ? sx : (this.Width - sx)) < Math.abs(sy < (this.Height - sy) ? sy : (this.Height - sy)) ? (sx < this.Width / 2 ? (F[0][0] - window.getWidth()) : (F[1][0] + window.getWidth())) : x,
1278 cy = Math.abs(sx < (this.Width - sx) ? sx : (this.Width - sx)) < Math.abs(sy < (this.Height - sy) ? sy : (this.Height - sy)) ? y : (sy < this.Height / 2 ? (F[0][1] - window.getHeight()) : (F[1][1] + window.getHeight()));
1279 return [
1280 [x, y],
1281 [cx, cy]
1282 ];
1283 };
1284 this.toScreenEdge = (d) => {
1285 d = d || 0;
1286 var F = this.G(window);
1287 var x = window.getX(),
1288 y = window.getY();
1289 var sw = window.getWidth() * d;
1290 var sx = window.getX() + window.getWidth() / 2,
1291 sy = window.getY() + window.getHeight() / 2 + 66;
1292 var cx = sx < (this.Width - sx) ? -sw : (this.Width + sw - window.getWidth());
1293 return [
1294 [x, y],
1295 [cx, y]
1296 ];
1297 };
1298 this.centerXY = (F) => {
1299 var w = window.getWidth();
1300 var h = window.getHeight();
1301 return [
1302 [F[0] + w / 2, F[1] + h / 2],
1303 [F[0] - w / 2, F[1] - h / 2]
1304 ];
1305 };
1306 this.autoIntScreen = () => {
1307 var A = this.windowGXY(window.getX(), window.getY(), this.G(window));
1308 threads.start(new java.lang.Runnable(() => {
1309 this.windowyidong([
1310 [window.getX(), window.getY()],
1311 [A.x, A.y]
1312 ]);
1313 }));
1314 };
1315 this.autoIntScreen();
1316 };
1317
1318
1319 common.闪光弹 = function (content, x, y, color, t) {
1320
1321
1322
1323
1324 var single = (function () {
1325 var unique;
1326
1327 function getInstance() {
1328 if (unique === undefined) {
1329 unique = new Flash();
1330 }
1331 return unique;
1332 }
1333 return {
1334 getInstance: getInstance
1335 }
1336 })();
1337
1338 function Flash() {}
1339 Flash.prototype.update = function (content, x, y, color, t) {
1340 this.content = content || '未传入参数'
1341 this.x = x || random(100, 300)
1342 this.y = y || random(100, 900)
1343 this.color = color || -2278181
1344 this.t = t || 2000
1345 }
1346 Flash.prototype.show = function () {
1347 var window = floaty.rawWindow( <card cardBackgroundColor = "#aa00FF00"
1348 cardCornerRadius = "18dp" >
1349 <text id = "text"
1350 size = "30dp"
1351 layout_width = "wrap_content"
1352 layout_height = "wrap_content"
1353 layout_gravity = "center"
1354 gravity = "center"
1355 paddingLeft = "10"
1356 paddingRight = "10"
1357 paddingTop = "10"
1358 paddingBottom = "10" > 123 </text> </card>
1359 );
1360 window.text.setText(this.content);
1361 window.text.setBackgroundColor(this.color);
1362 window.setPosition(this.x, this.y);
1363 setTimeout(() => {
1364 window.close();
1365 }, this.t);
1366 }
1367
1368 function flash(content, x, y, color, t) {
1369 var content = content.toString()
1370 var f = single.getInstance()
1371 f.update(content, x, y, color, t)
1372 f.show()
1373 }
1374 var color = color || colors.rgb(random(0, 255), random(0, 255), random(0, 255))
1375 flash(content, x, y, color, t);
1376 // flash('hello world')
1377 // flash('Are you ok?')
1378 // flash('我很好')
1379 // flash('you are beautiful')
1380
1381
1382
1383
1384 }
1385 common.打开开发者选项 = function () {
1386 app.startActivity({
1387 action: "android.intent.action.VIEW", //此处可为其他值
1388 packageName: "com.android.settings",
1389 className: "com.android.settings.Settings$DevelopmentSettingsActivity"
1390 //此处可以加入其他内容,如data、extras
1391 });
1392 }
1393
1394
1395 common.气泡 = function (msg, x, y) {
1396 function toastAt0(msg, x, y) {
1397 importClass(android.widget.Toast);
1398 importClass(android.view.Gravity);
1399 var toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
1400 toast.setGravity(Gravity.TOP | Gravity.LEFT, x, y);
1401 toast.show();
1402 }
1403 var x = x || device.width / 3
1404 var y = y || device.height / 5 * 4
1405 var msg = msg.toString()
1406 ui.run(() => toastAt0(msg, x, y));
1407 sleep(2000)
1408
1409 // toastAt('sdfsfdsdfs',300,300)
1410
1411
1412
1413
1414 }
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427 common.随机字符串 = function (PassLength) {
1428 var PassLength = PassLength || 8
1429 var str = 'abcdefghijklmnopqrstuvwxyz';
1430 var STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
1431 var num = '0123456789';
1432 var sym = '+=-@#~,.[]()!%^*$';
1433 var text = str.split('').concat(STR.split(''))
1434 var pw = '';
1435 for (i = 0; i < PassLength; i++) {
1436 var strpos = random(0, text.length - 1);
1437 pw += text[strpos].charAt(random(0, text[strpos].length - 1));
1438 }
1439 return pw;
1440 }
1441
1442 common.wifi状态 = function () {
1443
1444 importPackage(android.content);
1445 let wifiManager = context.getSystemService(Context.WIFI_SERVICE);
1446 if (wifiManager.isWifiEnabled()) {
1447 log('wifi is opend')
1448 return 'open'
1449 } else {
1450 log('wifi is closed')
1451 return 'close'
1452 }
1453
1454
1455 }
1456
1457
1458 common.开关飞行模式 = function (开关) {
1459 // 0 关闭 1开启 默认开启飞行模式
1460 var 开关 = 开关 || 1
1461
1462 function 打开飞行模式() {
1463 // 打开飞行模式
1464 new Shell().exec("su -c 'settings put global airplane_mode_on 1; am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true'")
1465 }
1466
1467 function 关闭飞行模式() {
1468 //关闭飞行模式
1469 new Shell().exec("su -c 'settings put global airplane_mode_on 0; am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false'")
1470 }
1471 if (开关 == 1) {
1472 打开飞行模式()
1473 } else {
1474 关闭飞行模式()
1475 }
1476
1477 }
1478
1479 common.上滑 = function () {
1480 var randomP = random(500, 600);
1481 var points = [randomP];
1482 var interval = 0.1;
1483 var x0 = random(780, 900);
1484 var y0 = random(1500, 1600);
1485 var a = 240;
1486 for (var t = 0; t < Math.PI / 2; t += interval) {
1487 var x = x0 - a * (1.8 * Math.cos(t * 0.9) - Math.cos(2 * t * 0.9));
1488 var y = y0 - a * (5 * Math.sin(t * 0.9) - Math.sin(2 * t * 0.9));
1489 points.push([parseInt(x), parseInt(y)]);
1490 }
1491 gesture.apply(null, points);
1492 sleep(1500);
1493 }
1494
1495 common.获取deflate网页内容 = function (url) {
1496 importClass('java.io.BufferedReader');
1497 importClass('java.io.InputStreamReader');
1498 importClass("java.util.zip.InflaterInputStream")
1499 importClass('java.io.ByteArrayInputStream');
1500 importClass("java.util.zip.Inflater")
1501
1502 var res = http.get(url)
1503 log("statusCode = " + res.statusCode);
1504 var deflateFileContent = res.body.bytes()
1505 var 网页内容 = null;
1506 if (deflateFileContent) {
1507 var br = new BufferedReader(new InputStreamReader(new InflaterInputStream(new ByteArrayInputStream(deflateFileContent), new Inflater(true))));
1508 var lns = [],
1509 cl;
1510 while (cl = br.readLine()) lns.push(cl);
1511 网页内容 = lns.join("\n")
1512 // log('网页内容')
1513 // log(网页内容)
1514 return 网页内容
1515 } else {
1516 console.error('下载失败')
1517 exit()
1518 }
1519 return false
1520 }
1521
1522 common.获取gzip网页内容 = function (url) {
1523 function 保存zip文件(zipFile) {
1524 var path = files.join(files.cwd(), "1下载bilibili弹幕专用/webPage.gzip.js")
1525 files.createWithDirs(path)
1526 log("path=", path)
1527 // path= /storage/emulated/0/脚本/zip文件专用/test.zip
1528 files.writeBytes(path, zipFile)
1529 var r = 解压zip文件(path)
1530 log(r)
1531 return r
1532 }
1533
1534 function 解压zip文件(文件路径) {
1535 //同一目录下的同一文件名
1536 // unzipGzipFile(sourceGzipFilePath, targetPath)
1537 var fileName = files.getName(文件路径)
1538 var 解压后的文件路径 = 文件路径.replace(fileName, 'webPage.js')
1539 log('解压的解压后的文件路径=', 解压后的文件路径)
1540 files.createWithDirs(解压后的文件路径)
1541 // com.stardust.io.Zip.unzip(new java.io.File(文件路径), new java.io.File(解压后的文件路径))
1542 var sourceGzipFilePath = 文件路径
1543 var targetPath = 解压后的文件路径
1544 unzipGzipFile(sourceGzipFilePath, targetPath)
1545 return targetPath
1546 }
1547
1548 function unzipGzipFile(sourceGzipFilePath, targetPath) {
1549 importClass(java.io.FileInputStream);
1550 importClass(java.util.zip.GZIPInputStream);
1551 importClass('java.io.FileOutputStream');
1552
1553 var sourceGzipFilePath = sourceGzipFilePath || '/sdcard/tempSourceGzipFilePath.js'
1554 var targetPath = targetPath || '/sdcard/tempTargetPath.js'
1555 log('sourceGzipFilePath')
1556 log(sourceGzipFilePath)
1557 log('targetPath')
1558 log(targetPath)
1559 var sChunk = 8192;
1560 var gzipFileInputStream = new FileInputStream(sourceGzipFilePath);
1561 var zipin = new GZIPInputStream(gzipFileInputStream);
1562 var buffer = util.java.array('byte', sChunk)
1563 var out = new FileOutputStream(targetPath);
1564 var length;
1565 while ((length = zipin.read(buffer, 0, sChunk)) != -1)
1566 out.write(buffer, 0, length);
1567 out.close();
1568 zipin.close();
1569 }
1570 var res = http.get(url)
1571 log("statusCode = " + res.statusCode);
1572 var gzipFileContent = res.body.bytes()
1573 var 网页内容 = null;
1574 if (gzipFileContent) {
1575 var 网页保存路径 = 保存zip文件(gzipFileContent)
1576 网页内容 = files.read(网页保存路径)
1577 // log('网页内容')
1578 // log(网页内容)
1579 return 网页内容
1580 } else {
1581 console.error('下载失败')
1582 exit()
1583 }
1584 return false
1585 }
1586
1587
1588 // var r=common
1589 // log(r)
1590 // var arr=[]
1591 // for(var k in common){
1592 // arr.push(k)
1593 // }
1594 // log(arr)
1595
1596
1597 module.exports = common
说明
本文转自https://blog.csdn.net/feiyunjs/article/details/94722766
本文提供的代码仅供参考。
可能有些地方在最新版本的Auto.js上面需要做修改,才能运行。
Auto.js简介
Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作。
与“按键精灵”不同的是,它的模拟动作并不是简单的使用在界面定坐标点来实现,而是类似与win一般,找窗口句柄来实现的。
Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。
开发文档
Auto.js Pro开发文档优化版
文档尚在完善中,可能有文档描述和代码实际行为有出入的情况。
模板、样式、generator来自Node.js。
吸引我使用Auto.js Pro的原因有很多。最主要的几个原因是:
- Auto.js Pro能开发免ROOT的安卓脚本
- Auto.js Pro基于节点操作,能开发全分辨率的脚本,自动适配各种安卓机型
- Auto.js Pro丰富的UI组件,能自定义各种样式的安卓界面
- Auto.js Pro使用的javascript的语法比较优雅,代码可读性强
- Auto.js Pro的命令库非常的丰富,接口比较多
- Auto.js Pro脚本文件体积比较小。1000行的代码,打包后的apk文件只有3-5M,还没有广告
- 相关教程
——————
autojs 全套
https://github.com/search?o=desc&p=2&q=%E9%92%89%E9%92%89&s=updated&type=Repositories
https://github.com/search?o=desc&q=%E9%92%89%E9%92%89&s=updated&type=Repositories
https://github.com/Serverless-Book-Anycodes/Github-Issue-Robot
https://github.com/georgehuan1994/DingDing-Automatic-Clock-in

浙公网安备 33010602011771号