hello,大家好嗡髓,我是帥氣的超級(jí)飯飯團(tuán)操漠,最近剛和大舅子約了個(gè)晚飯,飯桌上大舅子第一句話便是:
聽說你是程序員饿这?可以幫我寫個(gè)自動(dòng)化腳本嗎浊伙?
我發(fā)現(xiàn)外行人都覺得程序員是萬(wàn)能的啊,但是其實(shí)我們都只是會(huì)ctrl c + ctrl v而已
不過长捧,大舅子提需求了嚣鄙,能認(rèn)慫嗎?
當(dāng)然不能啊串结,必須做啊
雖然我連自動(dòng)化腳本怎么做哑子、用什么語(yǔ)言都不知道,但是肌割,為了妹子卧蜓,不能慫啊
我喝了一兩白酒,壯了壯膽子把敞,和大舅子討論了下需求
酒過三巡菜過五味烦却,最后終于將需求定了下來了
大概是這樣的:
- 自動(dòng)登錄某app
- 自動(dòng)搜索指定寶貝
- 自動(dòng)評(píng)論留言
- 自定義搜索關(guān)鍵詞、自定義留言個(gè)數(shù)
總結(jié)下來就是根據(jù)關(guān)鍵詞自動(dòng)評(píng)論先巴,然后還要提供一個(gè)UI操作
確定了需求了其爵,加上白紅啤懟了幾杯后,我反問大舅子那你妹就是我的了吧
大舅子說:需求搞出來伸蚯,她就是你的了
為了妹子摩渺,必須拼啊,當(dāng)晚開始奮斗
先是搜索相關(guān)技術(shù)剂邮,然后開始查漏補(bǔ)缺摇幻,最后便是開始實(shí)現(xiàn)
給大家看看需要的技術(shù):
- autojs,自動(dòng)化腳本引擎
- 一點(diǎn)js編程意識(shí)挥萌,實(shí)現(xiàn)語(yǔ)言用的就是js
- 一點(diǎn)安卓意識(shí)绰姻,畢竟自動(dòng)化腳本針對(duì)的對(duì)象就是安卓手機(jī)了
最后給大家看看我奮筆疾書一整晚的效果,動(dòng)畫效果:
圖片效果:
大概分為幾步:
第一步引瀑,UI界面的設(shè)計(jì)
ui.layout(
<vertical>
<text textSize="18sp" textColor="#000000" margin="20" textStyle="bold">
閑魚自動(dòng)評(píng)論
</text>
<ScrollView>
<vertical>
<text textSize="16sp" margin="8">1.寶貝標(biāo)簽</text>
<input w="*" text="衛(wèi)衣" id="target" margin="0 16" />
<text textSize="16sp" margin="8">2. 評(píng)論內(nèi)容</text>
<input w="*" text="你好" id="comment" margin="0 16" />
<text textSize="16sp" margin="8">3. 總處理?xiàng)l數(shù)</text>
<input text="2" id="total" inputType="number" margin="0 16" />
<linear gravity="center">
<button margin="16" id="ok">開始執(zhí)行</button>
</linear>
</vertical>
</ScrollView>
</vertical>
)
最終呈現(xiàn)出來的界面是這樣的
雖然丑狂芋,但是能用就可以啦
第二步便是點(diǎn)擊后的處理
ui.ok.click(() => {
var target = ui.target.text();
var comment = ui.comment.text();
var total = ui.total.text();
let main = new Main();
threads.start(function () {
main.process(target, comment, total);
});
});
也就是監(jiān)聽了按鈕的點(diǎn)擊處理
第三步就是真正做自動(dòng)化的地方了
let utils = new AppUtils();
utils.consoleShow();
console.log("處理的參數(shù):" + target + "," + message + "," + limit);
let mainTarget;
auto.waitFor();
utils.openApp("閑魚");
let search = id("search_bar_layout").untilFind();
utils.clickView(search[0]);
let sousuoInputs = className("android.widget.EditText").indexInParent(1).depth(6).untilFind()
sousuoInputs[0].setText(target)
utils.paste(sousuoInputs[0], target);
utils.sleep(1000);
let results = className("android.view.View").descContains(target).untilFind();
utils.clickView(results[0]);
mainTarget = results[0].desc();
console.log("設(shè)置標(biāo)簽:" + mainTarget);
var targetViewMap = new java.util.HashMap();
while (targetViewMap.size() < limit) {
let viewIndex = 0;
while (true) {
let targetViews = className("android.view.View").descContains(target).untilFind().filter(function (w) {
return w.desc().length >= 10;
});
if (targetViews.length <= viewIndex) {
break;
}
let targetView = targetViews[viewIndex++];
let text = targetView.desc();
text = text.substring(0, Math.min(10, text.length));
if (!targetViewMap.containsKey(text)) {
utils.sleep(1000);
utils.clickView(targetView);
utils.sleep(1000);
if (textContains("客服").findOnce() != null) {
utils.tryback(mainTarget);
continue;
}
let btns = className("android.view.View").untilFind()
var leaveMessage;
for (key in btns) {
let btn = btns[key]
try {
if (btn.desc() == null) {
continue;
}
if (btn.desc() == "留言") {
leaveMessage = btn;
break;
}
if (!isNaN(btn.desc())) {
leaveMessage = btn;
break;
}
} catch (error) {
}
}
utils.clickView(leaveMessage);
utils.sleep(1000);
try{
leaveMessage.setText(message)
} catch(error) {
}
try {
let leaveMessage2 = descContains("看對(duì)眼就留言").findOnce();
utils.clickView(leaveMessage2);
utils.sleep(1000);
leaveMessage2.setText(message)
} catch (error) {
}
try {
let leaveMessage3 = textContains("看對(duì)眼就留言").findOnce();
utils.clickView(leaveMessage3);
utils.sleep(1000);
leaveMessage3.setText(message)
} catch (error) {
}
utils.sleep(1000);
let sendBtn = textContains("發(fā)送").findOnce();
if (sendBtn == null) {
console.warn("找不到發(fā)送按鈕:" + text)
continue;
}
utils.clickView(sendBtn);
console.log("評(píng)論成功,避免被監(jiān)控憨栽,停止1秒")
utils.tryback(mainTarget);
utils.sleep(3000);
targetViewMap.put(text, targetView);
console.log("當(dāng)前成功評(píng)論個(gè)數(shù):" + targetViewMap.size())
if (targetViewMap.size() >= limit) {
break;
}
}
}
while (true) {
if (scrollDown(0)) {
break;
}
}
}
console.log("執(zhí)行完畢");
最后將腳本打包后發(fā)給了大舅子帜矾,大舅子喜出望外.......
當(dāng)然啦翼虫,大舅子開心,我也開心屡萤,畢竟抱得妹子歸啊哈哈哈哈
另外珍剑,我將自動(dòng)化學(xué)習(xí)教程和實(shí)戰(zhàn)例子都放到github和碼云上了,有興趣學(xué)習(xí)的可以拿去看
github地址:倉(cāng)庫(kù)地址
碼云地址倉(cāng)庫(kù)地址
另外死陆,該系列也錄制了視頻招拙,有興趣的可以點(diǎn)擊: b站視頻