QQ自动发送消息

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…进行处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965863.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.1计算机网络基本知识

5.1.1计算机网络概述 目前,三网融合(电信网络、有线电视网络和计算机网络)和宽带化是网络技术的发展的大方向,其应用广泛,遍及智能交通、环境保护、政府工作、公共安全、平安家居等多个领域,其中发展最快的并起到核心作用的则是计…

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上,其内部结构如图4-1所示。作为单一芯片的计算机,它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU,由运算器和控制器两个部分构成;…

13.PPT:诺贝尔奖【28】

目录 NO1234 NO567 NO8/9/10 NO11/12 NO1234 设计→变体→字体→自定义字体 SmartArt超链接新增加节 NO567 版式删除图片中的白色背景:选中图片→格式→删除背景→拖拉整个图片→保留更改插入→图表→散点图 :图表图例、网格线、坐标轴和图表标题…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者:闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式(Simple Queue)工作队列模式(Work Queue)发布/订阅模式(Publish/Subscribe&#xff…

DFX(Design for eXcellence)架构设计全解析:理论、实战、案例与面试指南*

一、什么是 DFX ?为什么重要? DFX(Design for eXcellence,卓越设计)是一种面向产品全生命周期的设计理念,旨在确保产品在设计阶段就具备**良好的制造性(DFM)、可测试性(…

【Elasticsearch】diversified sampler

作用就是聚合前的采样,主要是采样 它就是用来采样的,采完样后在进行聚合操作 random_sampler和diversified_sampler是 Elasticsearch 中用于聚合查询的两种采样方法,它们的主要区别如下: 采样方式 • random_sampler&#xff1a…

2月7号.

二叉树是一种特殊的树形数据结构,具有以下特点: 基本定义 节点的度:二叉树中每个节点最多有两个子节点,分别称为左子节点和右子节点。 子树的顺序性:二叉树的子树有左右之分,且顺序不能颠倒。 递归定义&…

openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包

文章目录 openpnp2.2 - 环境搭建 - 编译 调试 打包概述笔记前置任务克隆代码库切到最新的tag清理干净编译工程关掉旧工程打开已经克隆好的openpnp2.2工程将IDEA的SDK配置为openjdk23 切换中英文UI设置JAVA编译器 构建工程跑测试用例单步调试下断点导出工程的JAR包安装install…

【复现论文】DAVE

网站: GitHub - jerpelhan/DAVE 下载完以后,阅读 readme文件 新建终端,打印文件树,不包含隐藏文件: 命令:tree -I .* . ├── LICENSE ├── README.md ├── demo.py ├── demo_zero.py ├── mai…

GB/T28181 开源日记[8]:国标开发速知速会

服务端源代码 github.com/gowvp/gb28181 前端源代码 github.com/gowvp/gb28181_web 介绍 go wvp 是 Go 语言实现的开源 GB28181 解决方案,基于GB28181-2022标准实现的网络视频平台,支持 rtmp/rtsp,客户端支持网页版本和安卓 App。支持rts…

完美解决phpstudy安装后mysql无法启动

phpstudy数据库无法启动有以下几个原因。 **一、**自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突,从而造成phpstudy中的数据库无法启动,这时我们只需要将自己安装的MySQL的服务名改掉就行。 但是&#…

grafana面板配置opentsdb

新增面板: 这里add-panel: 如果不是想新增面板而是想新增一行条目,则点击convert to row: 在新增的面板这里可以看到选择数据源 Aggregator:聚合条件,区分下第一行和第二行的aggregator,第一个是对指标值的聚合&…

论文翻译学习:《DeepSeek-R1: 通过强化学习激励大型语言模型的推理能力》

摘要 我们介绍了我们的第一代推理模型 DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是一个通过大规模强化学习(RL)训练的模型,没有经过监督微调(SFT)作为初步步骤,展示了卓越的推理能力。通过强化…

【Uniapp-Vue3】从uniCloud中获取数据

需要先获取数据库对象: let db uniCloud.database(); 获取数据库中数据的方法: db.collection("数据表名称").get(); 所以就可以得到下面的这个模板: let 函数名 async () > { let res await db.collection("数据表名称…

【自然语言处理】TextRank 算法提取关键词(Python实现)

文章目录 前言PageRank 实现TextRank 简单版源码实现jieba工具包实现TextRank 前言 TextRank 算法是一种基于图的排序算法,主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性,类似于 Google 的 PageRank 算法。Tex…

免费windows pdf编辑工具

Epdf(完全免费) 作者:不染心 时间:2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器,目前仍在开发中。它提供了一系列实用的命令行选项,方便用户对 PDF …

星闪开发入门级教程之安装编译器与小项目烧录

系列文章目录 星闪开发入门级教程 好久不见,已经好几年没有发文章了,星闪-作为中国原生的新一代近距离无线联接技术品牌。我想着写点东西。为了适合新手,绝对小白文。 文章目录 系列文章目录前言一、Hispark Studio1.安装Hispark Studio2.安…

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException解决办法

1.问题描述 在编写完一个功能后,第一次启动这个模块的启动类时,报以下错误, 2.文件解决 检查了controller,service和mapper,均未发现有问题,核对了依赖也未发现依赖冲突 在网上也找了资料,有总结的比较好的: controller层service层dao层注解是否都使用正确?接口…

记录 | WPF基础学习Style局部和全局调用

目录 前言一、Style1.1 例子1.2 为样式起名字1.3 BasedOn 继承上一个样式 二、外部StyleStep1 创建资源字典BaseButtonStyle.xamlStep2 在资源字典中写入StyleStep3 App.xaml中写引用路径【全局】Step4 调用三、代码提供四、x:Key和x:Name区别 更新时间 前言 参考文章&#xff…

信创数据库使用问题汇总

笔者工作中需要使用多种信创数据库,在使用过程中发现一些问题,现记录如下。 1 OceanBase-Oracle租户的Python连接方式 用Python连接OB数据库的mysql租户可以使用连接mysql的包,但连接oracle租户是没有官方包的,必须使用基于jdbc…