Python自动扫描出微信不是好友名单的方法

前言

最近找几个老友准备聊天发现几个已经被删除好友名单,做为潜水党多年的我已经不知道成为多少人的黑名单,但是好友列表却依然有不是好友的名单,面对庞大的好友数量想要清除谈何容易。虽然可以发消息给所有人,来识别是否是好友,但是毕竟打扰到了其他人,经过一番查询发现点击转账时会提示不是好友,这里只是点击转账并不是真的转账哦。做为一名技术潜水党,肯定要低调的办好事情。之前已经用appium玩过自动化了,那么这次就轻车熟路了。

准备

1.Appium环境搭建
环境搭建这里不再介绍,需要的可以看我之前的文章或者百度
2.手动操作流程图转自动操作流程图

Python自动扫描出微信不是好友名单的方法

最开始画的流程图,然后按照流程图去实现操作流程和逻辑。初步实现完成后进行调试,过程中不少逻辑不严谨的地方,以及一些框架自带的坑,最终总算可以一次性扫描了。但是其中还是存在个别的坑需要手动处理一下。暂时先记录下来,等以后看情况优化吧。
遇到暂停基本是聊天窗识别不到了,可以手动上滑一下,让程序识别下一个聊天窗口。需要先登陆微信号。

代码

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(\'系统版本号(platformVersion): \')
# deviceName = input(\'设备名称(deviceName):\')


desired_caps = {
    \"platformName\": \"Android\",  # 系统
    \"platformVersion\": \'10.0\',  # 系统版本号
    # \"platformVersion\": platformVersion,  # 系统版本号
    \"deviceName\": \'b68548ed\',  # 设备名
    # \"deviceName\": deviceName,  # 设备名
    \"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 break_key(n):
    \"\"\"点击返回按钮\"\"\"
    for i in range(n):
        el1 =  wait.until(EC.element_to_be_clickable((By.ACCESSIBILITY_ID,\"返回\")))
        el1.click()

def swipe_up():
    \"\"\"向上滑动屏幕\"\"\"
    # 获取屏幕的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(\"向上滑动\")
    

if __name__ == \'__main__\':
    driver = webdriver.Remote(\"http://localhost:4723/wd/hub\", desired_caps)
    # 设置等待
    wait = WebDriverWait(driver, 300)
    status = True
    n = 2
    count = 1   
    while status:
        try:
            # 点击通讯录
            a1 = wait.until(EC.element_to_be_clickable(
                (By.XPATH, \"//android.widget.FrameLayout[@content-desc=\\\"当前所在页面,与的聊天\\\"]/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()
            #向上滑动
            swipe_up()
            if n < 13:
                # 进入第一个聊天窗口,公众号为1,用户元素定位从2开始,一页最多12,每滑动屏幕从新开始到12.
                g73 = wait.until(EC.element_to_be_clickable(
                    (By.XPATH, \"//android.widget.FrameLayout[@content-desc=\'当前所在页面,与的聊天\']/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(\"进入了第%d个好友聊天窗口\"%(count))
                count += 1
            else:
                n -= 1
                g73 = wait.until(EC.element_to_be_clickable(
                    (By.XPATH, \"//android.widget.FrameLayout[@content-desc=\'当前所在页面,与的聊天\']/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(\"进入了第%d个好友聊天窗口\"%(count))
                count += 1
            # 判断聊天窗是否有发送消息的元素
            is_weichat = is_element_exist(driver, \"id\", \"com.tencent.mm:id/ijq\")
            if is_weichat == True:
                while True:
            #     # 有发消息则点击
                    wait.until(EC.element_to_be_clickable(
                    (By.ID, \"com.tencent.mm:id/ijq\"))).click()
                    print(\"点击了发消息\")
                    #点击+号
                    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(\'点击+号\')
                        #判断是否为转账
                        is_zhuanzhang = wait.until(EC.element_to_be_clickable((By.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.text == \"转账\":
                        # 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:
                            #点击转账
                            el5 =  wait.until(EC.element_to_be_clickable((By.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.RelativeLayout/android.widget.ImageView[2]\")))
                            el5.click()
                            print(\'点击转账\')
                            #输入金额0.01
                            el6 = wait.until(EC.element_to_be_clickable((By.ID,\"com.tencent.mm:id/jf4\")))
                            el6.send_keys(\"0.01\")
                            print(\'输入金额\')
                            #点击确认转账
                            el7 =  wait.until(EC.element_to_be_clickable((By.ID,\"com.tencent.mm:id/e6c\")))
                            el7.click()
                            print(\'点击确认转账\')
                            time.sleep(2)
                            #判断是否有知道了
                            is_not_friend = is_element_exist(driver,\'id\',\'com.tencent.mm:id/ffp\')
                            if is_not_friend == True:
                            #点击知道了
                                el8 =  wait.until(EC.element_to_be_clickable((By.ID,\"com.tencent.mm:id/ffp\")))
                                el8.click()
                                print(\'点击知道了\')
                                #获取用户名称并打印
                                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:
                            #没有转账则返回到首页
                            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异常\')                    

这里已经扫描到200多个好友了,其中可能需要手动上滑一下

Python自动扫描出微信不是好友名单的方法

不是好友的名单会在当前目录生成一个txt文件进行保存

Python自动扫描出微信不是好友名单的方法

偶然出现几个异常,不知道是什么原因

Python自动扫描出微信不是好友名单的方法

总的来说功能基本都已经实现了,还有细节问题后面看情况优化吧

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容