Python+Appium實(shí)現(xiàn)自動(dòng)搶微信紅包
我們收到紅包和消息都是自動(dòng)置頂?shù)降谝粋€(gè),于是我們打開第一個(gè)判斷是否有紅包,沒(méi)有則隱藏此窗口。如果有則判斷紅包是否可以領(lǐng)取,如果有則領(lǐng)取紅包,否則刪除此紅包(不然會(huì)影響后面的判斷)然后再進(jìn)行循環(huán)運(yùn)行和判斷。
首先看一下配置信息,因?yàn)槲沂褂玫檬钦鏅C(jī)小米9安卓10的系統(tǒng),代碼實(shí)現(xiàn)如下具體的信息填寫請(qǐng)根據(jù)自己的真實(shí)情況修改:
desired_caps = { 'platformName': 'Android', # 系統(tǒng) 'platformVersion': '10.0', # 系統(tǒng)版本號(hào) 'deviceName': 'b68548ed', # 設(shè)備名 'appPackage': 'com.tencent.mm', # 包名 'appActivity': '.ui.LauncherUI', # app 啟動(dòng)時(shí)主 Activity ’unicodeKeyboard’: True, # 使用自帶輸入法 ’noReset’: True # 保留 session 信息,可以避免重新登錄}
因?yàn)辄c(diǎn)擊紅包后需要判斷點(diǎn)擊后的紅包是否被領(lǐng)取,即是否有開字,如圖所示:
所以我們定義一個(gè)判斷元素是否存在的方法,代碼實(shí)現(xiàn)如下:
def is_element_exist(driver, by, value): try:driver.find_element(by=by, value=value) except Exception as e:return False else:return True
因?yàn)榧t包無(wú)論是被自己領(lǐng)取還是被他人領(lǐng)取,之后都要?jiǎng)h除領(lǐng)取后的紅包記錄,所以我們?cè)賮?lái)定義一個(gè)刪除已領(lǐng)取紅包的方法,代碼實(shí)現(xiàn)如下:
def del_red_envelope(wait, driver): # 長(zhǎng)按領(lǐng)取過(guò)的紅包 r8 = wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/ahs'))) TouchAction(driver).long_press(r8).perform() time.sleep(1) # 點(diǎn)擊長(zhǎng)按后顯示的刪除 wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/dt5'))).click() # 點(diǎn)擊彈出框的刪除選項(xiàng) wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/ffp'))).click()
同時(shí)有可能第一個(gè)是公眾號(hào)推送的消息,這樣會(huì)導(dǎo)致無(wú)法判斷,所以我們判斷只要進(jìn)去的里面沒(méi)有紅包就把它隱藏掉,然后等新的紅包發(fā)生過(guò)來(lái)。
# 刪除第一個(gè)聊天框def del_red_public(wait, driver): # 長(zhǎng)按第一個(gè)聊天框 r8 = wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/fzg'))) TouchAction(driver).long_press(r8).perform() time.sleep(1) # 點(diǎn)擊長(zhǎng)按后顯示的刪除 wait.until(EC.element_to_be_clickable((By.XPATH, '//android.widget.TextView[@text=’不顯示該聊天’]'))).click() # 點(diǎn)擊彈出框的刪除選項(xiàng) wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/ffp'))).click()
完整代碼如下:
from appium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom appium.webdriver.common.touch_action import TouchActionfrom selenium.webdriver.support import expected_conditions as ECimport timedesired_caps = { 'platformName': 'Android', # 系統(tǒng) 'platformVersion': '10.0', # 系統(tǒng)版本號(hào) 'deviceName': 'b68548ed', # 設(shè)備名 'appPackage': 'com.tencent.mm', # 包名 'appActivity': '.ui.LauncherUI', # app 啟動(dòng)時(shí)主 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# 刪除領(lǐng)取后的紅包記錄def del_red_envelope(wait, driver): # 長(zhǎng)按領(lǐng)取過(guò)的紅包 r8 = wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/ahs'))) TouchAction(driver).long_press(r8).perform() time.sleep(1) # 點(diǎn)擊長(zhǎng)按后顯示的刪除 wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/dt5'))).click() # 點(diǎn)擊彈出框的刪除選項(xiàng) wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/ffp'))).click()# 刪除第一個(gè)聊天框def del_red_public(wait, driver): # 長(zhǎng)按第一個(gè)聊天框 r8 = wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/fzg'))) TouchAction(driver).long_press(r8).perform() time.sleep(1) # 點(diǎn)擊長(zhǎng)按后顯示的刪除 wait.until(EC.element_to_be_clickable((By.XPATH, '//android.widget.TextView[@text=’不顯示該聊天’]'))).click() # 點(diǎn)擊彈出框的刪除選項(xiàng) 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) # 設(shè)置等待 wait = WebDriverWait(driver, 500) while True: # 進(jìn)入第一個(gè)聊天窗口g73 = wait.until(EC.element_to_be_clickable( (By.ID, 'com.tencent.mm:id/fzg')))g73.click()print('進(jìn)入了第一個(gè)聊天窗口')# 判斷聊天窗是否是公眾號(hào)is_weichat = is_element_exist(driver, 'id', 'com.tencent.mm:id/u1')if is_weichat == True:# while True: # 有紅包則點(diǎn)擊 wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/u1'))).click() print('點(diǎn)擊了紅包') # 判斷紅包是否被領(lǐng)取 is_open = is_element_exist(driver, 'id', 'com.tencent.mm:id/f4f') print('紅包是否被領(lǐng)?。?, is_open) if is_open == True:# 紅包未被領(lǐng)取,點(diǎn)擊開紅包wait.until(EC.element_to_be_clickable( (By.ID, 'com.tencent.mm:id/f4f'))).click()print(’已經(jīng)領(lǐng)取紅包’)# 返回群聊driver.keyevent(4)# 刪除領(lǐng)取過(guò)的紅包記錄del_red_envelope(wait, driver)print(’···刪除已經(jīng)領(lǐng)取的紅包,等待新的紅包’)driver.keyevent(4) else:# 返回群聊driver.keyevent(4)# 刪除領(lǐng)取過(guò)的紅包記錄del_red_envelope(wait, driver)print(’···刪除無(wú)法領(lǐng)取的紅包,等待新的紅包’)driver.keyevent(4)else: print(’沒(méi)有紅包則隱藏此聊天框’) # 返回群聊 driver.keyevent(4) # 刪除第一個(gè)公眾號(hào)窗口 del_red_public(wait, driver) print(’隱藏了第一個(gè)聊天框’)
以上就是Python+Appium實(shí)現(xiàn)自動(dòng)搶微信紅包的詳細(xì)內(nèi)容,更多關(guān)于Python 搶微信紅包的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 網(wǎng)頁(yè)中img圖片使用css實(shí)現(xiàn)等比例自動(dòng)縮放不變形(代碼已測(cè)試)2. vue組件庫(kù)的在線主題編輯器的實(shí)現(xiàn)思路3. idea設(shè)置自動(dòng)導(dǎo)入依賴的方法步驟4. Python安裝并操作redis實(shí)現(xiàn)流程詳解5. AspNetCore&MassTransit Courier實(shí)現(xiàn)分布式事務(wù)的詳細(xì)過(guò)程6. 部署vue+Springboot前后端分離項(xiàng)目的步驟實(shí)現(xiàn)7. ajax post下載flask文件流以及中文文件名問(wèn)題8. Python常用擴(kuò)展插件使用教程解析9. html清除浮動(dòng)的6種方法示例10. ASP腳本組件實(shí)現(xiàn)服務(wù)器重啟
