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

目录

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://www.rhkb.cn/news/31047.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文翻译】2020.8 清华大学AI课题组——大型中文短文本对话数据集(A Large-Scale Chinese Short-Text Conversation Dataset)

大型中文短文本对话数据集 写在前面&#xff1a; 研究用&#xff0c;原创翻译&#xff0c;转载请标明出处&#xff1b;第一次译文&#xff0c;之后会跟进完善。侵删。 今年暑假末&#xff0c;清华大学公开了大型对话数据集及预训练模型。该数据集融合各大社交媒体对话数据库&am…

头条原创文章一键转换剪映生成视频

最近一段时间某更新了一个功能就是自己发布的文章可以在后台通过视频平台的功能一键生成短视频。 但是这个功能只能支持自己的写的文章,而且只能在本平台发布视频,还暂时不能同步到其他平台。而且必须是自己的原创文章哟,不是话会有一些问题。 这个做了几个视频之后发出来…

自媒体必备视频剪辑SDK,操作简单,功能强大,让每个精彩瞬间都能锦上添花!

VESDK DELUXE介绍&#xff1a; 一个全能好用的视频编辑工具&#xff0c;帮你轻松剪出美好生活。VESDK Deluxe APP视频编辑SDK集手机视频拍摄和视频剪辑主要功能于一体,同时包含手机端视频配音配乐&#xff0c;字幕特效&#xff0c;滤镜&#xff0c;转场特效等各种功能&#xff…

抖音之电脑版剪映的使用

本内容介绍剪映功能的使用以及一些个人剪映作品。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、抖音&#xff1a;逝雪情感的剪映作品 1、曾经以为离不开的是微信 2、半生走过 3、夏日田园 二、音…

剪映专业版 - 你的短视频剪辑小帮手!附Mac/Win地址!

剪映专业版&#xff1a;做精品视频你不一定要用 FCPX &#xff01;随着短视频的崛起&#xff0c;市面上的剪辑软件也越来越多。除我们熟知的Premiere、Final Cut Pro等专业剪辑软件外&#xff0c;也有很多轻松易上手的App等待我们选择。近期&#xff0c;剪映推出了全新的专业版…

剪映电脑版详细使用教程,让视频剪辑变得更简单了

这几天关于剪映电脑版的消息非常多&#xff0c;相比于专业成熟的视频剪辑软件&#xff0c;但大家对这款剪映似乎特别感兴趣&#xff0c;小编也抽时间简单使用了一下&#xff0c;相比于adobe Premiere 和达芬奇来说&#xff0c;真的特别简单上手&#xff0c;结合了手机版的触摸与…

剪映app怎么剪辑视频

剪映是一款非常好用的手机上的视频剪辑软件&#xff0c;拥有这款软件的话&#xff0c;用户们即使是在手机上也能够快速方便的进行视频剪辑哦&#xff0c;但是有很多用户们没有剪辑过视频&#xff0c;不会使用剪映这款软件等&#xff0c;那么剪映app具体要怎么操作使用呢&#x…

AIz作画阶段小结后续内容安排

效果呈现 视频效果&#xff1a; 1.小说插画 2.动作系列 图画效果&#xff1a; 1.场景画面&#xff08;6张左右&#xff09; 2.人物画面&#xff08;6张左右&#xff0c;可以更多&#xff0c;可爱、知性、性感、古典、游戏、二次元&#xff09; 3.插画设计 4.广告元素 5.3d角色&…

Spring Boot 项目中使用 OpenAI ChatGPT APIs

大家好&#xff0c;我是Yuan&#xff0c;这篇文章主要介绍如何在springboot项目中集成调用chatgpt的api功能。 1. 概述 在本教程中&#xff0c;我们将学习如何在 Spring Boot 中调用 OpenAI ChatGPT API。我们将创建一个 Spring Boot 应用程序&#xff0c;该应用程序将通过调…

2021年茶艺师(中级)最新解析及茶艺师(中级)免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;茶艺师&#xff08;中级&#xff09;最新解析考前必练&#xff01;安全生产模拟考试一点通每个月更新茶艺师&#xff08;中级&#xff09;免费试题题目及答案&#xff01;多做几遍…

2021年茶艺师(中级)最新解析及茶艺师(中级)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;茶艺师&#xff08;中级&#xff09;最新解析是安全生产模拟考试一点通生成的&#xff0c;茶艺师&#xff08;中级&#xff09;证模拟考试题库是根据茶艺师&#xff08;中级&#…

2021年茶艺师(中级)考试题库及茶艺师(中级)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 茶艺师&#xff08;中级&#xff09;考试题库考前必练&#xff01;安全生产模拟考试一点通每个月更新茶艺师&#xff08;中级&#xff09;复审考试题目及答案&#xff01;多做几遍&#xff0c;其实通过茶艺师&#xf…

2021年茶艺师(中级)考试题及茶艺师(中级)考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;茶艺师&#xff08;中级&#xff09;考试题根据新茶艺师&#xff08;中级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将茶艺师&#xff08;中级&#xff09;模拟…

2021年茶艺师(中级)考试内容及茶艺师(中级)最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 茶艺师&#xff08;中级&#xff09;考试内容是安全生产模拟考试一点通总题库中生成的一套茶艺师&#xff08;中级&#xff09;最新解析&#xff0c;安全生产模拟考试一点通上茶艺师&#xff08;中级&#xff09;作业…

2021年茶艺师(中级)考试及茶艺师(中级)考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;茶艺师&#xff08;中级&#xff09;考试根据新茶艺师&#xff08;中级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将茶艺师&#xff08;中级&#xff09;模拟考…

2021年茶艺师(中级)免费试题及茶艺师(中级)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;茶艺师&#xff08;中级&#xff09;免费试题参考答案及茶艺师&#xff08;中级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及茶艺师&#xff08;中级&#xff09;…

2021年茶艺师(中级)考试题库及茶艺师(中级)考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;茶艺师&#xff08;中级&#xff09;考试题库根据新茶艺师&#xff08;中级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将茶艺师&#xff08;中级&#xff09;模…

2021年茶艺师(中级)考试题及茶艺师(中级)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;茶艺师&#xff08;中级&#xff09;考试题参考答案及茶艺师&#xff08;中级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及茶艺师&#xff08;中级&#xff09;操…

2020年茶艺师(中级)考试题库及茶艺师(中级)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2020年茶艺师&#xff08;中级&#xff09;考试题库及茶艺师&#xff08;中级&#xff09;模拟考试题&#xff0c;包含茶艺师&#xff08;中级&#xff09;考试题库答案和解析及茶艺师&#xff08;中级&#xff09;模…

你见过最难考的职业证书是什么?

目前就我自己考过的一建、法考、注会、税务师、软考、经济师等等十几个证书中&#xff0c;我觉得注会是最难考的&#xff0c;因为这些证书中只有注会专业阶段我考了三年才通过&#xff0c;其他考试都是一年一次性通过全科。 2017年了解到考证&#xff0c;考了软考初级程序员试水…