#! /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"失败一个")
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. 经过简单扩展后,程序可以实现更多效果,可以把好友头像下载到本地。