QQ自动发送消息
python包导入
import time
import pandas as pd
import pyautogui
import pyperclip
图像识别函数封装
本程序使用pyautogui模块控制鼠标和键盘来实现QQ自动发送消息,因此必须得到需要点击位置的坐标(当然也可以在程序中将位置写死,这样的话就可以省略这个函数),所以我们通过pyautogui的locateOnScreen函数来定位需要点击位置的坐标。
def locate_image_on_screen(image_path, confidence=0.7):
"""
在屏幕上查找指定图像的位置
:param image_path: 图像文件的路径
:param confidence: 匹配的置信度,范围从0到1,值越高匹配越严格
:return: 图像中心的坐标,如果未找到则返回None
"""
try:
location = pyautogui.locateOnScreen(image_path, confidence=confidence)
return pyautogui.center(location)
except:
return None
所以在使用此程序时,需要准备几张截图:
① 搜索框截图
② 消息发送框截图
③ 关闭按钮截图
由于locateOnScreen返回的是图像中心位置的坐标,所以使用时需要进行一定程度偏移,具体偏移程度由实际情况决定。
消息循环发送函数封装
def qq_contacts_message(contacts_messages, search_box_path, input_box_path, cross_path):
"""
循环发送消息
:param contacts_messages: 联系人与发送消息所对应的excel表格
:param search_box_path: 搜索框截图路径
:param input_box_path: 消息发送框截图路径
:param cross_path: 关闭按钮截图路径
"""
# 程序暂停,留时间让用户打开应用(此处留3秒)
time.sleep(3)
# 循环遍历联系人_发送内容表格
for _, row in contacts_messages.iterrows():
# 每次发送前等待1秒,以免上一个窗口未关闭
time.sleep(1)
# 复制联系人到剪切板
pyperclip.copy(row.iloc[0])
# 识别搜索框并点击
search_box_location = locate_image_on_screen(search_box_path)
pyautogui.click(search_box_location)
# 粘贴内容到搜索框
pyautogui.hotkey('ctrl', 'v')
# 下移一定位置,点击搜素结果,进入联系人界面
x, y = search_box_location
new_y = y + 110 # 此处下移110px,根据不同使用者,需要更改
pyautogui.moveTo(x, new_y, duration=1)
pyautogui.click(x, new_y)
pyautogui.keyDown('enter')
# 点击发送框,复制粘贴发送内容并发送
time.sleep(2) # 点击发送框前,暂停2秒,以免图片识别时联系人界面还未打开
input_box_location = locate_image_on_screen(input_box_path)
x, y = input_box_location
pyautogui.click(x, y+100)
pyperclip.copy(row.iloc[1])
pyautogui.hotkey('ctrl', 'v')
pyautogui.hotkey('ctrl', 'enter')
# 点击关闭按钮关闭聊天界面
cross_location = locate_image_on_screen(cross_path)
x, y = cross_location
pyautogui.moveTo(x+60, y, duration=0.5)
pyautogui.click(cross_location)
pyautogui.keyDown('enter')
程序中有些地方需要注意:
① time.sleep函数:为了避免在进行图片识别时,对应界面还未打开,导致定位失败,因此需要暂停一定时间,使得每一个图像可以被正常识别
② 位置偏移:函数定位的坐标是图像的中心位置,不一定是我们需要点击的位置,所以需要进行一定偏移。如点击关闭按钮时,根据函数定位得到的坐标可能是全屏按钮,所以需要向右偏移60px
最终代码:
import time
import pandas as pd
import pyautogui
import pyperclip
def locate_image_on_screen(image_path, confidence=0.7):
"""
在屏幕上查找指定图像的位置
:param image_path: 图像文件的路径
:param confidence: 匹配的置信度,范围从0到1,值越高匹配越严格
:return: 图像中心的坐标,如果未找到则返回None
"""
try:
location = pyautogui.locateOnScreen(image_path, confidence=confidence)
return pyautogui.center(location)
except:
return None
def qq_contacts_message(contacts_messages, search_box_path, input_box_path, cross_path):
"""
循环发送消息
:param contacts_messages: 联系人与发送消息所对应的excel表格
:param search_box_path: 搜索框截图路径
:param input_box_path: 消息发送框截图路径
:param cross_path: 关闭按钮截图路径
"""
# 程序暂停,留时间让用户打开应用(此处留3秒)
time.sleep(3)
# 循环遍历联系人_发送内容表格
for _, row in contacts_messages.iterrows():
# 每次发送前等待1秒,以免上一个窗口未关闭
time.sleep(1)
# 复制联系人到剪切板
pyperclip.copy(row.iloc[0])
# 识别搜索框并点击
search_box_location = locate_image_on_screen(search_box_path)
pyautogui.click(search_box_location)
# 粘贴内容到搜索框
pyautogui.hotkey('ctrl', 'v')
# 下移一定位置,点击搜素结果,进入联系人界面
x, y = search_box_location
new_y = y + 110 # 此处下移110px,根据不同使用者,需要更改
pyautogui.moveTo(x, new_y, duration=1)
pyautogui.click(x, new_y)
pyautogui.keyDown('enter')
# 点击发送框,复制粘贴发送内容并发送
time.sleep(2) # 点击发送框前,暂停2秒,以免图片识别时联系人界面还未打开
input_box_location = locate_image_on_screen(input_box_path)
x, y = input_box_location
pyautogui.click(x, y+100)
pyperclip.copy(row.iloc[1])
pyautogui.hotkey('ctrl', 'v')
pyautogui.hotkey('ctrl', 'enter')
# 点击关闭按钮关闭聊天界面
cross_location = locate_image_on_screen(cross_path)
x, y = cross_location
pyautogui.moveTo(x+60, y, duration=0.5)
pyautogui.click(cross_location)
pyautogui.keyDown('enter')
if __name__ == '__main__':
# 联系人与发送内容对应excel表格地址
contacts_messages_path = r'D:\Code\Utils\tools\files\qq_contacts_message.xlsx'
# 搜索框截图地址
search_box_path = r'D:\Code\Utils\tools\files\qq_search_box.png'
# 输入框截图地址
input_box_path = r'D:\Code\Utils\tools\files\qq_input_box.png'
# 关闭按钮截图地址
cross_path = r'D:\Code\Utils\tools\files\qq_cross.png'
# 读取联系人_发送内容excel表格
contacts_messages = pd.read_excel(contacts_messages_path)
# 调用函数循环发送
qq_contacts_message(contacts_messages, search_box_path, input_box_path, cross_path)
最后
上述代码还有许多需要改进的地方,例如当图像识别失败时,该程序或许会报错导致程序终止,读者可以进一步使用try…except…进行处理。