python+智谱AI-实现钉钉消息自动回复

python+智谱AI-实现钉钉消息自动回复

  • 实现了电脑窗口切换,截图识别未读消息,与语言模型交互后,将答案带入到钉钉窗口中。
    • 偷个懒,直接贴代码了,后续不断完善注释,如果遇到读不懂的地方,欢迎交流。

实现了电脑窗口切换,截图识别未读消息,与语言模型交互后,将答案带入到钉钉窗口中。

偷个懒,直接贴代码了,后续不断完善注释,如果遇到读不懂的地方,欢迎交流。

# -*- coding: UTF-8 -*-
import time
# 必备的注释文件
import pygetwindow
from PIL import ImageGrab,Image
import time
import cv2
import numpy as np
import pyautogui
import easyocr
import  os
import pytesseract
import zhipuai
from zhipuai import ZhipuAI
import pyperclip
# from win10toast import ToastNotifier
import tkinter as tk
# def toastmsg(msg):
#
#     toaster = ToastNotifier()
#     toaster.show_toast("钉钉回复工具", msg, duration=10)
# 打开对话框
def openchat(xm,ym):# # 显示结果# cv2.imshow('Detected Red Points', image)# cv2.waitKey(0)# cv2.destroyAllWindows()# 要点击屏幕上的那个点# 移动鼠标到图标位置pyautogui.moveTo(xm, ym, duration=1)time.sleep(2)# 点击图标pyautogui.click(xm, ym)
# 识别对话框中的文字
def watchtext(imgurl):print('识别图片')# 读取图片image = cv2.imread(imgurl)# 图片预处理,例如灰度化、二值化等gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]# 使用pytesseract识别文字pytesseract.pytesseract.tesseract_cmd = r'D:\Program Files\Tesseract-OCR\tesseract.exe'text = pytesseract.image_to_string(thresh, lang='chi_sim')print(text)# 另外一个工具# 设为中英文混合识别:ch_sim enreader = easyocr.Reader(['ch_sim', 'en'], gpu=False)# 识别图片## print(str(os.path) + '/' + imgurl)# result = reader.readtext(imgurl, detail=0)# for i in result:#     # 输出识别出的信息#     # 输出识别出的信息#     # print('输出识别出的信息')#     print(i, end='')#     做一下图片的裁剪再识别:ch_sim enimg = Image.open(imgurl)# 获取图片大小img_size = img.size# h = img_size[1] #图片高度# w = img_size[0] #图片宽度# 设置截取部分相对位置x = 0.20 * img_size[0]+200y = 0.1 * img_size[1]# y = 350w = 1 * img_size[0]-400h = 1* img_size[1]-720# 截取图片cropped = img.crop((x, y, x + w, y + h))  # (x1,y1,x2,y2)# 保存截图图片,命名为test.pngcropped.save('test01.png')# 设为中英文混合识别:ch_sim enreader = easyocr.Reader(['ch_sim', 'en'], gpu=False, verbose=False)# 路径改为用户需要识别的图片的路径result = reader.readtext('test01.png', detail=0)for i in result:# 输出识别出的信息# 输出识别出的信息# print('输出识别出的信息')print(i, end='')return result
# 截图保存
def getmscreen():windowsjiantou  = pygetwindow.getWindowsWithTitle('XXXX')windowsjiantou[0].show()w = windowsjiantou[0]w.activate()# 获取桌面窗口的坐标和尺寸left, top, width, height = w.left, w.top, w.width, w.heightw.activate()w.show()# 将窗口最大化w.maximize()# 下面的单位是5秒time.sleep(0.5)print('运行到了这里')# 使用ImageGrab.grab()方法截取桌面screenshot = ImageGrab.grab(bbox=(left, top, left + width, top + height))# 获取当前时间的时间戳timestamp = time.time()print("当前时间戳:", timestamp)imgurl =  str(timestamp)+'desktop_screenshot.png'# 保存截图# screenshot.save(imgurl)img = pyautogui.screenshot()img.save(str(timestamp)+'desktop_screenshot.png')return imgurl
def getchat(questiontext):print(questiontext)# 接入质谱AI的APIclient = ZhipuAI(api_key=" . ")  # 请填写您自己的APIKeyresponse = client.chat.completions.create(model="glm-4",  # 填写需要调用的模型名称  OA表单中选不到项目的添加方法messages=[{"role": "user", "content": questiontext},],tools=[{"type": "retrieval","retrieval": {"knowledge_id": " ","prompt_template": "从文档\n\"\"\"\n{{knowledge}}\n\"\"\"\n中找问题\n\"\"\"\n{{question}}\n\"\"\"\n的答案,找到答案就仅使用文档语句回答问题,找不到答案就用自身知识回答并且告诉用户该信息不是来自文档。\n不要复述问题,直接开始回答。"}}],stream=True,)resstr = ""for chunk in response:# print(chunk.choices[0].delta)resstr = resstr + str(chunk.choices[0].delta.content)# print(chunk.choices[0].delta.content)print(resstr)# 做一个data,把数据返回去return resstr
def pasttext(text):windowsjiantou  = pygetwindow.getWindowsWithTitle('XXXX')windowsjiantou[0].show()w = windowsjiantou[0]w.activate()# 移动鼠标到目标位置(这里以屏幕坐标为例)pyautogui.moveTo(600, 900)# 模拟鼠标点击pyautogui.click()# 模拟键盘输入# pyautogui.typewrite('你好www', interval=0.2)# # 模拟按下Win键# pyautogui.press("win")# # 输入中文输入法的名称,例如“微软拼音输入法”# pyautogui.typewrite("微软拼音输入法")# # 模拟按下回车键# pyautogui.press("enter")# # 等待中文输入法启动# pyautogui.sleep(1)# # 输入中文字符# pyautogui.typewrite("你好,世界!")pyperclip.copy(text)time.sleep(0.5)pyautogui.hotkey('ctrl', 'v')# pyperclip.paste()
def capture():# toastmsg('程序运行中')# 获取桌面窗口# desktop_window = pygetwindow.getDesktopWindow()desktop_window = pygetwindow.getAllWindows()desktop_window_title = pygetwindow.getAllTitles()for window in desktop_window_title:print(window)windowsjiantou  = pygetwindow.getWindowsWithTitle('XXXX')windowsjiantou[0].show()w = windowsjiantou[0]w.activate()# 获取桌面窗口的坐标和尺寸left, top, width, height = w.left, w.top, w.width, w.heightw.activate()w.show()# 将窗口最大化w.maximize()# 下面的单位是5秒time.sleep(0.5)print('运行到了这里')# 使用ImageGrab.grab()方法截取桌面screenshot = ImageGrab.grab(bbox=(left, top, left + width, top + height))# 获取当前时间的时间戳timestamp = time.time()print("当前时间戳:", timestamp)# 保存截图screenshot.save(str(timestamp)+'desktop_screenshot.png')# 读取图片上的红点# 识别图片imgs =str(timestamp)+'desktop_screenshot.png'# 读取图像image = cv2.imread(imgs)# 读取图像# 将图像从BGR转换为HSV颜色空间hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 定义红色的HSV范围lower_red1 = np.array([0, 120, 70])upper_red1 = np.array([10, 255, 255])lower_red2 = np.array([170, 120, 70])upper_red2 = np.array([180, 255, 255])# 创建掩码mask1 = cv2.inRange(hsv, lower_red1, upper_red1)mask2 = cv2.inRange(hsv, lower_red2, upper_red2)mask = cv2.bitwise_or(mask1, mask2)# 形态学操作以去除噪声kernel = np.ones((5, 5), np.uint8)mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)mask = cv2.dilate(mask, kernel, iterations=1)# 寻找轮廓  这里满足要求的轮廓已经放到这里数组里了contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)myusecolours = []# 绘制轮廓for contour in contours:# 计算轮廓的面积# 先留下面积大于100的轮廓area = cv2.contourArea(contour)if area > 50:  # 可以根据实际情况调整这个阈值print('面积大于50')# 计算轮廓的周长perimeter = cv2.arcLength(contour, True)# 计算轮廓的近似形状# approxPolyDP 函数用于计算轮廓的近似形状# approxPolyDPapprox = cv2.approxPolyDP(contour, 0.04 * perimeter, True)# 如果轮廓是圆形,那么近似形状的顶点数量应该接近于0# 但是这里我直接用半径来判断if len(approx) < 10:(x, y), radius = cv2.minEnclosingCircle(contour)center = (int(x), int(y))radius = int(radius)if radius > 5:  # 可以根据实际情况调整这个阈值  圆角值改小了一点# 使用cv2.circle() 在原图上绘制筛选后的圆形轮廓。print('绘制了一个图形print')cv2.circle(image, center, radius, (0, 255, 0), 2)# 这里是通过考验的contour# 获取contour 的坐标print(contour)myusecolours.append(contour)# 显示结果# cv2.imshow('Contours', image)# cv2.waitKey(0)# cv2.destroyAllWindows()print('----')myusecolours02 =myusecoloursmyusecolours02.reverse()print(len(myusecolours02))print(len(myusecolours02))if len(myusecolours02) == 0:returncontoursmsg = myusecolours02[-1]# if len(myusecolours02) < 3:#     contoursmsg = myusecolours02[2]### # 获取第一条未读消息# if len(myusecolours02) < 2:#     contoursmsg = myusecolours02[1]## if len(myusecolours02) < 1:#     contoursmsg = myusecolours02[0]# 获取坐标x, y, w, h = cv2.boundingRect(contoursmsg)# 打印边界框坐标print(f"Bounding box coordinates: x={x}, y={y}, w={w}, h={h}")# 得到中心点的位置(xm, ym), radius = cv2.minEnclosingCircle(contoursmsg)print(f"Bounding box coordinates: ----------------------------  x={xm}, y={ym}")# 打开对话框openchat(xm,ym)# 截图imgurl = getmscreen()# 识别对话框中的文字textcontent = watchtext(imgurl)# print(textcontent)textcontent02 = ''for item in textcontent:print(item+'\n')textcontent02= textcontent02+item+''# 获取最后一条消息# textcontent.reverse()# lasttext = textcontent[0]# print('最新的一条消息')# print(lasttext)# 调用API开始聊天--最后一条消息textcontent.reverse()textcontent01 = textcontent[0]answer = getchat(textcontent01)# 调用API开始聊天--所有识别的内容# answer = getchat(textcontent02)# 将内容粘贴到钉钉窗口中pasttext(answer)# toastmsg('程序运完毕')# print(desktop_window)# print(desktop_window_title)# # 获取桌面窗口的坐标和尺寸# left, top, width, height = desktop_window.left, desktop_window.top, desktop_window.width, desktop_window.height## # 使用ImageGrab.grab()方法截取桌面# screenshot = ImageGrab.grab(bbox=(left, top, left + width, top + height))## # 保存截图# screenshot.save('desktop_screenshot.png')
def say_hello():capture()
if __name__ == '__main__':# 先来屏幕截图capture()# root = tk.Tk()# root.geometry("400x500")# # 禁止用户调整窗口大小# root.resizable(False, False)## label = tk.Label(root, text=" ", font=("Microsoft YaHei", 16))# label.pack(pady=20)### label = tk.Label(root, text="点击 接管电脑 后,程序会识别未读消息并到知识库中进行检索填充回复。对信息修改勾,可以进行发送,或者设置自动发送",wraplength=300, font=("Microsoft YaHei", 16))# label.pack(pady=20)#### button = tk.Button(root, text="接管电脑", command=say_hello)# button.pack(pady=20)## root.mainloop()

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始linux(21)——文件(2)文件重定向

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 设备文件文件缓冲区重新认识文件描述符重定向 设备文件 在前一篇文章博主提到&#xff0c;当一个c/c进程运行时&#xff0c;会默认打开三个文件流&#xff0c;分别是stdin&#xff0c;stdout…

Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析

Claude 3.5 Sonnet发布PDF图像预览新功能&#xff0c;允许用户分析长度不超过100页的PDF中的视觉内容。 此功能使用户能够轻松上传文档并提取信息&#xff0c;特别适用于包含图表、图形和其他视觉元素的研究论文和技术文档。 视觉PDF分析&#xff1a;用户现在可以从包含各种视觉…

【SQL server】数据库远程连接配置

SQL server远程连接配置 1、数据库远程配置1.身份验证2. 建立入站规则3. SQLServer服务的启动 1、数据库远程配置 1.身份验证 所以在安装过程中需要注意涉及到的的身份验证中&#xff0c;要使用混合模式&#xff0c;并设置密码。2. 建立入站规则 在控制面板中的防火墙管理中…

【Vue 全家桶】5、Vuex(更新中)

目录 概念何时使用搭建vuex环境基本使用getter的使用四个map方法的使用vuex模块化命名空间 概念 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。使用 Vuex 可…

首推!AI大模型课程2024年最新版!从零基础到入行大模型算法工程师,看完这一篇就够了,学完来找我内推!

“ 技术学习无非涵盖三个方面&#xff0c;理论&#xff0c;实践和应用**”** 大模型技术爆火至今已经有两年的时间了&#xff0c;而且大模型技术的发展潜力也不言而喻。因此&#xff0c;很多人打算学习大模型&#xff0c;但又不知道该怎么入手&#xff0c;因此今天就来了解一下…

一站式搭建线上线下交友平台/全开源码交付前后端安装说明

功能亮点 灵魂匹配&#xff1a;基于个人喜好和兴趣&#xff0c;为你推荐最合适的交友对象。 真实认证&#xff1a;所有用户都经过严格认证&#xff0c;确保交友环境真实可靠。 隐私保护&#xff1a;强大的隐私设置&#xff0c;让你轻松掌控个人信息和交友动态。 互动便捷&…

基于数组实现的Huffman树和Huffman编码

一、Huffman树简介 1、定义 树的带权路径长度&#xff0c;就是树中所有的叶节点的权值乘上其到根节点的路径长度。 在含有n 个带权叶子结点的二叉树中&#xff0c;其中带权路径长度&#xff08;Weighted Path Length, WPL&#xff09;最小的二叉树称为哈夫曼树&#xff0c; 也…

图说复变函数论重大错误:将无穷多各异平面误为同一面

黄小宁 医学若将前所未知的“新冠”病毒误为已熟知的流感病毒&#xff0c;后果...&#xff1b;数学将前所未知的点集误为已熟知的集就会引出一连串的重大错误。 h定理&#xff1a;点集AB的必要条件是A≌B。 证&#xff1a;&#xff08;1&#xff09;任何图≌自己是几何学最起码…

SDL简介和初次尝试

文章目录 SDL的用途和概念SDL下载 SDL的用途和概念 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台开发库 &#xff0c;使用C语言写成&#xff0c;SDL提供了数种 操作 图像 &#xff0c;声音输入输出的函数&#xff0c;让开发者使用 相识的代码 就能够开发出跨平台的…

WiFi一直获取不到IP地址是怎么回事?

在当今这个信息化时代&#xff0c;WiFi已成为我们日常生活中不可或缺的一部分。无论是家庭、办公室还是公共场所&#xff0c;WiFi都为我们提供了便捷的无线互联网接入。然而&#xff0c;有时我们可能会遇到WiFi连接后无法获取IP地址的问题&#xff0c;这不仅影响了我们的网络使…

【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程

1、定义图像显示函数 首先定义一个函数&#xff0c;函数的作用是通过plt库显示两幅图&#xff0c;为后续实验做准备。该函数的主要功能是&#xff1a; 从指定路径加载图像显示图像的基本信息将图像从BGR格式转换为RGB格式并在一个图形窗口中显示两幅图像进行对比 import nump…

Ftrans数据跨境传输方案:保护隐私与促进合作

数据跨境传输是指在不同国家、地区和法律框架下进行的数据交换和传输&#xff0c;数据跨境传输流程周期是数据产生--数据传输--数据接收&#xff0c;而困境来源也来自这3个环节&#xff1a; 1.本地合规限制 数据出口国&#xff08;数据输出国&#xff09;的法律对于数据收集的…

Mybatis学习笔记(三)

十、MyBatis的逆向工程 (一)逆向工程介绍 MyBatis的一个主要的特点就是需要程序员自己编写sql&#xff0c;那么如果表太多的话&#xff0c;难免会很麻烦&#xff0c;所以mybatis官方提供了一个逆向工程&#xff0c;可以针对单表自动生成mybatis执行所需要的代码&#xff08;包…

Github 2024-11-08Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-11-08统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9Vue项目1经验丰富的Java(后端)开发人员核心面试问题和答案 | 互联网Java工程师进阶知识完全扫盲 创建周期:2085 天开发语言:Java协议…

【新闻文本分类识别】Python+CNN卷积神经网络算法+深度学习+人工智能+机器学习+文本处理

一、介绍 文本分类识别系统。本系统使用Python作为主要开发语言&#xff0c;首先收集了10种中文文本数据集&#xff08;“体育类”, “财经类”, “房产类”, “家居类”, “教育类”, “科技类”, “时尚类”, “时政类”, “游戏类”, “娱乐类”&#xff09;&#xff0c;然…

数据结构 ——— 链式二叉树的前中后序遍历递归实现

目录 前言 链式二叉树示意图​编辑 手搓一个链式二叉树 链式二叉树的前序遍历 链式二叉树的中序遍历 链式二叉树的后序遍历 前言 在上一章学习了链式二叉树的前中后序遍历的解析 数据结构 ——— 链式二叉树的前中后序遍历解析-CSDN博客 接下来要学习的是代码实现链式…

<项目代码>YOLOv8 pcb板缺陷检测<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

yarn报错`warning ..\..\package.json: No license field`:已解决

出现这个报错有两个原因 1、项目中没有配置许可证 在项目根目录package.json添加 {"name": "next-starter","version": "1.0.0",# 添加这一行"license": "MIT", }或者配置私有防止发布到外部仓库 {"priv…

大模型学习笔记------CLIP模型解读与思考

大模型学习笔记------CLIP模型详解 1、为什么提出CLIP模型2、CLIP模型详解3、CLIP模型的意义4、一些思考 上文说到&#xff0c;多模态大模型应该是非常有发展前景的&#xff0c;首先来学习 CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09;这个多模态模型…

昇思25天学习打卡营第1天|快速入门

昇思25天学习打卡营第1天|快速入门 目录 昇思25天学习打卡营第1天|快速入门实操教程 一、MindSpore内容简介 主要特点&#xff1a; MindSpore的组成部分&#xff1a; 二、入门实操步骤 1. 安装必要的依赖包 2. 下载并处理数据集 3. 构建网络模型 4. 训练模型 5. 测试…