2024 年最新使用 ntwork 框架搭建企业微信机器人详细教程

NTWORK 概述

基于 PC 企业微信的 api 接口,支持收发文本、群@、名片、图片、文件、视频、链接卡片等。

下载安装 ntwork

pip install ntwork

国内源安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ntwork

企业微信版本下载

官方下载:https://dldir1.qq.com/wework/work_weixin/WeCom_4.0.8.6027.exe

简单基础案例

import sys
import ntworkwework = ntwork.WeWork()# 打开pc企业微信, smart: 是否管理已经登录的企业微信`在这里插入代码片`
wework.open(smart=True)# 等待登录
wework.wait_login()# 向文件助手发送一条消息
wework.send_text(conversation_id="FILEASSIST", content="hello, NtWork")try:while True:pass
except KeyboardInterrupt:ntwork.exit_()sys.exit()

获取联系人列表、群列表

# -*- coding: utf-8 -*-
import sys
import ntworkwework = ntwork.WeWork()# 打开pc企业微信, smart: 是否管理已经登录的微信
wework.open(smart=True)# 等待登录
wework.wait_login()# 获取内部(同事)列表并输出
contacts = wework.get_inner_contacts()
print("内部(同事)联系人列表: ")
print(contacts)# 获取外部(客户)列表并输出
contacts = wework.get_external_contacts()
print("外部(客户)联系人列表: ")
print(contacts)# 获取群列表并输出
rooms = wework.get_rooms()
print("群列表: ")
print(rooms)try:while True:pass
except KeyboardInterrupt:ntwork.exit_()sys.exit()

监听消息自动回复

import sys
import ntworkwework = ntwork.WeWork()# 打开pc企业微信, smart: 是否管理已经登录的微信
wework.open(smart=True)# 注册消息回调
@wework.msg_register(ntwork.MT_RECV_TEXT_MSG)
def on_recv_text_msg(wework_instance: ntwork.WeWork, message):data = message["data"]sender_user_id = data["sender"]self_user_id = wework_instance.get_login_info()["user_id"]conversation_id: str = data["conversation_id"]# 判断消息不是自己发的并且不是群消息时,回复对方if sender_user_id != self_user_id and not conversation_id.startswith("R:"):wework_instance.send_text(conversation_id=conversation_id, content=f"你发送的消息是: {data['content']}")try:while True:pass
except KeyboardInterrupt:ntwork.exit_()sys.exit()

使用 fastapi 框架

通过 fastapi 的 swagger 在线文档可以很方便的管理 ntwork 接口:案例

常见问题解决方案

版本不匹配异常

如果出现ntwork.exception.WeWorkVersionNotMatchError异常异常, 请确认是否安装github上指定的企业微信版本,如果确认已经安装,还是报错,可以在代码中添加以下代码,跳过微信版本检测

import ntwork
ntwork.set_wework_exe_path(wework_version='4.0.8.6027') 

账号克隆登录

新建一些 ntwork.wework 实例,然后调用 open 方法。

import ntwork# 多开3个微信
for i in range(3):wework = ntwork.WeWork()wework.open(smart=False)

更完善的多实例管理查看 fastapi_example例子

如何监听输出所有的消息

# 注册监听所有消息回调
import ntwork@wework.msg_register(ntwork.MT_ALL)
def on_recv_text_msg(wework_instance: ntwork.WeWork, message):print("########################")print(message)

完全例子查看examples/msg_register_all.py

如何关闭 ntwork 日志

os.environ['NTWORK_LOG'] = "ERROR" 要在import ntwork前执行

# -*- coding: utf-8 -*-
import os
import sys
import time
os.environ['NTWORK_LOG'] = "ERROR"import ntwork

如何关闭 cmd 窗口

先使用pip install pywin32 安装pywin32模块, 然后在代码中添加以下代码, 完整例子查看examples/cmd_close_event.py

import sys
import ntwork
import win32apidef on_exit(sig, func=None):ntwork.exit_()sys.exit()# 当关闭cmd窗口时
win32api.SetConsoleCtrlHandler(on_exit, True)

Pyinstaller 打包 exe

使用 pyinstaller 打包 ntwork 项目,需要添加 --collect-data=ntwork 选项

打包成单个 exe 程序

pyinstaller -F --collect-data=ntwork main.py

将所有的依赖文件打包到一个目录中

pyinstaller -y --collect-data=ntwork main.py

打包 fastapi_example 示例,需要添加 --paths=. --collect-data=ntchat

pyinstaller -F --paths=. --collect-data=ntchat main.py

登录日志预览

2024-04-12 00:45:21,949 - WeWorkManager - INFO - initialize wework, version: 4.0.8.6027
2024-04-12 00:45:21,949 - WeWorkManager - DEBUG - new wework instance
2024-04-12 00:45:21,982 - WeWorkInstance - INFO - open wework pid: 57024
2024-04-12 00:45:23,671 - WeWorkManager - DEBUG - accept client_id: 1
2024-04-12 00:45:26,225 - WeWorkInstance - DEBUG - on recv message: {'data': {'account': '', 'acctid': 'WangPaiGeGe', 'avatar': 'https://wework.qpic.cn/wwpic3az/457956_UJkq5TJkTfCnA5x_1712341231/0', 'corp_id': '1970325052533916', 'document_root': 'C:\\Users\\Administrator\\Documents\\WXWork\\1688856738534700', 'email': '', 'job_name': '', 'mobile': '19561983930', 'nickname': '', 'pid': 57024, 'position': '', 'sex': 1, 'user_id': '1688856738534700', 'username': '王牌哥哥'}, 'type': 11026}
2024-04-12 00:45:26,241 - WeWorkInstance - INFO - login success, name: 王牌哥哥

私聊自动回复案例

import sys
import ntworkwework = ntwork.WeWork()# 打开 pc 企业微信, smart: 是否管理已经登录的微信
wework.open(smart=True)# 注册消息回调
@wework.msg_register(ntwork.MT_RECV_TEXT_MSG)
def on_recv_text_msg(wework_instance: ntwork.WeWork, message):data = message["data"]sender_user_id = data["sender"]self_user_id = wework_instance.get_login_info()["user_id"]conversation_id: str = data["conversation_id"]# 判断消息不是自己发的并且不是群消息时,回复对方if sender_user_id != self_user_id and not conversation_id.startswith("R:"):wework_instance.send_text(conversation_id=conversation_id, content=f"你发送的消息是: {data['content']}")try:while True:pass
except KeyboardInterrupt:ntwork.exit_()sys.exit()

消息属性

私聊消息属性说明

{'appinfo': 'CAQQiZrgsAYYpMv0mZmAgAMgyIKKUw==','at_list': [],'content': '我喜欢你','content_type': 0,'conversation_id': 'S:1688856625489316_1688856738534700','is_pc': 0,'local_id': '34','receiver': '1688856738534700','send_time': '1712852233','sender': '1688856625489316','sender_name': '唤醒手腕','server_id': '1000235'
}

群聊消息属性说明

{'appinfo': 'CAQQiKTgsAYYpMv0mZmAgAMg99ak/Ak=','at_list': [],'content': '我喜欢你','content_type': 0,'conversation_id': 'R:1970325052533916','is_pc': 0,'local_id': '41','receiver': '1688856738534700','send_time': '1712853512','sender': '1688856625489316','sender_name': '唤醒手腕','server_id': '1000258'
}

案例:故障离线表格统计

读取故障数据源码

import re# 假设这是你的消息体字符串
test_message = """  
【故障位置】化州西收费站97车道
【故障情况】不能缴费
【填报人】唤醒手腕
"""def analysis_repair_data(message):# 定义正则表达式模式,用于匹配每个字段pattern = r"【故障位置】(.*)\n【故障情况】(.*)\n【填报人】(.*)"# 使用re.search来查找匹配项match = re.search(pattern, message, re.DOTALL)if match:fault_location = match.group(1).strip()  # 提取故障位置fault_situation = match.group(2).strip()  # 提取故障情况reporter = match.group(3).strip()  # 提取填报人return {"fault_location": fault_location,"fault_situation": fault_situation,"reporter": reporter}else:return False

读取维修数据源码

import re# 假设这是你的消息体字符串
test_message = """  
【故障编号】 
【维修情况】已修复  
【维修人】xxx  
"""def analysis_solve_data(message):# 定义正则表达式模式,用于匹配每个字段pattern = r"""  【故障编号】(.*)  【维修情况】(.*)  【维修人】(.*)  """pattern = re.compile(pattern, re.DOTALL | re.VERBOSE)# 使用re.search来查找匹配项match = pattern.search(message)if match:serial = match.group(1).strip()  # 提取故障编号repair_situation = match.group(2).strip()  # 提取维修情况repair_person = match.group(3).strip()  # 提取维修人return {"serial": serial,"repair_situation": repair_situation,"repair_person": repair_person}else:return False

更新离线 Excel 表格源码

from datetime import datetimefrom openpyxl.reader.excel import load_workbook# 加载工作簿
wb = load_workbook(filename='故障维修登记表.xlsx')
# 选择活动工作表或者通过名字选择工作表
ws = wb.active  # 使用活动工作表def insert_new_note(repair_data):# 获取行数row_count = ws.max_rownow = datetime.now()# 使用f-string格式化时间formatted_time = f"{now:%Y%m%d-%H%M%S}"data = {"index": row_count,"serial": formatted_time,"fault_location": repair_data['fault_location'],"fault_situation": repair_data['fault_situation'],"reporter": repair_data['reporter'],"repair_situation": "","repair_person": ""}row_num = row_count + 1ws.cell(row=row_num, column=1).value = data['index']ws.cell(row=row_num, column=2).value = data['serial']ws.cell(row=row_num, column=3).value = data['fault_location']ws.cell(row=row_num, column=4).value = data['fault_situation']ws.cell(row=row_num, column=5).value = data['reporter']ws.cell(row=row_num, column=6).value = data['repair_situation']ws.cell(row=row_num, column=7).value = data['repair_person']# 保存工作簿到文件wb.save("故障维修登记表.xlsx")return data['serial']def finish_old_note(solve_data):target_name = solve_data['serial']# 遍历所有行,查找目标值state = Falsefor index, row in enumerate(ws.iter_rows(values_only=True)):if row[1] == "编号":continueif row[1] == target_name:  # 假设"Name"在第一列# 找到目标行后,修改该行的数据# 这里假设我们要修改的是第二列的数据,将其改为"New Value"ws.cell(row=(index + 1), column=6).value = solve_data['repair_situation']ws.cell(row=(index + 1), column=7).value = solve_data['repair_person']state = Truewb.save("故障维修登记表.xlsx")break  # 找到后就退出循环if state:return solve_data['serial']else:return False

主程序 app.py 源码

# -*- coding: utf-8 -*-
import sys
from datetime import datetimeimport ntworkfrom read_repair_data import analysis_repair_data
from read_solve_data import analysis_solve_data
from update_excel import insert_new_note, finish_old_notewework = ntwork.WeWork()# 打开 pc 企业微信, smart: 是否管理已经登录的微信
wework.open(smart=True)# 注册消息回调
@wework.msg_register(ntwork.MT_RECV_TEXT_MSG)
def on_recv_text_msg(wework_instance: ntwork.WeWork, message):data = message["data"]if data['content'][0:1] != "【":returnsender_user_id = data["sender"]self_user_id = wework_instance.get_login_info()["user_id"]conversation_id: str = data["conversation_id"]# 判断消息不是自己发的并且不是群消息时,回复对方if sender_user_id != self_user_id and conversation_id.startswith("R:"):insert_data = analysis_repair_data(data['content'])if insert_data:serial = insert_new_note(insert_data)now = datetime.now()# 使用f-string格式化时间formatted_time = f"{now:%Y-%m-%d %H:%M:%S}"print(f"【反馈结果】【{formatted_time}】请注意存在新的反馈:{serial}")wework_instance.send_text(conversation_id=conversation_id, content=f"【反馈结果】反馈成功\n【故障编号】{serial}")insert_data = analysis_solve_data(data['content'])if insert_data:serial = finish_old_note(insert_data)if serial:# 使用f-string格式化时间now = datetime.now()formatted_time = f"{now:%Y-%m-%d %H:%M:%S}"print(f"【维修结果】【{formatted_time}】请注意存在新的维修:{serial}")wework_instance.send_text(conversation_id=conversation_id, content=f"【维修结果】维修成功\n【故障编号】{str(serial)}")else:wework_instance.send_text(conversation_id=conversation_id, content=f"【操作警告】故障编号不存在!")try:while True:pass
except KeyboardInterrupt:ntwork.exit_()sys.exit()

填报故障真机演示

在这里插入图片描述

维修故障真机演示

在这里插入图片描述

Excel 表格情况预览

在这里插入图片描述

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

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

相关文章

2024年湖北省专升本C语言程序设计大题真题解析

2024年湖北省的专升本考试已于4月30日举行,考试中,出现了许多不同的考试题目,我在网上找到一所高校专升本的大题(好像是湖北师范的,后续会有湖北理工的大题真题解析,敬请期待),那么我…

024.反转链表

给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3: 输…

Web数字孪生引擎

Web数字孪生引擎是指用于在Web上创建和运行数字孪生的软件平台。它们通常提供一组API和工具,用于连接到实时数据源、可视化数据并创建交互式体验。Web数字孪生引擎被广泛应用于各种应用,例如工业物联网、智能建筑、城市管理和公共安全等。北京木奇移动技…

SpringCloudAlibaba:5.1Sentinel的基本使用

概述 简介 Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 官网 https://sentinelguard.io/zh-cn/ Sentinel的历史 2012 年,Sentinel 诞生,主要功能为入口流量控制。 2013-2017 年…

【GlobalMapper精品教程】078:计算点的平面(经纬度)坐标、面状数据的周长面积

文章目录 一、加载数据二、计算点的坐标三、计算面状数据的周长面积一、加载数据 在点状图层上右键,编辑属性。 属性表如下所示,可以看到,并没有点的经纬度或者平面坐标。 二、计算点的坐标 选择所有点→右键→属性样式功能→向选定的要素添加坐标边界功能。

系统架构设计师 - 计算机组成与体系结构(1)

计算机组成与体系结构 计算机组成与体系结构计算机结构 ★CPU 组成结构运算器组成控制器组成 计算机体系结构冯诺依曼结构哈弗结构 嵌入式芯片(了解) 存储系统 ★★★★概述Cache主存编址磁盘管理磁盘基本结构与存取过程磁盘优化分布存储磁盘管理 大家好…

【Web后端】servlet基本概念

1.ServletAPI架构 HttpServlet继承GenericServletGenericServlet实现了Servlet接口,ServletConfig接口,Serializable接口自定义Servlet继承HttpServlet 2.Servlet生命周期 第一步:容器加载Servlet第二步:调用Servlet的无参构造方法&#xf…

章十二、数据库(1) —— 概述、MySQL数据库、SQL、DDL、DML、DQL、多表设计

为什么学习数据库: ● 实现数据持久化到本地; ● 使用完整的管理系统统一管理,可以实现结构化查询,方便管理; 一、 数据库概述 ● 数据库 数据库(DataBase)为了方便数据的 存储 和 管理 &…

CAP与BASE分布式理论

一、分布式理论 1.CAP理论 CAP理论是说对于分布式数据存储,最多只能同时满足一致性(C,Consistency)、可用性(A, Availability)、分区容忍性(P,Partition Tolerance&…

AE电源 PEII_10K说明书

AE电源 PEII_10K说明书

Java刷题-基础篇

目录 题目1:打印1~100内奇数和、偶数和 题目2:计算5的阶乘 题目3:计算 1!2!3!4!5! 的和 题目4:找1~100之间即能被3整除,又能被5整除的数字,要求必须使用break/continue 题目5:实现猜数字小…

从零开始学C语言系列之第五章《逗号运算符》

往期回顾 1.【第一章】《认识C语言》 2.【第二章】C语言概述及基本知识1 3.【第二章】C语言概述及基本知识2 4.【第三章】字符串和格式化输入/ 输出 5.【第三章】 printf 6.【第三章】 scanf 7.【第三章】 putchar 8.【第三章】 getchar 9.【第三章】 sizeof 10.【第三章】 st…

银河麒麟操作系统 v10 离线安装 Docker v20.10.9

1查看系统版本 [rootweb-0001 ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION"V10 (Tercel)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Advanced Server V10 (Tercel)" ANSI_COLOR"…

后端的一些科普文章

后端开发一般有4个方面 后端开发流程 1阶段 域名认证 是每一个计算机在网络上有一个ip地址,可以通过这个地址来访问102.305.122.5(举例), 但是这个公网ip地址,比较难记忆,所以大家使用域名来更好的记忆…

使用com.google.common.collect依赖包中的Lists.transform()方法转换集合对象之后,修改集合中的对象属性,发现不生效

目录 1.1、错误描述 (1)引入依赖 (2)模拟代码 (3)运行结果 1.2、解决方案 1.1、错误描述 最近在开发过程中,使用到了com.google.common.collect依赖包,通过这个依赖包中提供的…

OC foudation框架(上)学习

foundation框架 文章目录 foundation框架字符串(NSString && NSMutableString)NSString的其他功能NSMutableString 日期与时间 (NSDate)2.1 日期与时间(NSDate)2.2日期格式器日历与日期组件定时器&…

一个可以同时使用USB和WIFI传输文件到电脑的软件

双轨快传 结合USB2.0和WIFI6技术,通过1000Mbps网口实现每秒高达150MB的传输速率(理论上可达40MB/s通过USB和110MB/s通过WIFI)。 使用 模式 支持普通模式和Root模式,Root模式可访问~/Android/data/与/data/data/目录下的文件。 …

爱喵喵宠物网站系统asp.netmvc

c#asp.net mvc爱喵喵宠物网站系统asp.netmvc 说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net mvc架构和sql server数据库 功能模块: 首页 预约 猫生活 猫科普 参馆 个人中心 管理员后台可以对猫猫和猫…

e 值的故事:从复利到自然增长的数学之旅

自然对数函数的底数 e(也称为自然常数或欧拉数)与 π 一样,是数学中最伟大的常数之一。它大约为 2.718281828,是一个无理数,意味着它的小数部分无限且不重复。 与 π 和 √2 这些由几何发现而来的常数不同&#xff0c…

【debug】如何使用pycharm对代码调试

后续会将所有debug中遇到的知识放入,建议关注收藏 本站友情链接: 基本理论专栏(当前更新好的debug所有内容都在这里) 【debug】报错解决方法(CondaHTTPError:HTTP 000 connection failed for url&#xff…