Python編寫薅羊毛腳本經(jīng)驗分享
蠻多朋友加了群,為了方便朋友們理解和使用腳本,特來進一步說明。提醒,本期不僅需要Python基礎(chǔ),還得理解面向?qū)ο蠛投嗑€程。請酌情觀看。
一、不同需求的難度差別
薅羊毛腳本,就是想用程序來做重復(fù)動作。這個重復(fù),有簡單有復(fù)雜,不同需求下,問題難度差別很大。我們從簡單到復(fù)雜。
1、簡單版
最基本的就是下滑。這個很容易編寫。一個無限循環(huán)搞定。
2、升級版
如果想隔20分鐘去做任務(wù),然后程序運行到足夠時間停止呢。這個也比較容易。
3、挑戰(zhàn)版
如果想多App運行足夠時間后自動切換,同樣也隔20分鐘做任務(wù)呢?是不是覺得難度一下子提升好多,完全兩碼事了?
有句話說,0到1是最困難的。編程也適用。編程里0代表是1,1則是2。編程,單任務(wù),順序執(zhí)行,很簡單。一旦變成2個,就困難。而再進一步2變更多,又容易。
在薅羊毛腳本中,上面的問題是核心,大部分代碼都圍繞它展開。而解決它,使用面向過程編程和單線程就不容易。需要用面向?qū)ο蠛投嗑€程。
二、我的解決思路
1、封裝
面向?qū)ο蟮娜筇卣魇欠庋b、繼承和多態(tài)。而封裝最基本,將不同業(yè)務(wù)邏輯用類來包裝。
App動作和執(zhí)行分離
腳本中apps.py下有多個App名稱的類。比如JingDong,封裝了京某的業(yè)務(wù):簽到、逛商品,逛活動、看視頻和其他。而JingDongMain則是執(zhí)行的類。
封裝基礎(chǔ)工具
MyAuto類封裝了u2的各種功能,比如點擊、下滑等。
調(diào)度類
AutoMain類里面包含程序的入口start,還封裝了控制邏輯和保存數(shù)據(jù)的邏輯。
多線程執(zhí)行。
網(wǎng)上有些片面言論,比如Python有GIL鎖,多線程沒用,做不到真正的并行和并發(fā)。好像Python的多線程一無是處,不值得學(xué)習(xí)和使用。在薅羊毛腳本中,將業(yè)務(wù)執(zhí)行和調(diào)度放在不同的線程里,才能控制程序運行。
這樣來比喻。采用面向?qū)ο蠛投嗑€程,就如同當(dāng)老板雇人來干活,但員工都不太聰明,只會干一件事。在薅羊毛里。員工A只會下滑和做任務(wù),需要給他工具,還得告訴它什么時候下滑和做任務(wù)。員工B記錄時間,讓他來告訴員工A該干啥。一個人(單線程)搞不定?不行,他笨只能干一件事,不能邊干邊記錄時間。那讓員工聰明點自帶工具行不行。他不干活了,我們都不知道是工具壞了還是他偷懶(隔離方便維護代碼)。
2、線程間傳遞信息(通信)
如何告訴業(yè)務(wù)循環(huán)該干啥了呢?這就得解決線程通信的問題。線程間通信有多種方法??梢杂萌肿兞亢蚎ueue,而我采用的是傳入字典的方式。Python一切都是對象。字典是可變類型的對象。對象可以作為參數(shù)傳入函數(shù)或類,所以可以用來傳遞信息。
我的腳本中有一個核心調(diào)度字典,task_control。它創(chuàng)建于AtuoMain,作為參數(shù)傳入TaskThread,又作為參數(shù)傳入App的Main函數(shù),再作為參數(shù)傳入watch_content的無線循環(huán)瀏覽中。機制是這樣的。當(dāng)切換任務(wù)條件出現(xiàn)后,就會修改task_control,而無線循環(huán)中會一直讀取task_control,來完成信息傳遞。(更高級的線程安全問題,這里就不討論了。)
3、如何切換任務(wù)
腳本中長時間瀏覽都是無限循環(huán),信息傳遞進去了,如何跳出循環(huán)來切換任務(wù)呢?我用的是拋異常。Python異常傳遞是層層傳遞,直到被捕獲。它可以穿透命名空間。我利用這種機制來切換任務(wù)。所以腳本中定義了多個異常類。這些都是為切換任務(wù)而設(shè)。因為腳本里有大量的循環(huán),采用return的方法比較麻煩,所以采用了這種方式。
三、總結(jié)
針對開始的問題:多App運行足夠時間后自動切換,中間執(zhí)行任務(wù)的問題。我是用一個線程執(zhí)行動作,一個線程負責(zé)調(diào)度。通過字典來傳遞信息,拋出異常來切換任務(wù)。我是土八路,自學(xué)和摸索。朋友們有更好的方法,歡迎交流探討。也希望使用腳本的朋友,了解腳本的思路,更方便使用。只是不知講清楚沒有,表達能力有限,見諒。