dynamic 365 js 失去焦点_基于Auto.js的QQ好友动态秒赞系统
0.腦筋急轉彎
請問在什么情況下
log(10) == 10
log(20) == 20
? ? ????????????????????????左滑查看答案????????????????????????????????????????????????console.log(10) 是 10
????????????????????????????????????????????????????????????????????????????????????????????????console.log(20) 是 20
1.工具選擇
上次的螞蟻森林能量收取項目中,我們使用了adb對手機進行操作,從而根據計算機的計算結果對能量球位置進行點擊。
adb的全稱是Android Debug Bridge,即安卓調試工具,在連接安卓設備之后可以查看其設備信息,模擬點擊觸控等操作。但是其缺點是,需要連接PC設備執行操作命令,且需要打開USB調試功能,根據華為安全中心的提示,打開USB調試功能可能使手機出于風險之中。
所以我們應當謀求一種,可以在安卓設備上獨立運行,不需要USB調試功能或者Root權限,操作簡單、用戶體驗良好的操控腳本。實際上早在上次螞蟻森林能量收取項目中,我們就注意到了Auto.js這種工具,只不過上次的能量收取是當娛樂節目來做的,為了節目效果,采取了一種南轅北轍的方法。
2.Auto.js簡介
顧名思義,Auto.js使用JavaScript作為腳本語言,目前使用Rhino 1.7.7.2作為腳本引擎,支持ES5與部分ES6特性。
一切可以用JavaScript實現的,都將用JavaScript實現。使用auto.js不但可以在安卓設備上獨立運行腳本,且幾乎不需要USB調試和ROOT權限,只需要打開手機上的無障礙服務。
3.安裝
auto.js支持我們為所寫腳本設計用戶界面,甚至可以將界面和腳本內容打包成apk。然而,打包為apk后,會失去腳本語言的靈活性。
因此我們可以下載安裝一個auto.js.apk,相當于一個運行平臺,然后在上面運行我們臨時編寫的腳本。
這個安裝包在江湖上幾近失傳,大家可以從我的網盤上下載。
鏈接:https://pan.baidu.com/s/1S7CL9-ZolyntDr-bOEaWnQ提取碼:pj9n
安裝好了之后,可以看到,這無非就是一個app。在腳本菜單下,我們可以編寫自己的臨時腳本,并進行運行。此外附贈了一個懸浮球,這個懸浮球其實非常有用!他可以懸浮于其他應用之上,方便在其他應用上運行腳本,還可以分析其他應用的視圖結構。
如上圖,我們可以利用懸浮球提供的功能觀察微信的界面視圖結構,并查看具體控件的信息。
4.基本的auto.js控制命令
auto.js的功能其實十分強大,包括一些http操作、用戶界面設計。但我們目前比較關心的是如何通過它對手機進行操控。
auto.js提供基于位置和基于控件兩種控制方式。
1)基于控件的控制方式
這種方式非常像JavaScript的DOM操作。首先用一個類似于選擇器的方法選中想要操作的控件,再執行相應的如單擊、長按、輸入等操作。
譬如我們想要點擊這個查詢按鈕,我們查看該控件發現,其id被指定為了iq,因此可以通過id鎖定這個控件。可以通過下述代碼實現。
iq.parent().click();
其中id()方法即上述的選擇器,用于選中id為iq的控件(元素)。此外還有className() 類名選擇器、desc() 文本描述選擇器等等。
選擇器選中后,可能會有多個控件被選中,這里我們可以執行findOne()方法取回其中一個(注意這里取得的不一定是從上往下看的第一個,其取法遵循DFS的原則),也可以執行find() 方法,取回所有控件。
同時我們注意到,上述分析控件時,iq的clickable屬性值為false,這說明這個控件是不可點擊的。而真正可點擊的是該控件外層的第一個父元素。因此我們通過parent()方法可以獲取當前控件的父元素,再執行click方法即可實現點擊。
值得注意的是,這里id(),className(),desc()等,都是auto.js定義好的全局函數。定義全局函數往往不是個良好的編程習慣,但在這一特殊的情境下,這些全局函數選擇器還是非常好用的。
2)基于位置的控制
基于控件的控制當然最好不過,可遷移性也很出色。但事情往往不盡人意。
對于一些游戲的界面,其布局往往是非常神奇的,展現給我們的只有一個FrameLayout,但里面卻包含了許多東西。我們并沒有安卓游戲的開發經驗,只能猜測這張FrameLayout大致相當于HTML5中的畫布,其中可能包含許多更微觀的元素,但整體作為一個元素表現出來。這時空間分析的方法就會失效,我們不得不獲取截圖進行分析,計算出點擊位置再通過基于位置的方法進行觸控操作。
下面舉兩個基本的基于位置控制的例子
//點擊坐標為(x,y)的位置click(x,y);
//從坐標(x1,y1)滑動到(x2,y2),耗時durationhaomiao
swipe(x1,y1,x2,y2,duration);
3)兩種方法比較
| 場景 | 一般APP | 游戲等APP |
| 優點 | 遷移性好,分辨率無關 | 可以基于當前截圖分析 |
| 缺點 | 一些特定場景無法分析控件 | 可能需要考慮分辨率 |
5.QQ空間秒贊實現
實現秒贊的思路并不復雜,可以通過下面的偽代碼實現
while True:刷新動態
找到第一個點贊按鈕
if 該點贊按鈕未被點贊:
點擊該按鈕
我們再來分析一下好友動態頁面的結構
QQ的見鬼之處就在于,其幾乎所有的控件id都是name。這時我們可以通過className和desc兩個屬性來鎖定點贊按鈕。
className("ImageView").desc("點贊")但是由于一些原因,當頁面上同時有兩個以上點贊按鈕時,findOne()方法并不總能找到我們想要的第一個按鈕。因此真實的代碼應當如下
//獲取用于刷新動態的點擊區域var dynamic = className("TextView").text("好友動態").findOne().parent().parent();
//開始刷新點贊循環
while(true){
dynamic.click();
//由于上財網速較慢(要多慢有多慢,慢的令人發指……省略三千字)
//此處休息兩秒等待動態刷新。
sleep(2000);
//向下滑動一段距離,防止當前頁面上沒有點贊按鈕
swipe(200,800,200,200,50);
//選擇頁面上所有的點贊按鈕
var love = className("ImageView").desc("點贊").find();
//對每一個沒有點贊的按鈕進行點擊
for(var i = 0; i < love.length; i++){
if(!love[i].selected()){
love[i].click();
}
}
}
6.效果圖
7.總結
通過安卓腳本的方式,點贊速度的極限可以無限逼近于上財校園網提供的最短刷新時間。
近年來,微信QQ等都推出了python等語言的包,可以實現消息發送等功能,通過這種方法或許能更快的實現點贊等功能。
8.鳴謝
特別感謝何老師每天發各種有趣的QQ動態。
總結
以上是生活随笔為你收集整理的dynamic 365 js 失去焦点_基于Auto.js的QQ好友动态秒赞系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android属性动画缩放和平移同时,A
- 下一篇: pandas 第一行_用Excel表格带