一、功能描述

实现微信、QQ等聊天软件的自动回复功能,让你关注的人不用再等候你的回复。通过机器人或者预设消息来自动回答对方的问题。

二、实现方案

0. 方案说明

首先感谢热心网友指出了 itchat 和 wxpy 等插件方案已无法使用的问题,并且看到了基于 hook 的一种方案,不过基于 hook 方案的作者也说明可能有封号风险。

本方案主要构思则是结合各种python库分别实现:界面截图文字识别机器人api调用模拟window键鼠复制文字并发送消息等功能。
从而实现对于打开的指定聊天界面定时识别聊天信息并调用api回复消息的效果。

此外,本方案的图片文字识别功能并没有使用百度AI平台提供的OCR服务,而是使用了免费的本地服务 tesserocr,不需要额外注册,tesserocr 的识别准确率和速度也足够用了,最重要的是免费~

1. 开发环境&工具

conda + python 3.9 + pycharm

2. 必要依赖库安装

2.1 图片操作和文字识别相关库

参考文章:python3.9 安装 tesserocr 过程

  1. tesserocr 文字识别应用安装,下载地址
    本文选用的时目前最新版本的 tesseract-ocr-w64-setup-v5.0.1.20220118,经测试是适配python3.9的。
    安装过程注意:勾选 Additional language data (download) 中的 Chinese-Simplied 中文简体,用于识别中文,其他默认就行
  2. conda install -c simonflueckiger tesserocr pillow
  3. 找到第一步 tesserocr 安装目录下的tessdata 文件夹,全量复制到本地的conda目录下的 /envs/你的python环境对应文件夹 下,如果不知道conda目录在哪里,完成第二步后,运行下面的demo,查看报错中给出的文件路径。
from PIL import Image
import tesserocrif __name__ == "__main__":pic_files = glob.glob('D:\\test.jpg')img = Image.open(pic_files[0])res = tesserocr.image_to_text(img, lang='chi_sim+eng', psm=6)print('识别结果', res)

2.2 剪贴框、键鼠操作库

pip install pyperclip PyUserInput pywin32==225

这里有个坑就是安装了 PyUserInput
虽然
from pymouse import PyMouse
from pykeyboard import PyKeyboard
这两个依赖引入不会报红了,但是编译时会报错“缺失win32api,win32con依赖”,所以需要安装 225 版本的pywin32,这里用最新版本也会报其他错。

三、demo 代码

# !/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob
import re
import os
from os import path
from PIL import ImageGrab, Image
import tesserocr
import time
import json
import requests
import pyperclip
from pymouse import PyMouse
from pykeyboard import PyKeyboard# 历史消息内存缓存
his_cache = {}
# 截图保存路径
file_path = 'D:\\tmp'
# 监听频率,单位秒
listen_rate = 5
# 是否发送消息标记
send_flag = False
# app类型 WX / QQ
app = 'QQ'm = PyMouse()
k = PyKeyboard()
# 屏幕分辨率
x_dim, y_dim = m.screen_size()
# 窗口距离屏幕右侧的距离
# offset = 0
offset = 630 if app == 'WX' else 0def snapshot():# 屏幕快照方法# (x1, y1), (x2, y2) 用于控制对屏幕聊天截图的范围# 最佳范围可以通过单独运行snapshot方法查看截图效果调整x1, y1 = int(x_dim * 2 * 3 / 64) + offset, int(y_dim * 2 * 2 / 32)x2, y2 = int(x_dim * 2 * 9 / 32) + offset, int(y_dim * 2 * 24 / 32)box = (x1, y1, x2, y2)pic = ImageGrab.grab(box)name = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())full_path = path.join(file_path, '%s.jpg' % name)pic.save(full_path)return full_pathdef read_img(full_path: str):# 聊天记录识别方法global his_cachemessage = ''robot_key = 'robot_his'pic_files = glob.glob(full_path)if len(list(pic_files)) > 0:file_name = path.basename(pic_files[0])img = Image.open(pic_files[0])print('\n识别图片:', file_name)message = tesserocr.image_to_text(img, lang='chi_sim+eng', psm=6)message = str(message)# 非法字符过滤,只保留中文文本message = re.sub(r'[^\u4E00-\u9FFF]', ' ', message)message = re.sub(r'[ ]+', ' ', message)message = message.strip()print('识别文本:', message)arr = message.split(' ')if len(arr) > 0:message = arr[-1]print('最新消息:', message)# 及时清理已识别的图片缓存if os.path.exists(full_path):os.remove(full_path)# 历史和当前文本对比if len(message) > 0:if message.startswith('清空'):his_cache = {}print('已清空历史消息')return ''# 读取消息缓存msg_his = his_cache.get(robot_key)print('历史消息:', msg_his)if msg_his:# 当前消息与历史消息对比if msg_his == message:print('未收到新消息')return ''# 超长文本情况处理i = 0while i < len(msg_his):msg_s = msg_his[i:]if message.startswith(msg_s):msg_arr = message.split(msg_s, 1)if len(msg_arr) > 1:message = msg_arr[1]breaki += 1# 更新消息缓存his_cache[robot_key] = messagereturn messagedef get_dialog(msg: str):# 机器人api调用answer = 'hello world'try:# 这里填你自己的机器人接口地址,本文不提供,开源的机器人接口有不少,看个人需求url = ''sess = requests.get(url)answer = sess.text# answer = json.loads(answer)except Exception as e:print(e)return answerdef mock_msg(msg: str):# 模拟键鼠发消息方法# 获取机器人回答answer = get_dialog(msg)print('输入问题:', msg)print('返回答案:', answer)# 复制文本到剪贴框pyperclip.copy(answer)pyperclip.paste()# 模拟鼠标点击,用于获取聊天软件输入框焦点x_pos = int(x_dim * 1/32) + offsety_pos = int(y_dim * 28/32)# print('x', x_pos, 'y', y_pos)m.click(x_pos, y_pos, 1)# 模拟键盘点击 ctrl+v,用于将剪贴框文字粘贴到输入框k.press_key(k.control_key)k.tap_key('v')k.release_key(k.control_key)# 模拟键盘发送消息if app == 'QQ':k.press_key(k.control_key)k.tap_key(k.enter_key)k.release_key(k.control_key)elif app == 'WX':k.tap_key(k.enter_key)if __name__ == "__main__":# snapshot()while True:f_path = snapshot()f_msg = read_img(f_path)if send_flag:if len(f_msg) > 0:mock_msg(f_msg)# 对回复后的聊天界面再次识别,更新界面状态记录b_path = snapshot()b_msg = read_img(b_path)print(b_msg)else:# 首次运行不发送消息,只更新消息缓存用于下次对比send_flag = Truetime.sleep(listen_rate)

四、操作注意

首先本文demo中设置的分辨率相关参数仅适配作者的电脑,其次如果直接使用demo中的参数,建议将聊天软件界面放到屏幕左半边,并将上下长度拉满!

python实现微信、QQ聊天自动回复【纯物理】相关推荐

  1. android标题栏不被顶上去,Android仿微信QQ聊天顶起输入法不顶起标题栏的问题

    在这记录一下输入法弹出的一系列问题,有的输入法弹出就把整个布局弹上去,有的输入法弹出布局不会有变化,有的输入法弹出遮盖输入框等等问题,网上也有很多说加着加那的,但是看一下都不是很完整,解决不了所有问题 ...

  2. python如何实现微信自动聊天_如何利用python实现微信智能聊天功能,具体该怎么做?...

    这个实现不难,需要先安装一下itchat库,之后注册一下图灵机器人,最后就可以编程实现微信智能聊天功能了,下面我简单介绍一下实现过程,实验环境win10+python3.6+pycharm5.0,主要 ...

  3. Python 打造微信群聊天机器人(带操作界面)

    前言 这几天我的一个小伙伴问我能不能给 Ta 做一个配置灵活的微信群聊天机器人,之前了解过 itchat 库的使用,我就爽快的答应了,花了一个晚上,终于做出了雏形. 电脑上运行程序如下: 手机上的信息 ...

  4. python开发微信公众号自动回复音乐

    利用python开发微信公众号,对接实现自动回复音乐,并下载音乐,是公众号更自动化. 本次采用新浪sae部署,新浪sae 1.新浪SAE 创建python应用 1)选择共享环境,使用多少扣费多少,不适 ...

  5. 防qq聊天界面纯HTML5,html5 实现qq聊天的气泡效果

    教程:http://m.blog.csdn.net/blog/yhc13429826359/38778337 写的很好.自己实现的时候,由于img float:left,会脱离文档流,导致结构混乱. ...

  6. python提取微信聊天语音_利用Python进行微信,QQ的语音识别!内部技术的延伸版!...

    现在的最火两款聊天工具,QQ和微信,但是很多的时候不方便听别人发的语音,这时候这个功能就能派上用场了,当然了,不止能识别QQ语音还有一些没有字幕的电影也能识别出来,好了废话不多说,马上切入咱们的主题! ...

  7. 用Python调教微信,实现自动回复 和 微信好友分布,好友性别图,好友标签

    官方华丽的术语---略 一个自动回复机器人 微信自上线以来,一直没有自动回复的功能,想必是有他们的理念.但是有些人群,确实对此功能有一定需求,我举两个栗子: 不愿时刻被消息打扰的人 消息需要批量处理的 ...

  8. python微信好友检测_用Python调教微信,实现自动回复 和 微信好友分布,好友性别图,好友标签...

    官方华丽的术语---略 一个自动回复机器人 微信自上线以来,一直没有自动回复的功能,想必是有他们的理念.但是有些人群,确实对此功能有一定需求,我举两个栗子: 不愿时刻被消息打扰的人 消息需要批量处理的 ...

  9. iOS 类似微信,QQ聊天界面的气泡聊天简单实现Demo

    以下是YYKit组件的源码分析,高级性能优化相关都在里面可以找到 YYwebImage超细源码分析 YYImage超细源码分析 YYModel源码分析YYText源码分析 12.27日更新:分析了一个 ...

最新文章

  1. 本地Windows 7/8上搭建IIS服务器
  2. leetcode 454 四数相加
  3. 【Linux】Centos7 解压zip文件
  4. 设计模式C++实现--Interpreter模式
  5. ai创造了哪些职业_关于创造职业的思考
  6. JS成员函数声明位置优化
  7. 硬链接与符号链接的比较?
  8. 计算机二级必备快捷键知识,计算机二级考试中的一些注意事项️
  9. ImportError: dlopen: cannot load any more object with static TLS 解决
  10. 23种设计模式(十)对象创建之构建器
  11. Fiori 磁贴配置
  12. 如果宁静是Oracle,那万茜,张雨绮,黄圣依 是什么?(附姐姐信息表)
  13. ubuntu进去安全模式_ubuntu 14.04全攻略
  14. 网站增加百度收录最有效的方法!!!!!!
  15. 全新全球电竞赛事--世界超级联赛WSL发布首项赛事计划
  16. Maven中央仓库地址(实用版)
  17. spring事务 调用同类方法,同类方法要事务不生效怎么办
  18. linux常用关机命令shutdown、halt、poweroff、init用法
  19. OSChina 周四乱弹 —— 但愿那个嘴上说着拒绝的人,其实心里最爱的是你。
  20. 怎样下载网页flash

热门文章

  1. 在财报来临之际,做好迎接英伟达股价再次暴跌的准备
  2. 无人值守-污水处理远程智慧运维系统
  3. 前端之HTML 文本、超链接
  4. 【运营推广】APP运营推广超级攻略(2015新版)
  5. PCA:从入门到入土到入神
  6. 浙江大学计算机应用基础登录,浙江大学远程教育计算机应用基础1.计算机基础知识题...
  7. 雷达回波识别:非降水气象回波和非气象回波
  8. Android应用的欢迎界面动画实现
  9. 何为Referring Expression(指称表达)?
  10. linux解压文件卡住,Linux系统下常见的压缩文件及解压方法