如何用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

