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

news2024/11/8 8:05:39

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 en
    reader = 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 en
    img = Image.open(imgurl)
    # 获取图片大小
    img_size = img.size
    # h = img_size[1] #图片高度
    # w = img_size[0] #图片宽度
    # 设置截取部分相对位置
    x = 0.20 * img_size[0]+200
    y = 0.1 * img_size[1]
    # y = 350
    w = 1 * img_size[0]-400
    h = 1* img_size[1]-720
    # 截取图片
    cropped = img.crop((x, y, x + w, y + h))  # (x1,y1,x2,y2)
    # 保存截图图片,命名为test.png
    cropped.save('test01.png')
    # 设为中英文混合识别:ch_sim en
    reader = 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.height
    w.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的API
    client = ZhipuAI(api_key=" . ")  # 请填写您自己的APIKey
    response = 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.height
    w.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 函数用于计算轮廓的近似形状
            # approxPolyDP
            approx = 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 =myusecolours
    myusecolours02.reverse()
    print(len(myusecolours02))
    print(len(myusecolours02))
    if len(myusecolours02) == 0:
        return
    contoursmsg = 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.coloradmin.cn/o/2235672.html

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

相关文章

onnx-web + yolov8n 在视频流里做推理

顺着我上一篇文章 使用onnxruntime-web 运行yolov8-nano推理 继续说&#xff0c;有朋友在问能不能接入 视频流动&#xff0c;实时去识别物品。 首先使用 getUserMedia 获取摄像头视频流 getUserMedia API 可以访问设备的摄像头和麦克风。你可以使用这个 API 获取视频流&#…

Python练习11

Python日常练习 题目&#xff1a; 编写一个石头剪刀布游戏&#xff0c;该程序要求完成如下功能&#xff1a; (1) 显示游戏规则&#xff0c;提醒用户输入一个1-3的整数或者直接回车。 用户输入回车时游戏结束。 用户输入不合法&#xff08;包括输入的…

航展畅想:从F35机载软件研发来看汽车车载软件研发

两款经典战机的机载软件 F-22和F-35战斗机的研制分别始于1980年代和1990年代末&#xff0c;F-22项目在1981年启动&#xff0c;主要由洛克希德马丁&#xff08;Lockheed Martin&#xff09;和波音公司&#xff08;Boeing&#xff09;合作开发&#xff0c;以满足美军“先进战术战…

实践出真知:MVEL表达式empty的坑

目录标题 背景为什么呢&#xff1f;验证下empty的含义case1case2case3 结论具体解释&#xff1a; 背景 //是否白名单 if(goodInfo.?isWhite ! empty){showList.add(["label": "是否白名单","value":["text":(goodInfo.?isWhite tr…

RPC核心实现原理

目录 一、基本原理 二、详细步骤 三、额外考虑因素 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种计算机通信协议&#xff0c;也是一种用于实现分布式系统中不同节点之间进行通信和调用的技术。其实现原理主要可以分为以下几个步骤&…

Kaggle生物信息学挑战:酶稳定性预测大赛

背景介绍 酶的稳定性是影响其实际应用的关键因素之一。通过定点突变可以改善酶的稳定性,但实验筛选稳定性突变体的成本较高。预测突变对酶稳定性的影响,加速筛选稳定性更高的酶突变体。 概念解释 X 残基&#xff1a;假设 它用 红色表示 &#xff0c; Y 残基&#xff1a;假设…

【开发工具——依赖管理工具——Maven】

1. Maven介绍 Apache Maven 的本质是一个软件项目管理和理解工具。基于项目对象模型 (Project Object Model&#xff0c;POM) 的概念&#xff0c;Maven 可以从一条中心信息管理项目的构建、报告和文档。 对于开发者来说&#xff0c;Maven 的主要作用主要有 3 个&#xff1a; …

vue3+vite搭建脚手架项目本地运行electron桌面应用

1.搭建脚手架项目 搭建Vue3ViteTs脚手架-CSDN博客 2.创建完项目后&#xff0c;安装所需依赖包 npm i vite-plugin-electron electron26.1.0 3.根目录下创建electron/main.ts electron/main.ts /** electron/main.ts */import { app, BrowserWindow } from "electron&qu…

鸿蒙ArkTS中的获取网络数据

一、通过web组件加载网页 在C/S应用程序中&#xff0c;都有网络组件用于加载网页&#xff0c;鸿蒙ArkTS中也有类似的组件。   web组件&#xff0c;用于加载指定的网页&#xff0c;里面有很多的方法可以调用&#xff0c;虽然现在用得比较少&#xff0c;了解还是必须的。   演…

无人车之路径规划篇

无人车的路径规划是指在一定的环境模型基础上&#xff0c;给定无人车起始点和目标点后&#xff0c;按照性能指标规划出一条无碰撞、能安全到达目标点的有效路径。 一、路径规划的重要性 路径规划对于无人车的安全、高效运行至关重要。它不仅能够提高交通效率&#xff0c;减少交…

C语言心型代码解析

方法一 心型极坐标方程 爱心代码你真的理解吗 笛卡尔的心型公式&#xff1a; for (y 1.5; y > -1.5; y - 0.1) for (x -1.5; x < 1.5; x 0.05) 代码里面用了二个for循环&#xff0c;第一个代表y轴&#xff0c;第二个代表x轴 二个增加的单位不同&#xff0c;能使得…

11月7日(内网横向移动(二))

利用系统服务 SCShell SCShell是一款利用系统服务的无文件横向移动工具。与传统的创建远程服务的方法不同&#xff0c;SCShell利用提供的用户凭据&#xff0c;通过ChangeServiceConfigA API修改远程主机上的服务配置&#xff0c;将服务的二进制路径名修改为指定的程序或攻击载…

【YOLOv11[基础]】目标检测OD | 导出ONNX模型 | ONN模型推理以及检测结果可视化 | python

本文将导出YOLO11.pt模型对应的ONNX模型,并且使用ONNX模型推理以及结果的可视化。话不多说,先看看效果图吧!!! 目录 一 导出ONNX模型 二 推理及检测结果可视化 1 代码 2 效果图

力扣—不同路径(路径问题的动态规划)

文章目录 题目解析算法原理代码实现题目练习 题目解析 算法原理 状态表示 对于这种「路径类」的问题&#xff0c;我们的状态表示⼀般有两种形式&#xff1a; i. 从[i, j] 位置出发。 ii. 从起始位置出发&#xff0c;到[i, j] 位置。 这⾥选择第⼆种定义状态表⽰的⽅式&#xf…

传统RAG流程;密集检索器,稀疏检索器:中文的M3E

目录 传统RAG流程 相似性搜索中:神经网络的密集检索器,稀疏检索器 密集检索器 BGE系列模型 text-embedding-ada-002模型 M3E模型 稀疏检索器 示例一:基于TF-IDF的稀疏检索器 示例二:基于BM25的稀疏检索器 稀疏检索器的特点与优势 传统RAG流程 相似性搜索中:神经…

Javascript 获取设备信息 工具

JS获取设备信息(操作系统信息、地理位置、UUID、横竖屏状态、设备类型、网络状态、浏览器信息、生成浏览器指纹、日期、生肖、周几等) Get Device Info Online GitHub - skillnull/DeviceJs: JS获取设备信息(操作系统信息、地理位置、UUID、横竖屏状态、设备类型、网络状态、浏…

【数据仓库】

1、概述 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。 数据仓库是企业中用于集中存储和管理来自多个源的经过处理和组织的数据的系统。它为复杂的查询和分析提供了一个优化的环境&#xff0c;使得用户能够执行高级数据分析&#xff0c;以支持…

成都栩熙酷网络科技有限公司抖音小店探索

在数字经济的浪潮中&#xff0c;电商行业正以前所未有的速度蓬勃发展&#xff0c;而短视频平台的崛起更是为这一领域注入了新的活力。成都栩熙酷网络科技有限公司&#xff08;以下简称“栩熙酷”&#xff09;&#xff0c;作为这股浪潮中的佼佼者&#xff0c;凭借其敏锐的市场洞…

基于ViT的无监督工业异常检测模型汇总

基于ViT的无监督工业异常检测模型汇总 论文1&#xff1a;RealNet: A Feature Selection Network with Realistic Synthetic Anomaly for Anomaly Detection&#xff08;2024&#xff09;1.1 主要思想1.2 系统框架 论文2&#xff1a;Inpainting Transformer for Anomaly Detecti…

传输协议设计与牧村摆动(Makimoto‘s Wave)

有一条活鱼和一条死鱼&#xff0c;你准备怎么做&#xff0c;你会将活鱼红烧或将死鱼清蒸吗&#xff1f;好的食材只需要最简单的烹饪&#xff0c;不好的食材才需要花活儿。 我此前的文字几乎都在阐述一个观点&#xff0c;广域网就是那条死鱼&#xff0c;数据中心则是那条活鱼。…