Python微信祝福发送器 ---- 大合体
重要的知识点前几节都讲了,再加上这个小程序本身也不算复杂,因此,直接给出完整的带有注释的代码,大伙慢慢品尝。
'''
# 根据不同好友昵称进行群发
## 代码执行流程
1. 使用模版匹配匹配到通讯录界面
2. (列表处于关闭状态)使用模版匹配匹配到联系人列表
3. 使用程序模拟点击,展开联系人列表
4. 使用程序模拟键盘方向键,使焦点聚集到第一个联系人
(5. 使用模版匹配匹配到"备注名",并使用OCR获取到备注名信息)分辨率太低,失败
5. 使用模版匹配匹配到"备注名",并复制备注名信息。
6. 使用颜色匹配匹配到发消息按钮,并模拟点击
7. 将备注名信息和你需要发送到祝福信息进行祝贺,添加到剪贴板
8. 使用程序模拟粘贴
9. 重复1~8直到结束
## 使用到的点
- Opencv模版匹配(完成)
- 按键模拟
- Opencv颜色匹配
- OCR光学识别(失败)
- 操作剪贴板(完成)
'''
import time
import numpy as np
from PIL import ImageGrab
import cv2
from pymouse import *
from pykeyboard import *
import pyperclip
# 截取屏幕
def capture(imgName):
print('开始截屏。。。')
# 截取屏幕
img = ImageGrab.grab()
# 将pil图像转为array
img = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 4)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite(imgName, img)
print('截取完毕。')
# 模版匹配
def template(srceen, temp):
print('开始匹配。。。')
# 读取目标图片
target = cv2.imread(srceen)
# 读取模板图片
template = cv2.imread(temp)
# 获得模板图片的高宽尺寸
tHeight, tWidth = template.shape[:2]
# 执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)
# 归一化处理
cv2.normalize(result, result, 0, 1, cv2.NORM_MINMAX, -1)
# 寻找矩阵(一维数组当做向量,用Mat定义)中的最大值和最小值的匹配结果及其位置
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
# 计算需要点击的坐标
targetPoint = (minLoc[0]+tWidth//2,minLoc[1]+tHeight//3)
# # 测试代码,用来观察匹配是否成功
# cv2.circle(target, targetPoint, 10, (0, 0, 255), -1)
# cv2.imshow("title",target)
# cv2.waitKey(0)
# assert 1==2
print('匹配完毕。')
return targetPoint
# 模拟点击
def simuClick(selfMouse, peoplePoint=None, firstFlag=0):
# 1.1 获取当前屏幕截图
if firstFlag==0:
capture('screen1.jpg')
# 1.2 使用模版匹配匹配到通讯录界面
peoplePoint = template('screen1.jpg','template1.png')
print(peoplePoint)
selfMouse.click(int(peoplePoint[0]), int(peoplePoint[1]), 1)
if firstFlag==0:
time.sleep(1)
# 2.1 获取当前屏幕截图
capture('screen2.jpg')
# 2.2 (首次进入通讯录界面)使用模版匹配匹配到联系人列表
listPoint = template('screen2.jpg','template2.png')
selfMouse.click(int(listPoint[0]), int(listPoint[1]), 1)
return peoplePoint
# 获取备注昵称
def getName(selfKey, selfMouse):
# 5.1 使用模版匹配匹配到"备注名",并复制备注名信息。
namePoint = template('screen2.jpg','template3.png')
leftMove = 100
namePoint = (namePoint[0]+100, namePoint[1])
selfMouse.click(int(namePoint[0]), int(namePoint[1]), 1)
# 5.2 全选名称并复制到剪切板
# 全选备注信息
# selfKey.press_keys(['Command', 'a'])
selfKey.press_keys([selfKey.control_key, 'a'])
# 拷贝
# selfKey.press_keys(['Command', 'c'])
selfKey.press_keys([selfKey.control_key, 'c'])
# 延时0.3秒用于等待剪切板更新
time.sleep(0.3)
# 读取剪切板的信息
pasteData = pyperclip.paste()
return pasteData
# 发送信息
def sendData(nameData, selfKey, selfMouse, selfData = ",好久不见,新年快乐呀~"):
buttonPoint = template('screen2.jpg','template4.png')
selfMouse.click(int(buttonPoint[0]), int(buttonPoint[1]), 1)
allData = nameData + selfData
pyperclip.copy(allData)
time.sleep(0.3)
# selfKey.press_keys(['Command', 'v'])
# selfKey.tap_key('return')
selfKey.press_keys([selfKey.control_key, 'v'])
selfKey.tap_key(selfKey.enter_key)
def main(maxNum=10):
selfKey = PyKeyboard()
selfMouse = PyMouse()
noneBlack = np.zeros((100, 100))
peoplePoint = None
flag = 0
while flag < maxNum:
# 步骤1-3
peoplePoint = simuClick(selfMouse, peoplePoint, flag)
# 4. 使用程序模拟键盘方向键,使焦点聚集到第一个联系人
selfKey.tap_key(k.down_key)
# 5. 获取好友的备注名
nameData = getName(selfKey, selfMouse)
# 步骤6-8
sendData(nameData, selfKey, selfMouse)
# 该窗口用于提前终止程序
cv2.imshow('control_win', noneBlack)
key = cv2.waitKey(1000)
if key == 27:
break
flag += 1
if __name__ == '__main__':
main()
其中值得注意的是,四张template图像需要读者自己使用截图工具进行生成。还有一点,虽然这个程序在我的电脑上能够正常的运行,但是如果各位看官想要拿去使用,可能需要进行自定义的调整。不过需要调整的内容我已经在前几节中以知识点的方式给出,应该不会太麻烦。当然,这只是一个破破烂烂的小程序,不具有完备性,如果感兴趣的小伙伴,可以试试添加上UI,或者让操作更加的人性化。
系列文章的链接
Python微信祝福发送器 ---- 序章
Python微信祝福发送器 ---- 模版匹配
Python微信祝福发送器 ---- 鼠标和键盘模拟
Python微信祝福发送器 ---- 大合体