微信聊天机器人,不使用iChat,可以群聊

article/2025/9/24 23:18:31

目录

1. 微信聊天界面截图

2. 图片文字识别

3. 获取最新消息

3.1 独聊

3.2 群聊

 4. 机器人聊天系统

5. 成果展示

6. 全部代码


本文参考大神【喵王叭】的文章:python实现微信、QQ聊天自动回复【纯物理】_喵王叭的博客-CSDN博客_python自动回复纯物理方式实现微信和QQ等任意聊天软件的自动回复功能,实验性质,自己搭着玩https://blog.csdn.net/weixin_40815218/article/details/124689147?spm=1001.2101.3001.6650.15&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-15-124689147-blog-105598293.pc_relevant_antiscanv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-15-124689147-blog-105598293.pc_relevant_antiscanv3&utm_relevant_index=21

由于ichat网页登录微信的方式,被腾讯禁止。其他的替代品也无法使用。本人小程序一枚,没钱使用大佬付费的软件,所以只能另辟蹊径。

先说原理:简单来说就是四个字:文字识别。微信聊天界面截图,对截图进行文字识别,判断是对方发送的最新消息,调用机器人系统,将机器人返回的消息,复制,粘贴到聊天内容框,enter点击发送。

具体步骤如下:

 我捡几个重要的步骤来讲解:

1. 微信聊天界面截图

截图软件,使用的是 PIL包的 ImageGrab 方法。首先确定聊天界面的两个分辨率点位,对两个点位组成的界面进行截图。

from PIL import ImageGrab, Image# (x1, y1), (x2, y2) 用于控制对屏幕聊天截图的范围
# 需要自己调整 两个点位的分辨率坐标
(x1, y1), (x2, y2) = (400,80) , (3840/2-300,2160-490)
box = (x1, y1, x2, y2)
pic = ImageGrab.grab(box)

代码里面的坐标,是根据自己的电脑调整的。3840,2160是我电脑的分辨率。可以通过

ImageGrab.grab().size

获取电脑的分辨率,然后调整微信聊天页面的大小(比如占用左半边的屏幕),随之调整坐标的值,得到完整的聊天界面截图。

下图是我的微信聊天截图:

2. 图片文字识别

大神用的是tesserocr包的文字识别,但是这个包的文字识别准确率不高,而且无法定位是自己发送还是对方发送的最新消息【其实我也没有测过】。因此我们用 科大讯飞的免费的图片识别API(也测试过百度免费的图片识别API,同样只能识别文字,无法判断谁发送的消息)。

有关科大讯飞免费图片识别API的申请方式,请参考官网:

通用文字识别-文字识别-讯飞开放平台

API使用文档(python)请参考官网:

通用文字识别 API 文档 | 讯飞开放平台文档中心

将讯飞提供的python demo代码进行封装def,如下:

from datetime import datetime
from wsgiref.handlers import format_date_time
from time import mktime
import hashlib
import base64
import hmac
from urllib.parse import urlencode
import json
import requests'''
1、通用文字识别,图像数据base64编码后大小不得超过10M
2、appid、apiSecret、apiKey请到讯飞开放平台控制台获取并填写到此demo中
3、支持中英文,支持手写和印刷文字。
4、在倾斜文字上效果有提升,同时支持部分生僻字的识别
'''
## 自己去官网申请获取APPId = ""  # 控制台获取
APISecret = ""  # 控制台获取
APIKey = ""  # 控制台获取def OCR_XF(filepath):with open(filepath, "rb") as f:imageBytes = f.read()class AssembleHeaderException(Exception):def __init__(self, msg):self.message = msgclass Url:def __init__(self, host, path, schema):self.host = hostself.path = pathself.schema = schemapass# calculate sha256 and encode to base64def sha256base64(data):sha256 = hashlib.sha256()sha256.update(data)digest = base64.b64encode(sha256.digest()).decode(encoding='utf-8')return digestdef parse_url(requset_url):stidx = requset_url.index("://")host = requset_url[stidx + 3:]schema = requset_url[:stidx + 3]edidx = host.index("/")if edidx <= 0:raise AssembleHeaderException("invalid request url:" + requset_url)path = host[edidx:]host = host[:edidx]u = Url(host, path, schema)return u# build websocket auth request urldef assemble_ws_auth_url(requset_url, method="POST", api_key="", api_secret=""):u = parse_url(requset_url)host = u.hostpath = u.pathnow = datetime.now()date = format_date_time(mktime(now.timetuple()))# print(date)# date = "Thu, 12 Dec 2019 01:57:27 GMT"signature_origin = "host: {}\ndate: {}\n{} {} HTTP/1.1".format(host, date, method, path)# print(signature_origin)signature_sha = hmac.new(api_secret.encode('utf-8'), signature_origin.encode('utf-8'),digestmod=hashlib.sha256).digest()signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % (api_key, "hmac-sha256", "host date request-line", signature_sha)authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')# print(authorization_origin)values = {"host": host,"date": date,"authorization": authorization}return requset_url + "?" + urlencode(values)url = 'https://api.xf-yun.com/v1/private/sf8e6aca1'body = {"header": {"app_id": APPId,"status": 3},"parameter": {"sf8e6aca1": {"category": "ch_en_public_cloud","result": {"encoding": "utf8","compress": "raw","format": "json"}}},"payload": {"sf8e6aca1_data_1": {"encoding": "jpg","image": str(base64.b64encode(imageBytes), 'UTF-8'),"status": 3}}}request_url = assemble_ws_auth_url(url, "POST", APIKey, APISecret)headers = {'content-type': "application/json", 'host': 'api.xf-yun.com', 'app_id': APPId}# print(request_url)response = requests.post(request_url, data=json.dumps(body), headers=headers)# print(response)# print(response.content)# print("resp=>" + response.content.decode())tempResult = json.loads(response.content.decode())# print(tempResult)finalResult = base64.b64decode(tempResult['payload']['result']['text']).decode()finalResult = finalResult.replace(" ", "").replace("\n", "").replace("\t", "").strip()# print("text字段Base64解码后=>" + finalResult)finalResult_js = json.loads(finalResult)return finalResult_js

为什么要用科大讯飞的API,因为讯飞的图片识别,可以给出文字新的详细坐标(x,y),通过坐标分辨出是对方发出的信息,还是我们自己发出的信息

Location_Friend_Spt = 200 ## 判断谁发出的坐标 x 的值
Friendlt = []  ## 对方发出信息集合
Melt = [] ## 我方发出信息集合
def ChatInfo(finalResult_js):Friendlt = []Melt = []for word in finalResult_js['pages'][0]['lines']:if 'words' in word.keys():if word['coord'][0]['x'] < Location_Friend_Spt:print('Fri->', word['words'][0]['content'])Friendlt.append(word['words'][0]['content'])else:print('                                ', word['words'][0]['content'], '<-Me')Melt.append(word['words'][0]['content'])## 返回朋友的所有消息return Friendlt

结果如下:

3. 获取最新消息

3.1 独聊

跟一个朋友聊天时:将上述 ChatInfo 返回的内容,放入如下函数:

def OneChat(Frilt):## 返回对方最新的消息return {'':Frilt[-1]}

3.2 群聊

如果是群聊时,需要预先设置群里每个人的名称,必须和群聊中显示的保持一直

GroupName = ['高艳子', '吴倩', '飞飞', '李苏娟']def GroupChat(Frilt,GroupName):## 获取群聊里面每个人最新消息def FriName(x):if x in GroupName:return xelse:return pd.NAdf = pd.DataFrame({"Dialogue": Frilt})df['FriName'] = df['Dialogue'].apply(FriName)df['FriName'] = df['FriName'].fillna(method='ffill')df['row_num'] = df.index.to_list()df = df[df['FriName'].notnull()]df = df.sort_values(['FriName','row_num'],ascending=[True,False]).drop_duplicates(['FriName'])## 返回对方最新的消息dialogue = df['Dialogue'].tolist()FriName = df['FriName'].tolist()## 将每个人最新消息,存储在json里面dial_info_json = {}for index, value in enumerate(dialogue):dial_info_json[FriName[index]] = valuereturn dial_info_json

 群聊函数返回的内容是每个人的最新消息。如下图:

 4. 机器人聊天系统

本文采用的是  青云客 免费的机器人聊天系统。

import requests
import json## 调用青云客的API,免费的API
def qingyunke(msg:str):data = requests.get("http://api.qingyunke.com/api.php?key=free&appid=0&msg=" + msg).contentdata = json.loads(data)data = data['content'].replace("{br}","\n")return data

如果资金雄厚的,可以购买付费的聊天机器人。目前最经典的机器人系统是 图灵机器人,之前是免费的,现在也收钱了。

也可以自己搭建聊天机器人。我参考大神 基于医疗知识图谱的问答系统 搭建了一套医疗机器人,有兴趣的同学,可以私信我。

## 在本地创建的医疗机器人
## 有兴趣的可以参考 https://zhuanlan.zhihu.com/p/379202949 文章内容,将 local.py 改成api形式即可。
def medical_robot(msg:str):url = "http://localhost:60063/service/api/medical_robot"data = {"question": msg }print('data', data)headers = {'Content-Type': 'application/json;charset=utf8'}response = requests.post(url, data=json.dumps(data), headers=headers)# print('response', response)if response.status_code == 200:response = json.loads(response.text)# print(response, '========')return response["data"]else:return "您的问题我无法理解,我还需要学习"

5. 成果展示

群聊,闲聊机器人

6. 全部代码

微信聊天机器人(github源码)https://github.com/chengzhen123/WeChatRobot


http://chatgpt.dhexx.cn/article/g2HvSbg2.shtml

相关文章

tomcat的开发模式和生产模式

tomcat这两种模式对大家的影响主要是在jsp的开发当中。大家都知道jsp需要先编译成servlet源文件并编译为字节码&#xff0c;即生成.class文件才可以执行&#xff0c;所以在jsp文件首次运行时先要进行编译导致运行较慢&#xff0c;之后的访问都会直接进入执行阶段。 在开发模式下…

chrome开发模式下清除缓存问题

介绍&#xff1a; 在开发的时候经常会遇到这样的问题&#xff0c;后台js修改&#xff0c;前台怎么也清除不了缓存的问题&#xff0c;包括使用ctrlf5都没有办法处理,今天教大家一种方式&#xff0c;在chrome中采用开发模式下彻底清除缓存问题 一、打开chrome&#xff0c;随便访…

微信小程序-云开发模式pk传统开发模式【详细】

👨‍🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 小伙伴们,说起开发微…

软件开发模式之敏捷开发(scrum)

简介 这几年关于敏捷开发在互联网企业中越来越广泛被使用到&#xff0c;运用的比较多的当属scrum敏捷开发和xp敏捷开发&#xff0c;人人都在谈论敏捷开发。那什么才是敏捷开发呢&#xff1f; 目录 什么是敏捷开发&#xff1f;传统的开发模式和敏捷开发模式的对比&#xff1f…

特性分支开发模式 or 主干开发模式,团队该如何选择?

对于一个具有一定规模的开发团队而言&#xff0c;团队 Devops 的建设都是迈向高效开发的必经之路&#xff0c;即便没有达到 Devops 建设的程度&#xff0c;为了团队中开发之间的高效协作&#xff0c;基于版本管理工具来选择团队合理的代码分支开发模式都是非常重要的一环。对于…

vue项目的三种开发模式

vue项目的三种开发方式 文章目录 vue项目的三种开发方式1.原始无合作开发2.手动模块化开发3.自动模块化开发1、开发流程2、配置webpack-dev-server1.下载安装包2.配置package.json3、配置webpack.config.js4、执行程序5、调试程序 1.原始无合作开发 包含两个文件&#xff1a;v…

介绍两种常见软件开发模式:“敏捷”和“瀑布”

在软件开发时&#xff0c;经常面对的第一个项目实现决策是“我们应该使用哪种开发方法?”这是一个引起很多讨论(和激烈辩论)的话题。如果您以前没有使用过这种方法&#xff0c;那么适当了解开发方法和理论是必要的;简单地说&#xff0c;这是一种组织软件开发工作的方法。这与项…

常用的4种开发模式

常用的4种开发模式 1. 瀑布式开发 瀑布式开发是由W.W.Royce在1970年提出的软件开发模型,是一种比较老的计算机软件开发模式,也是典型的预见性的开发模式。在瀑布式开发模式中,开发严格遵循预先计划的需求分析、设计、编码、集成、测试、维护的步骤进行,步骤的成果作为衡量进…

小程序:游客模式--开发模式

一、简介 1.1、普通的开发可以正常进行 1.2、小程序开发工具不能预览&#xff0c;不能真机调试&#xff0c;调用微信扫码不能走成功的回调 等等 1.3、仔细观察开发者工具提示当前为“游客模式”&#xff0c;作为开发者需要切换到可以正常开发的“开发模式” 二、解决 2.1、开…

web开发模式+身份认证

一、web开发模式 目前主流的 Web 开发模式有两种&#xff0c;分别是&#xff1a; 1.基于服务端渲染的传统 Web 开发模式&#xff1a;  概念&#xff1a;服务器发送给客户端的 HTML 页面&#xff0c;是在服务器通过字符串的拼接&#xff0c;动态生成的。因此&#xff0c;客户端…

微信小程序——传统开发模式与云开发模式对比

目 录 1、传统开发模式与云开发模式的对比图 2、云开发技术能力说明 3、云开发技术特点 1、传统开发模式与云开发模式的对比图 通过传统开发模式与云开发模式的对比图可以看出传统开发模式需要开发者关注后端服务器&#xff0c;比如数据库、文件存储、负载均衡、异地容灾、…

前后端分离开发模式介绍

1.1 什么是前后端分离 前后端分离是目前一种非常流行的开发模式&#xff0c;它使项目的分工更加明确&#xff1a; 后端&#xff1a;负责处理、存储数据前端&#xff1a;负责显示数据 前端和后端开发人员通过 接口 进行数据的交换。 1.2 为什么要进行前后端分离 前后端可以…

敏捷开发模式

1、敏捷开发的概念 从1990年代开始逐渐引起广泛关注&#xff0c;是一种以人为核心、迭代、循序渐进的开发方法。强调以人为本&#xff0c;专注于交付对客户有价值的软件。是一个用于开发和维持复杂产品的框架。 2、敏捷开发的流程 (图为禅道敏捷开发流程管理) 2.1 产品负责人将…

Django开发模式与流程

Python的WEB框架有Django、Tornado、Flask 等多种&#xff0c;Django相较与其他WEB框架其优势为&#xff1a;大而全&#xff0c;框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。 一.Django的MTV开发模式与一般的MVC开发模式区别 1.MVC模式 在MVC模式中&am…

【面向对象】DDD(一):传统开发模式 VS DDD 开发模式

我们都知道&#xff0c;很多业务系统都是基于 MVC 三层架构来开发的。实际上&#xff0c;更确切点讲&#xff0c;这是一种基于贫血模型的 MVC 三层架构开发模式。虽然这种开发模式已经成为标准的 Web 项目的开发模式&#xff0c;但它却违反了面向对象编程风格&#xff0c;是一种…

MVC开发模式

一.MVC设计模式 1.MVC模式&#xff08;Model-View-Controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff0…

项目的开发模式

开发模式大概可以分为两种&#xff1a; 1、大公司的开发模式&#xff1b; 2、外包的开发模式&#xff1b; 一、大公司的开发模式&#xff1b; 1. 市场调研 2. 项目需求会&#xff08;人员&#xff09; 产品市场运营UI开发后端前端项目经理测试–>web/ios/安卓安全 3. …

什么是DDD开发模式

DDD尝试解决业务系统(逻辑CRUD)开发的复杂性问题&#xff0c;这种复杂性是由于复杂的业务规则&#xff0c;业务逻辑变化。 一般系统的业务逻辑、复杂性在于&#xff1a;流转判断多&#xff0c;专业规则多&#xff0c;计算量大。而DDD模式的解决的方式是通过分层&#xff0c;即业…

Scrum敏捷开发模式介绍与实践

文章目录 前言一、开发模式1. 瀑布流开发模式2. 迭代开发模式3. 螺旋开发模式4. 敏捷开发模式 二、敏捷开发模式三、敏捷模式1. Scrum2. Kanban3. XP4. Lean Startup 四、Scrum 敏捷开发模式1. 框架图2. 角色Scrum Master&#xff0c;SMProduct Owners&#xff0c; POSoftware …

什么是软件开发模式?

软件开发模式简介 1. 边做边改模型&#xff08;Build-and-Fix Model&#xff09; 好吧&#xff0c;其实现在许多产品实际都是使用的“边做边改”模型来开发的&#xff0c;特别是很多小公司产品周期压缩的太短。在这种模型中&#xff0c;既没有规格说明&#xff0c;也没有经过设…