相信這兩天你們都忙碌於各種微信羣中,專一搶紅包。那是否能夠利用 Python 實現自動搶紅包呢?python
答案是確定的。這篇文章的目的是利用「Airtest」實現全自動搶羣紅包。android
ps:紅包只是圖個樂呵,但願本篇文章僅僅用於學習。spring
首先須要在本機上配置好 Airtest 環境,配置及基本的使用方法查看「原文連接」查看。api
其次,因爲我使用的 Android 手機,因此須要提早配置好 Android 開發環境,保證「adb」命令正常運行。bash
打開 AirtestIDE,用數據線連上 PC後,就能夠點擊右上角的 connect 鏈接設備。微信
設備鏈接成功以後,緊接着滑動手機界面到包含「微信圖標」的頁面,就能夠正式進入下面的操做了。函數
利用 AirtestIDE 新建一個項目,設備類型選中 Android,就會在編碼區生成一段初始化的代碼。學習
# -*- encoding=utf8 -*-
__author__ = "xingag"
from airtest.core.api import *
auto_setup(__file__)
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
複製代碼
拷貝上面的代碼到 Pycharm 中,並安裝「pocoui」庫。測試
pip3 install pocoui
複製代碼
ps:注意 Mac OS 安裝會提示 adb 沒有運行權限,只須要授予響應的權限便可。ui
# chmod +x /Users/xingag/anaconda3/lib/python3.7/site-packages/airtest/core/android/static/adb/mac/adb
chmod +x [本機adb路徑]
複製代碼
這裏我新建了一個名稱爲「搶紅包」微信羣,便於後面的測試。
首先咱們須要打開微信 App。
相比 Appium 須要經過包名和啓動 Activity 的形式,Airtest 經過一行代碼就能夠實現打開應用。
# 指定當前界面text內容爲【微信】的控件,執行點擊操做
poco(text='微信').click()
複製代碼
第一個 Tab 就是微信消息列表,這裏顯示了全部的羣聊、單聊及一些消息。
經過「元素 name」找到全部的消息列表元素,而後就能夠全部消息的內容。
# 消息列表
item_elements = poco(name='com.tencent.mm:id/b4m').offspring('com.tencent.mm:id/b4o')
# 獲取全部消息列表的名稱
names = list(map(lambda x: x.get_text(), item_elements))
複製代碼
找到目標羣元素,就能夠執行點擊操做,進入羣聊。
# 羣名稱
target = '搶紅包'
index = names.index(target)
# 點擊進入羣聊
item_elements[index].click()
複製代碼
而後獲取到當前羣聊的全部消息元素。
# 1.獲取消息列表元素
msg_list_elements_pre = poco("android.widget.ListView").children()
複製代碼
搶紅包須要從最近的一個紅包開始搶,全部須要反轉羣聊消息。
msg_list_elements = []
for item in msg_list_elements_pre:
msg_list_elements.insert(0, item)
複製代碼
接下來就能夠遍歷消息列表,獲取到有「微信紅包」微信紅包標識而且尚未搶的紅包「包含本身發的」消息元素。
for msg_element in msg_list_elements:
# 2.1 微信紅包標識元素
red_key_element = msg_element.offspring('com.tencent.mm:id/apf')
# 2.2 是否已經領取元素
has_click_element = msg_element.offspring('com.tencent.mm:id/ape')
# 2.3 紅包【包含:收到的紅包和本身發出去的紅包】
if red_key_element:
print('發現一個紅包')
if has_click_element.exists() and (
has_click_element.get_text() == '已領取' or has_click_element.get_text() == '已被領完'):
print('已經領取過了,略過~')
continue
else:
print('立刻搶紅包')
else:
print('紅包元素不存在')
continue
複製代碼
搶紅包的操做就很簡單了。點擊還未搶過的紅包,到搶紅包對話框界面,點擊「搶」按鈕,就能夠模擬搶一個紅包的操做了。
搶完紅包以後,須要模擬點擊手機上的返回按鍵到消息列表頁面,接着執行下一個搶紅包的操做。
msg_element.click()
click_element = poco("com.tencent.mm:id/cv0")
if click_element.exists():
click_element.click()
# 返回
keyevent('BACK')
複製代碼
最後,把上面搶紅包的操做定義爲一個方法,循環來獲取消息列表,獲取到新的紅包後,立刻執行「搶紅包」的操做。
while True:
get_red_package()
print('休眠1秒鐘,繼續刷新頁面,開始搶紅包。')
sleep(1)複製代碼
執行程序,手機會自動打開微信,找到對應的羣聊,進入消息列表頁面,「定時」檢查列表中的信息,若是發現有紅包,就開始搶紅包。
固然,消息列表頁能夠經過 swipe 函數向上滑動,獲取更多的紅包,原理相似。
本文首發於公衆號「 AirPython 」,後臺回覆「 搶紅包 」便可獲取完整代碼。