Pywinauto操作wx,自动复制wx

681 阅读4分钟
#! /usr/bin/env python
# coding=utf-8
# pywinauto自动化操作微信号
# https://zhuanlan.zhihu.com/p/29944988

'''
0. 这个程序实现的效果是,当PC版微信已经切换到好友列表页时,手动地把前面那些群翻过去,直到看到A开头的好友,再开始运行程序,按下键盘上的 向下 键,切换好友,然后双击屏幕上右侧显示的微信号,复制到剪贴版,保存。代码是python 2 风格的。
get_screenxy_from_bmp(main_bmp,son_bmp),这个函数,实现的是,在main_bmp中匹配son_bmp,如果找到了,返回son_bmp在main_bmp里的坐标,以及son_bmp的大小。
2. 昨天我这网络有问题,或者只是我没仔细看,没看到原文这里博主的weixin.bmp示意,好在我自己也琢磨明白了。这块的意思是,预先手动把窗口右侧的“微信号”三个字位置的图片剪切出来,保存成weixin.bmp,然后调用get_screenxy_from_bmp函数,在1.bmp中定位。
3. 主函数里pic = ImageGrab.grab((0,0,623,454)),四个参数是微信窗口的左上角坐标和右下角坐标,右下这个坐标,需要根据自己本地的情况确认一下。
4. app.window_(title=u"微信",class_name="WeChatMainWndForPC").click_input(coords=(208,477)),这一行最后这个坐标,应该是为了让下一次按下键盘向下键时能实现切换好友,我这里需要用另一个坐标。我也尝试了另一种方法:好友列表中,被选中的好友,背景色会变化,可以找到背景色不同的位置,点击鼠标。
5. 经过简单扩展后,程序可以实现更多效果,可以把好友头像下载到本地。
'''

import win32clipboard as wc
import win32con
from pywinauto.application import *
from PIL import ImageGrab
import time


def get_screenxy_from_bmp(main_bmp, son_bmp):
    # 获取屏幕上匹配指定截图的坐标->(x,y,width,height)
    from PIL import Image
    img_main = Image.open(main_bmp)
    img_son = Image.open(son_bmp)
    datas_a = list(img_main.getdata())
    datas_b = list(img_son.getdata())

    for i, item in enumerate(datas_a):
        if datas_b[0] == item and datas_a[i + 1] == datas_b[1]:
            yx = divmod(i, img_main.size[0])
            main_start_pos = yx[1] + yx[0] * img_main.size[0]

            match_test = True
            for n in range(img_son.size[1]):
                main_pos = main_start_pos + n * img_main.size[0]
                son_pos = n * img_son.size[0]

                if datas_b[son_pos:son_pos + img_son.size[0]] != datas_a[main_pos:main_pos + img_son.size[0]]:
                    match_test = False
                    break
            if match_test:
                return (yx[1], yx[0], img_son.size[0], img_son.size[1])
    return False


def getCopyText():
    wc.OpenClipboard()
    copy_text = wc.GetClipboardData(win32con.CF_TEXT)
    wc.CloseClipboard()
    return copy_text.decode('GBK')



## 开始连接
oks = []
wxPath = r"D:\Program Files (x86)\Tencent\WeChat\WeChat.exe"
app = Application().start(wxPath)
if not app.windows():
    app = Application().connect(path=wxPath)

app.window(title=u"微信", class_name="WeChatMainWndForPC").move_window(0, 0)


## 打开通讯录
app.window(title=u"微信", class_name="WeChatMainWndForPC").click_input(coords=(24, 148)) # 点击通讯录
app.window(title=u"微信", class_name="WeChatMainWndForPC").click_input(coords=(165, 190)) # 点击通讯录列表

## 开始操作
nb = 0
while 1:
    if nb > 140:
        break
    else:
        nb = nb + 1
        app.window(title=u"微信", class_name="WeChatMainWndForPC").type_keys("{DOWN}")
        time.sleep(.5)
        pic = ImageGrab.grab((0, 0, 700, 500))
        pic.save('1.bmp')

        ok = get_screenxy_from_bmp(u'1.bmp', u'weixin.bmp')
        print("ok>>", ok)
        if ok == False:
            continue

        # 选中
        # double_click_input 双击指定坐标
        app.window(title=u"微信", class_name="WeChatMainWndForPC").double_click_input(coords=(ok[0] + 100, ok[1] + 10))
        # 拷贝
        app.window(title=u"微信", class_name="WeChatMainWndForPC").type_keys("^c")  # ctrl+c
        app.window(title=u"微信", class_name="WeChatMainWndForPC").click_input(coords=(208, 477))  # 单击指定坐标
        weixin = getCopyText()
        print("weixin>>", weixin)

        if weixin not in oks:
            oks.append(weixin)
            f = open("weixin.txt", "a")
            f.write(weixin + "\n")
            f.close()
        else:
            print(u"失败一个")

zhuanlan.zhihu.com/p/29944988 

0. 这个程序实现的效果是,当PC版微信已经切换到好友列表页时,手动地把前面那些群翻过去,直到看到A开头的好友,再开始运行程序,按下键盘上的 向下 键,切换好友,然后双击屏幕上右侧显示的微信号,复制到剪贴版,保存。代码是python 2 风格的。 

1. get_screenxy_from_bmp(main_bmp,son_bmp),这个函数,实现的是,在main_bmp中匹配son_bmp,如果找到了,返回son_bmp在main_bmp里的坐标,以及son_bmp的大小。 

2. 昨天我这网络有问题,或者只是我没仔细看,没看到原文这里博主的weixin.bmp示意,好在我自己也琢磨明白了。这块的意思是,预先手动把窗口右侧的“微信号”三个字位置的图片剪切出来,保存成weixin.bmp,然后调用get_screenxy_from_bmp函数,在1.bmp中定位。 

3. 主函数里pic = ImageGrab.grab((0,0,623,454)),四个参数是微信窗口的左上角坐标和右下角坐标,右下这个坐标,需要根据自己本地的情况确认一下。 

4. app.window_(title=u"微信",class_name="WeChatMainWndForPC").click_input(coords=(208,477)),这一行最后这个坐标,应该是为了让下一次按下键盘向下键时能实现切换好友,我这里需要用另一个坐标。我也尝试了另一种方法:好友列表中,被选中的好友,背景色会变化,可以找到背景色不同的位置,点击鼠标。 

5. 经过简单扩展后,程序可以实现更多效果,可以把好友头像下载到本地。