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()相关文章:
python+智谱AI-实现钉钉消息自动回复
python智谱AI-实现钉钉消息自动回复 实现了电脑窗口切换,截图识别未读消息,与语言模型交互后,将答案带入到钉钉窗口中。偷个懒,直接贴代码了,后续不断完善注释,如果遇到读不懂的地方,欢迎交流。…...
Kafka-Eagle的配置——kafka可视化界面
通过百度网盘分享的文件:kafka-eagle-bin-2.0.8.tar.gz 链接:https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码:sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…...
【命令操作】Linux上带宽流量监控nethogs命令详解 _ 统信 _ 麒麟 _ 方德
原文链接:【命令操作】Linux上带宽流量监控nethogs命令详解 | 统信 | 麒麟 | 方德 Hello,大家好啊!今天带来一篇关于Linux上nethogs命令详解的文章。nethogs是一款非常实用的网络流量监控工具,帮助用户实时查看系统中每个进程的网…...
【入门篇】数字统计——多语言版
题目跳转:数字统计 题目解析: 这道题目要求统计在给定范围 [L, R] 内所有整数中数字 2 出现的次数。例如,在范围 [2, 22] 中,数字 2 分别在数 2、12、20、21、22 中出现的次数,最终出现了6次。 题目的输入为两个正…...
探索那些现代C++语法糖
本文来聊聊现代C的一些语法糖。 1.Auto auto x 10; // 推导为 int auto y 3.14; // 推导为 double2.范围-based for 循环 std::vector<int> v {1, 2, 3, 4, 5}; for (auto val : v) {std::cout << val << " "; }3.nullptr int* ptr nullpt…...
【LeetCode】【算法】33. 搜索旋转排序数组
LeetCode 33. 搜索旋转排序数组 题目描述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k…...
Python小游戏25——黄金矿工
首先,你需要安装Pygame库。 如果你还没有安装,可以使用以下命令进行安装: 【bash】 pip install pygame 【python】代码展示 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 60…...
WPF中Prism框架中 IContainerExtension 和 IRegionManager的作用
在Prism框架中,IContainerExtension和IRegionManager扮演着重要的角色,具体作用如下: IContainerExtension IContainerExtension接口是Prism 7中引入的,用于抽象依赖注入容器的操作。它实现了IContainerProvider和IContainerReg…...
C++实现用户分组--学习
第一步实现:ETL的设计分三部分:数据抽取(Data Extraction)、数据的清洗转换(Data Transformation)、数据的加载(Data Loading). 构建一个数据容器类,其中包含转换后的MNIST手写数据。还实现了一个数据处理程序,该数据处理程序将提…...
鸿蒙华为商城APP案例
模拟器运行效果如下: 鸿蒙版APP-华为商城-演示视频...
回首遥望-C++内存对齐的思考
这一章节主要巩固一下学习C/C时内存对齐相关的内容! 文章目录 什么是内存对齐?为什么要有内存对齐?如何进行内存对齐?致谢: 什么是内存对齐? 这里不提及一堆啰嗦概念,就结合实际出发࿰…...
力扣 LeetCode 704. 二分查找(Day1:数组)
解题思路: 二分查找主要分为[ left , right ]左闭右闭和[ left , right )左闭右开两种 此处采取[ left , right ]左闭右闭写法 注意: 1. right的初始化取值 2. while中取等 3. right mid -1 ; class Solution {public int search(int[] nums, i…...
【Mode Management】AUTOSAR架构下唤醒源检测函数EcuM_CheckWakeup详解
目录 前言 正文 1.AUTOSAR标准描述 1.1 EcuM_CheckWakeup用来干什么 1.2 EcuM_CheckWakeup在哪里被调用 1.3 EcuM_CheckWakeup的使用场景 1.3.1 GPT中断检测唤醒源 1.3.2 EcuM轮询GPT检测唤醒源 1.3.3 ICU中断检测唤醒源 1.3.4 其他 2.AUTOSR工具相关配置 3.唤醒源…...
Zabbix基础信息概述
1.Zabbix概述 Zabbix 是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警,这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix 提供了出色的报告和数据可…...
SpringBoot(十二)SpringBoot配置redis
接下来我要实现的webscoket即时聊天中需要使用到redis,我先在项目中配置一下redis。 我这里再windows中做测试,关于redis的安装请移步《Redis(三)Windows系统安装redis》 一:在pom.xml中添加依赖 <!-- springboot redis start --><dependency><grou…...
Pycharm安装
Pycharm安装 返回主目录Pycharm安装1. Pycharm下载PyCharm官网下载地址下载安装包 2. Pycharm安装第一步:双击安装包第二步:进入安装程序第三步:选择安装路径第四步:选择安装选项第五步:安装第六步:完成安装…...
OpenAI大改下代大模型方向,scaling law撞墙?AI社区炸锅了
有研究预计,如果 LLM 保持现在的发展势头,预计在 2028 年左右,已有的数据储量将被全部利用完。届时,基于大数据的大模型的发展将可能放缓甚至陷入停滞。 来自论文《Will we run out of data? Limits of LLM scaling based on hum…...
技术整合与生态构建:Lyft与Mobileye引领自动驾驶新纪元
在科技日新月异的今天,自动驾驶技术正逐渐从科幻电影走进现实生活,成为出行服务领域的一股不可忽视的力量。近日,北美网约车巨头Lyft与自动驾驶技术领先者Mobileye宣布联手合作,共同推动自动驾驶汽车出行服务的广泛商业化进程。此…...
利用huffman树实现对文件A先编码后解码
利用huffman树实现对文件A先编码后解码,范围为ASCII码0-255的值,如何解决特殊符号问题是一个难点,注意应使用unsigned char存储数据,否则ASCII码128-255的值可能会出问题: #define _CRT_SECURE_NO_WARNINGS 1 #includ…...
第三十九章 基于VueCli自定义创建项目
目录 1. 选择创建模式 2. 选择需要的功能 3. 选择历史模式还是哈希模式 4.CSS预处理器 5. 选择ESLint规则 6. 开始创建项目 7. 自定义项目最终结构 1. 选择创建模式 输入创建的项目名,创建项目: 这里选择自定义模式: 2. 选择需要…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
