本文介紹如何利用Python+uiautomator2 每日自動賺取支付寶積分。 支付寶的積分有啥用?誘惑誘惑你: 可以兌換視頻網站的VIP會員。 可以兌換各種優惠券。 可以在年底活動中兌換蘋果手機。 其他,一言難盡... 比如,我喜歡買知識課堂的課程。(知識付費時代,我用積分買知識) 好了,有了動 ...
本文介紹如何利用Python+uiautomator2 每日自動賺取支付寶積分。
支付寶的積分有啥用?誘惑誘惑你:
- 可以兌換視頻網站的VIP會員。
- 可以兌換各種優惠券。
- 可以在年底活動中兌換蘋果手機。
- 其他,一言難盡... 比如,我喜歡買知識課堂的課程。(知識付費時代,我用積分買知識)
好了,有了動機,我們就來開始動手吧。
贏取積分的思路: 在支付寶里,有個猜股市漲跌的功能。每日13:00前,用賬戶的積分下註,如果猜中了漲跌,就能按比例贏到對手的積分。有時押200,贏400.
從賭博的概率講,只要猜對的概率高於50%,就是穩賺不賠的,值得玩一玩。根據下圖可以找到支付寶猜漲跌功能。
怎麼玩?
不懂股票,別慌。先說思路:股市開盤時間段每天上午9:30-11:30,下午13:00-15:00。所以,一般來說,每天中午吃飯的時候,你只需要打開股票軟體,看一下11:30收盤的漲跌趨勢,就可以大致猜出當天的趨勢。 註意:你必須在下午13:00之前下註,過了13:00就是預測第二天的漲跌了。
如果當天11:30收盤漲跌不明顯,你就賭很少積分,如果趨勢明顯,你就用200積分。就這麼簡單。
具體策略是:
1)根據當日漲跌方向,判斷漲跌方向。如當日漲>=0%, 則賭漲, 反之賭跌。
2)根據當日漲跌幅度,選擇賭積分的數量。
漲跌絕對值 >=0.4%, 200積分;
漲跌絕對值 在0.4~0.3之間,100積分;
漲跌絕對值 在0.3~0.2之間,50積分;
漲跌絕對值 <0.2, 20積分;
截止目前,手動應用策略的戰況如何呢?支付寶統計勝率83%,相當的高。(19.2月份,支付寶活動還可以選擇現金,不要積分)。如圖:
但是遺憾的是,很多時候午飯吃High了,就忘記下註了。
怎麼辦?怎麼辦?
作為技(ai)術(zhe)控(teng)的人, 我決定寫個Python程式,找個舊安卓機,讓賺積分自動跑起來。當然這一切主要依靠Python強大的第三方庫uiautomator2功能,所以前期準備環境少不了。
- 安裝Python環境(建議3.6或3.7以上版本) + Pycharm編輯器(最新的免費社區版即可). 具體方法,可以百度,此處跳過細節。
- 確保電腦中有adb命令文件夾,並加入到環境變數中。adb具體可以在安卓開發工具的platform-tools下找到
- 為Python 安裝手機自動化UI工具 Uiautomator 2, 在dos下,使用pip 命令:
- pip install --upgrade --pre uiautomator2
- 安裝 Weditor (控制項屬性識別工具),完美搭配Uiautormator2.
- pip install --pre -U weditor
- 找一臺舊手機,打開開發者模式,並連接家裡wifi,(不需要插入SIM卡),安裝支付寶並登錄賬號至少一次。
- 保持手機USB 連接電腦,執行下麵的命令,自動安裝UIautomator2所需要的設備端程式:uiautomator-server 、atx-agent、openstf/minicap、openstf/minitouch
- python -m uiautomator2 init
- 在dos命令下,為Python安裝第三方庫Tushare,以便輕鬆查詢上證指數漲跌。Tushare是一個免費、開源的python財經數據介面包,功能十分強大。這裡我們只用一點點指數查詢功能。
- pip install tushare
- 在dos命令下,啟動Weditor,定位支付寶猜漲跌各個UI的元素:
- python3 -m weditor
以上8個步驟都做了,理論上,我們就可以開始寫程式了。如果對於獲取控制項元素,不瞭解,請本文的底部參考鏈接。
開始寫Python 程式:
#導入必備的Python庫 import uiautomator2 as u2 import time import tushare as ts import schedule from datetime import datetime # 連接設備,下麵連接用的序列號可由adb devices,手動查出來 d = u2.connect_usb("FUH0216830003040") # 華為 P9 # 喚醒設備d.screen_on() # turn on the screen time.sleep(2) # unlock screen,不能設置複雜圖形或者密碼哦 d.unlock( u") time.sleep(2)# return to home d.press("home") # 等待 time.sleep(2) # 啟動支付寶應用,併進入猜漲跌界面,支付寶package name, 百度可查 d.app_start("com.eg.android.AlipayGphone") # wait until the ui object appears,以下元素名,均由Weditor獲得 if d(text=u"好的").wait(timeout=3.0): # return bool: d(resourceId="com.alipay.mobile.antui:id/ensure").click() if d(text=u"點擊下方頭像登錄").wait(timeout=3.0): # return bool d(resourceId="com.ali.user.mobile.security.ui:id/userAccountImage").click() if d(text=u"刷臉登錄").wait(timeout=3.0): # return bool d(resourceId="com.ali.user.mobile.security.ui:id/switchLoginMethodCenter").click() if d(text=u"密碼登錄").wait(timeout=3.0): # return bool d(resourceId="com.alipay.mobile.antui:id/item_name", text=u"密碼登錄").click() d(resourceId="com.ali.user.mobile.security.ui:id/content", className="android.widget.EditText",instance=1).set_text("寫支付寶密碼") time.sleep(2) d(resourceId="com.ali.user.mobile.security.ui:id/loginButton").click() if d(text=u"更多").wait(timeout=3.0): d(text=u"更多").click() if d(text=u"股票").wait(timeout=3.0): d(text=u"股票").click() if d(text=u"漲跌").wait(timeout=3.0): d(text=u"漲跌").click() # 利用Tushare庫,從dataframe數據中,拿上證指數000001的漲跌情況 df = ts.get_index() for i in range(26): if df.loc[i][''000001''] == index_code: up_or_down = df.loc[i]['change'] # 根據上午漲跌幅,選擇漲跌方向,並選擇用多少積分下註(20, 50, 100, 200) if up_or_down >= 0: # 根據支付寶規則,大盤不漲不跌,視為上漲 # 點擊漲按鈕 d.click(0.281, 0.784) # 等待下個UI出現 time.sleep(3) # 下麵根據漲的幅度情況下賭註 if up_or_down > 0.4: # 如果當日漲幅超過4%,賭200積分; my_print("當日漲幅超過0.4%,賭200積分") d.click(0.741, 0.416) elif 0.3 < up_or_down <= 0.4: # 如果當日漲幅在0.4 和0.5之間,賭100積分; my_print("當日漲幅在0.3 和0.4之間,賭100積分") d.click(0.58, 0.416) elif 0.2 < up_or_down <= 0.3: # 如果當日漲幅在0.3 和0.4之間,賭50積分; my_print("當日漲幅在0.3 和0.2之間,賭50積分") d.click(0.415, 0.416) elif up_or_down <= 0.2: # 如果當日漲幅在0.3以下, 賭20積分 my_print("當日漲幅在0.2以下, 賭20積分") d.click(0.25, 0.416) else: # up_or_down <= 0, 估計這個位置是跌 # 點擊跌按鈕 d.click(0.727, 0.784) # 等待 time.sleep(3) # 下麵根據跌的幅度情況下賭註 if up_or_down < -0.4: # 如果當日跌幅超過5%,賭200積分; # 點擊200積分賭註 my_print("當日跌幅超過0.4%,賭200積分") d.click(0.741, 0.416) elif -0.4 <= up_or_down < -0.3: # 如果當日跌幅在0.4 和0.5之間,賭100積分; my_print("當日跌幅在0.4 和0.3之間,賭100積分") d.click(0.58, 0.416) elif -0.3= < up_or_down < -0.2: # 如果當日跌幅在0.3 和0.4之間,賭50積分; my_print("當日跌幅在0.3 和0.2之間,賭50積分") d.click(0.415, 0.416) elif up_or_down <= -0.2: # 如果當日跌幅在0.3以下, 賭20積分 my_print("當日跌幅在0.2以下, 賭20積分") d.click(0.25, 0.416) # 點擊確定按鈕,下註成功 time.sleep(3) d.click(0.477, 0.759)
以上代碼(除了import段落) 封裝起來取函數名 guess_up_down。
勝利在望,再加一個函數負責每日15:31 檢查 當日輸贏情況,並選擇要積分還是要現金。函數名 index_final_check().
部分代碼如下:
my_print("上午收盤上證漲跌幅%.2f%%" % morning_change) my_print("下午收盤上證漲跌幅%.2f%%" % final_change) if morning_change >= 0 and final_change >= 0: my_print("賭漲成功!(根據支付寶規則,大盤不漲不跌,視為上漲)") elif morning_change < 0 and final_change < 0: my_print("賭漲成功:最終如期下跌") elif final_change < 0 <= morning_change: my_print("賭漲失敗:押註上漲,最終下跌!") elif morning_change < 0 <= final_change: my_print("賭跌失敗:押註下跌,最終上漲!") # 點亮屏幕,並重新登錄程式。 connect_device_wake_unlock() # 先退出程式,因為只有重新進入,才能看到獲得積分還是現金。 d.app_stop("com.eg.android.AlipayGphone") time.sleep(5) # 重新進入程式 launch_app_enter_guess() # 點擊界面,選擇領取積分還是現金。 # 當然是選擇現金 d(description=u"兌換權益").click()
下圖,當天自動下註20積分,贏取40積分,換成了現金獎勵0.2(兌換權益)。
好了,程式看似功能實現了,但是還不行。我們總不能每天都手動運行程式吧? 那跟中午手動點一下區別不大呢。
所以,我們來定義一個主函數,利用schedule 方法按時調用我們的任務。
本次在主函數調用了一個today_is_holiday函數(具體代碼略過,代碼的實現方式為:周一到周五而且非法定節假日則為交易日,否則視為holiday),該函數檢查當前是否為交易日,如果是,則休息24小時,下一日繼續檢查。否則(是交易日)則定時調用 guess_up_down 和 index_final_check函數,完成任務。
def main(): my_print("***程式跑起來無眠無休,每個交易日為您賭積分***") schedule.every().day.at("11:31").do(guess_up_down) schedule.every().day.at("15:15").do(index_final_check) while True: if today_is_holiday(): time.sleep(24 * 60 * 60) # sleep 24個小時 else: # 每10秒檢測一次 schedule.run_pending() time.sleep(10) if __name__ == '__main__': main()
好了自動運行效果如視頻(本文寫在周末,所以沒有真的下註,只看看效果):
程式運行起來,可以全年無休,自動在每個交易日下註,自動選擇拿積分還是拿現金。
需要註意的是,下午檢查積分到賬的時間,不能早於15:15,因為支付寶最早於15:15公佈結果。
如果想讓程式更酷一點,可以微信發送結果給自己(參見:簡單實用的微信消息推送神器:server醬),也可以寫日誌文件,記錄每日盈虧情況。
Enjoy~~啦啦啦~~~
提醒:
1)由於支付寶的下註UI的控制項元素無法被獲取,所以採用了坐標值方法來點擊絕對位置。如果換做其他手機型號,就必須自己重新獲取位置,並修改對應代碼。建議破舊二手安卓機(>=4.4 OS),來做這件事就好了。
2)uiautomator2 系統要求:
- Python 要求 Android >= 4.4 Python >=2.7 || <= 3.7
3)我們測試機可以根據場景自動再次登錄支付寶,以防止你用其他手機做過登錄。要實現這點,需要你在代碼 set_text("寫支付寶密碼") 處,替換為你支付寶密碼。