Python自動(dòng)掃描出微信不是好友名單的方法
前言
最近找?guī)讉€(gè)老友準(zhǔn)備聊天發(fā)現(xiàn)幾個(gè)已經(jīng)被刪除好友名單,做為潛水黨多年的我已經(jīng)不知道成為多少人的黑名單,但是好友列表卻依然有不是好友的名單,面對龐大的好友數(shù)量想要清除談何容易。雖然可以發(fā)消息給所有人,來識別是否是好友,但是畢竟打擾到了其他人,經(jīng)過一番查詢發(fā)現(xiàn)點(diǎn)擊轉(zhuǎn)賬時(shí)會提示不是好友,這里只是點(diǎn)擊轉(zhuǎn)賬并不是真的轉(zhuǎn)賬哦。做為一名技術(shù)潛水黨,肯定要低調(diào)的辦好事情。之前已經(jīng)用appium玩過自動(dòng)化了,那么這次就輕車熟路了。
準(zhǔn)備
1.Appium環(huán)境搭建
環(huán)境搭建這里不再介紹,需要的可以看我之前的文章或者百度
2.手動(dòng)操作流程圖轉(zhuǎn)自動(dòng)操作流程圖

最開始畫的流程圖,然后按照流程圖去實(shí)現(xiàn)操作流程和邏輯。初步實(shí)現(xiàn)完成后進(jìn)行調(diào)試,過程中不少邏輯不嚴(yán)謹(jǐn)?shù)牡胤?,以及一些框架自帶的坑,最終總算可以一次性掃描了。但是其中還是存在個(gè)別的坑需要手動(dòng)處理一下。暫時(shí)先記錄下來,等以后看情況優(yōu)化吧。
遇到暫停基本是聊天窗識別不到了,可以手動(dòng)上滑一下,讓程序識別下一個(gè)聊天窗口。需要先登陸微信號。
代碼
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.common.exceptions import StaleElementReferenceException
# platformVersion = input('系統(tǒng)版本號(platformVersion): ')
# deviceName = input('設(shè)備名稱(deviceName):')
desired_caps = {
"platformName": "Android", # 系統(tǒng)
"platformVersion": '10.0', # 系統(tǒng)版本號
# "platformVersion": platformVersion, # 系統(tǒng)版本號
"deviceName": 'b68548ed', # 設(shè)備名
# "deviceName": deviceName, # 設(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
def break_key(n):
"""點(diǎn)擊返回按鈕"""
for i in range(n):
el1 = wait.until(EC.element_to_be_clickable((By.ACCESSIBILITY_ID,"返回")))
el1.click()
def swipe_up():
"""向上滑動(dòng)屏幕"""
# 獲取屏幕的size
size = driver.get_window_size()
# 獲取屏幕寬度 width
width = size['width']
# 獲取屏幕高度 height
height = size['height']
x1 = width*0.5
y1 = height*0.45
y2 = height*0.3
driver.swipe(x1,y1,x1,y2,3000)
print("向上滑動(dòng)")
if __name__ == '__main__':
driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
# 設(shè)置等待
wait = WebDriverWait(driver, 300)
status = True
n = 2
count = 1
while status:
try:
# 點(diǎn)擊通訊錄
a1 = wait.until(EC.element_to_be_clickable(
(By.XPATH, "http://android.widget.FrameLayout[@content-desc=\"當(dāng)前所在頁面,與的聊天\"]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.RelativeLayout[2]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.ImageView")))
a1.click()
#向上滑動(dòng)
swipe_up()
if n < 13:
# 進(jìn)入第一個(gè)聊天窗口,公眾號為1,用戶元素定位從2開始,一頁最多12,每滑動(dòng)屏幕從新開始到12.
g73 = wait.until(EC.element_to_be_clickable(
(By.XPATH, "http://android.widget.FrameLayout[@content-desc='當(dāng)前所在頁面,與的聊天']/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout/com.tencent.mm.ui.mogic.WxViewPager/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.ListView/android.widget.LinearLayout[%d]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.view.View"%(n))))
g73.click()
print("進(jìn)入了第%d個(gè)好友聊天窗口"%(count))
count += 1
else:
n -= 1
g73 = wait.until(EC.element_to_be_clickable(
(By.XPATH, "http://android.widget.FrameLayout[@content-desc='當(dāng)前所在頁面,與的聊天']/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout/com.tencent.mm.ui.mogic.WxViewPager/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.ListView/android.widget.LinearLayout[%d]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.view.View"%(n))))
g73.click()
print("進(jìn)入了第%d個(gè)好友聊天窗口"%(count))
count += 1
# 判斷聊天窗是否有發(fā)送消息的元素
is_weichat = is_element_exist(driver, "id", "com.tencent.mm:id/ijq")
if is_weichat == True:
while True:
# # 有發(fā)消息則點(diǎn)擊
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ijq"))).click()
print("點(diǎn)擊了發(fā)消息")
#點(diǎn)擊+號
is_jia = is_element_exist(driver, 'id', 'com.tencent.mm:id/ay7')
#判斷是否有加號
if is_jia == True:
el4 = wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/ay7")))
el4.click()
print('點(diǎn)擊+號')
#判斷是否為轉(zhuǎn)賬
is_zhuanzhang = wait.until(EC.element_to_be_clickable((By.XPATH,"http://android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.GridView/android.widget.LinearLayout[6]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView")))
if is_zhuanzhang.text == "轉(zhuǎn)賬":
# is_zhuanzhang = is_element_exist(driver, 'xpath', '//android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.GridView/android.widget.LinearLayout[6]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView')
# if is_zhuanzhang == True:
#點(diǎn)擊轉(zhuǎn)賬
el5 = wait.until(EC.element_to_be_clickable((By.XPATH,"http://android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.GridView/android.widget.LinearLayout[6]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.ImageView[2]")))
el5.click()
print('點(diǎn)擊轉(zhuǎn)賬')
#輸入金額0.01
el6 = wait.until(EC.element_to_be_clickable((By.ID,"com.tencent.mm:id/jf4")))
el6.send_keys("0.01")
print('輸入金額')
#點(diǎn)擊確認(rèn)轉(zhuǎn)賬
el7 = wait.until(EC.element_to_be_clickable((By.ID,"com.tencent.mm:id/e6c")))
el7.click()
print('點(diǎn)擊確認(rèn)轉(zhuǎn)賬')
time.sleep(2)
#判斷是否有知道了
is_not_friend = is_element_exist(driver,'id','com.tencent.mm:id/ffp')
if is_not_friend == True:
#點(diǎn)擊知道了
el8 = wait.until(EC.element_to_be_clickable((By.ID,"com.tencent.mm:id/ffp")))
el8.click()
print('點(diǎn)擊知道了')
#獲取用戶名稱并打印
el9 = wait.until(EC.element_to_be_clickable((By.ID,"com.tencent.mm:id/h2k")))
print('不是好友的微信名稱為:',el9.text)
with open('weixin.txt','a+')as f:
f.write('不是好友的微信名稱:' + el9.text + '\n')
driver.keyevent(4)
driver.keyevent(4)
driver.keyevent(4)
driver.keyevent(4)
print('返回')
n += 1
break
else:
#沒有知道則返回
driver.keyevent(4)
break_key(2)
n += 1
print('返回')
break
else:
#沒有轉(zhuǎn)賬則返回到首頁
driver.keyevent(4)
driver.keyevent(4)
print('返回')
n += 1
break
else:
#沒有+號則返回到首頁
driver.keyevent(4)
driver.keyevent(4)
print('返回')
n += 1
break
except StaleElementReferenceException:
print('捕獲StaleElementReferenceException異常')
這里已經(jīng)掃描到200多個(gè)好友了,其中可能需要手動(dòng)上滑一下

不是好友的名單會在當(dāng)前目錄生成一個(gè)txt文件進(jìn)行保存

偶然出現(xiàn)幾個(gè)異常,不知道是什么原因

總的來說功能基本都已經(jīng)實(shí)現(xiàn)了,還有細(xì)節(jié)問題后面看情況優(yōu)化吧
到此這篇關(guān)于Python自動(dòng)掃描出微信不是好友名單的方法的文章就介紹到這了,更多相關(guān)Python自動(dòng)掃描出微信好友內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中numpy.pad()函數(shù)的使用詳解
這篇文章主要介紹了Python中numpy.pad()函數(shù)的使用詳解,在卷積神經(jīng)網(wǎng)絡(luò)中,為了避免卷積運(yùn)算導(dǎo)致輸出圖像縮小和圖像邊緣信息丟失,常常采用圖像邊緣填充技術(shù),即在圖像四周邊緣填充0,使得卷積運(yùn)算后圖像大小不會縮小,同時(shí)也不會丟失邊緣和角落的信息,需要的朋友可以參考下2023-10-10
Python2 與Python3的版本區(qū)別實(shí)例分析
這篇文章主要介紹了Python2 與Python3的版本區(qū)別,結(jié)合實(shí)例形式分析了Python2 與Python3的版本使用過程中的各種常見區(qū)別、用法與注意事項(xiàng),需要的朋友可以參考下2020-03-03
Python列表創(chuàng)建與銷毀及緩存池機(jī)制
這篇文章主要介紹了Python列表創(chuàng)建與銷毀及緩存池機(jī)制,文章基于python展開對列表創(chuàng)建與銷毀內(nèi)容的展開,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
python selenium循環(huán)登陸網(wǎng)站的實(shí)現(xiàn)
這篇文章主要介紹了python selenium循環(huán)登陸網(wǎng)站的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Python使用Selenium、PhantomJS爬取動(dòng)態(tài)渲染頁面
本文主要介紹了Python使用Selenium、PhantomJS爬取動(dòng)態(tài)渲染頁面,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
python實(shí)現(xiàn)RGB與YCBCR顏色空間轉(zhuǎn)換
這篇文章主要介紹了python實(shí)現(xiàn)RGB與YCBCR顏色空間轉(zhuǎn)換,RGB與YCbCr顏色空間概念的與變換關(guān)系,包括內(nèi)容灰度值和亮度的關(guān)系、RGB顏色空間與顏色控制、YCbCr顏色空間及與RGB的變換關(guān)系,需要的小伙伴可以參考一下2022-03-03
Python內(nèi)置數(shù)學(xué)函數(shù)和math模塊使用指南
這篇文章主要為大家介紹了Python數(shù)學(xué)函數(shù)math模塊使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
詳解Python利用configparser對配置文件進(jìn)行讀寫操作
這篇文章主要介紹了詳解Python利用configparser對配置文件進(jìn)行讀寫操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
python爬蟲beautifulsoup庫使用操作教程全解(python爬蟲基礎(chǔ)入門)
這篇文章主要介紹了python爬蟲beautifulsoup庫使用操作全解(python爬蟲基礎(chǔ)入門),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

