對于搶紅包我真的最愛啦,每次看見紅包,心里那個激動顫抖,但因為作業原因難免沒注意就沒了啊,為了滿足自己的私欲,就有了這篇文章的出現,愛錢博主私欲之作,

1.環境準備:
- appium環境
- 安卓手機
- usb資料線
- python環境
2.實作思路
我們收到紅包和訊息都是自動置頂到第一個,于是我們打開第一個判斷是否有紅包,沒有則隱藏此視窗,如果有則判斷紅包是否可以領取,如果有則領取紅包,否則洗掉此紅包(不然會影響后面的判斷)
然后再進行回圈運行和判斷,


3.編碼思路
首先看一下配置資訊,因為我使用得是真機小米9安卓10的系統,代碼實作如下具體的資訊填寫請根據自己的真實情況修改:
desired_caps = {
"platformName": "Android", # 系統
"platformVersion": "10.0", # 系統版本號
"deviceName": "b68548ed", # 設備名
"appPackage": "com.tencent.mm", # 包名
"appActivity": ".ui.LauncherUI", # app 啟動時主 Activity
'unicodeKeyboard': True, # 使用自帶輸入法
'noReset': True # 保留 session 資訊,可以避免重新登錄
}
因為點擊紅包后需要判斷點擊后的紅包是否被領取,即是否有開字,如圖所示:

所以我們定義一個判斷元素是否存在的方法,代碼實作如下:
def is_element_exist(driver, by, value):
try:
driver.find_element(by=by, value=value)
except Exception as e:
return False
else:
return True
因為紅包無論是被自己領取還是被他人領取,之后都要洗掉領取后的紅包記錄,所以我們再來定義一個洗掉已領取紅包的方法,代碼實作如下:
def del_red_envelope(wait, driver):
# 長按領取過的紅包
r8 = wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ahs")))
TouchAction(driver).long_press(r8).perform()
time.sleep(1)
# 點擊長按后顯示的洗掉
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/dt5"))).click()
# 點擊彈出框的洗掉選項
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ffp"))).click()

同時有可能第一個是公眾號推送的訊息,這樣會導致無法判斷,所以我們判斷只要進去的里面沒有紅包就把它隱藏掉,然后等新的紅包發生過來,
# 洗掉第一個聊天框
def del_red_public(wait, driver):
# 長按第一個聊天框
r8 = wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/fzg")))
TouchAction(driver).long_press(r8).perform()
time.sleep(1)
# 點擊長按后顯示的洗掉
wait.until(EC.element_to_be_clickable((By.XPATH, "//android.widget.TextView[@text='不顯示該聊天']"))).click()
# 點擊彈出框的洗掉選項
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ffp"))).click()

4.完整代碼如下:
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support import expected_conditions as EC
import time
desired_caps = {
"platformName": "Android", # 系統
"platformVersion": "10.0", # 系統版本號
"deviceName": "b68548ed", # 設備名
"appPackage": "com.tencent.mm", # 包名
"appActivity": ".ui.LauncherUI", # app 啟動時主 Activity
'unicodeKeyboard': True, # 使用自帶輸入法
'noReset': True # 保留 session 資訊,可以避免重新登錄
}
# 判斷元素是否存在
def is_element_exist(driver, by, value):
try:
driver.find_element(by=by, value=value)
except Exception as e:
return False
else:
return True
# 洗掉領取后的紅包記錄
def del_red_envelope(wait, driver):
# 長按領取過的紅包
r8 = wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ahs")))
TouchAction(driver).long_press(r8).perform()
time.sleep(1)
# 點擊長按后顯示的洗掉
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/dt5"))).click()
# 點擊彈出框的洗掉選項
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ffp"))).click()
# 洗掉第一個聊天框
def del_red_public(wait, driver):
# 長按第一個聊天框
r8 = wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/fzg")))
TouchAction(driver).long_press(r8).perform()
time.sleep(1)
# 點擊長按后顯示的洗掉
wait.until(EC.element_to_be_clickable((By.XPATH, "//android.widget.TextView[@text='不顯示該聊天']"))).click()
# 點擊彈出框的洗掉選項
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ffp"))).click()
if __name__ == '__main__':
driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
# 設定等待
wait = WebDriverWait(driver, 500)
while True:
# 進入第一個聊天視窗
g73 = wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/fzg")))
g73.click()
print("進入了第一個聊天視窗")
# 判斷聊天窗是否是公眾號
is_weichat = is_element_exist(driver, "id", "com.tencent.mm:id/u1")
if is_weichat == True:
# while True:
# 有紅包則點擊
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/u1"))).click()
print("點擊了紅包")
# 判斷紅包是否被領取
is_open = is_element_exist(driver, "id", "com.tencent.mm:id/f4f")
print("紅包是否被領取:", is_open)
if is_open == True:
# 紅包未被領取,點擊開紅包
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/f4f"))).click()
print('已經領取紅包')
# 回傳群聊
driver.keyevent(4)
# 洗掉領取過的紅包記錄
del_red_envelope(wait, driver)
print('···洗掉已經領取的紅包,等待新的紅包')
driver.keyevent(4)
else:
# 回傳群聊
driver.keyevent(4)
# 洗掉領取過的紅包記錄
del_red_envelope(wait, driver)
print('···洗掉無法領取的紅包,等待新的紅包')
driver.keyevent(4)
else:
print('沒有紅包則隱藏此聊天框')
# 回傳群聊
driver.keyevent(4)
# 洗掉第一個公眾號視窗
del_red_public(wait, driver)
print('隱藏了第一個聊天框')

點擊領取.干貨滿滿
①兼職交流,行業咨詢、大佬在線專業解答有
②Python開發環境安裝教程有
③Python400集自學視頻有
④軟體開發常用詞匯有
⑤Python學習路線圖有
⑥3000多本Python電子書有
如果你用得到的話可以直接拿走,在我的QQ技術交流群里群號:767030506(純技術交流和資源共享,廣告勿入)以自助拿走
本文到這里就結束了,感謝觀看,更多有關Python精彩內容可以關注小編看小編主頁,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286598.html
標籤:python
