Python微信祝福发送器 ---- 大合体

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微信祝福发送器 ---- 大合体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值