结合钉钉机器人用python写监控打印机碳粉状态程序

注意事项:
1.新版本pysnmp包不支持getcmd接口,需要指定安装老版本Pysnmp包
解决方法:
① 先pip uninstall pysnmp、pip uninstall pyasn1、pip install pyasn1-modules
② 接着安装pyasn1-modules,指定版本pip install pyasn1-modules0.2.7(此时,它会自动帮你安装pyasn1,版本 是 0.4.8)
③ 最后再安装pysnmp,指定版本pip install pysnmp
5.1.0

点击查看代码
from pysnmp.hlapi import *
import requests
import json
# 配置信息
PRINTER_IP = '1.1.1.1' # 打印机IP
COMMUNITY_STRING = 'public' # SNMP团体名
DINGTALK_WEBHOOK = 'https://oapi.dingtalk.com/robot/send?test' # 替换成钉钉机器人Webhook地址
# 理光打印机OID信息
TONER_OIDS = {
 '黑色': '1.3.6.1.2.1.43.11.1.1.9.1.1',
 '青色': '1.3.6.1.2.1.43.11.1.1.9.1.2',
 '品红色': '1.3.6.1.2.1.43.11.1.1.9.1.3',
 '黄色': '1.3.6.1.2.1.43.11.1.1.9.1.4',
 'black_max': '1.3.6.1.2.1.43.11.1.1.8.1.1',
}
def get_snmp_value(oid):
 """获取SNMP值并处理异常"""
 try:
 error_indication, error_status, error_index, var_binds = next(
 getCmd(SnmpEngine(),
 CommunityData(COMMUNITY_STRING),
 UdpTransportTarget((PRINTER_IP, 161)),
 ContextData(),
 ObjectType(ObjectIdentity(oid)))
 )
 if error_indication:
 print(f"SNMP错误: {error_indication}")
 return None
 elif error_status:
 print(f"SNMP错误: {error_status.prettyPrint()}")
 return None
 return var_binds[0][1] if var_binds else None
 except Exception as e:
 print(f"SNMP查询异常: {str(e)}")
 return None
def send_dingtalk_message(message):
 """发送消息到钉钉机器人"""
 headers = {'Content-Type': 'application/json'}
 payload = {
 "msgtype": "markdown",
 "markdown": {
 "title": "打印机碳粉状态",
 "text": message
 }
 }
 try:
 response = requests.post(DINGTALK_WEBHOOK,
 data=json.dumps(payload),
 headers=headers,
 timeout=5)
 response.raise_for_status()
 print("状态已发送至钉钉")
 except requests.exceptions.RequestException as e:
 print(f"钉钉消息发送失败: {str(e)}")
def get_toner_status():
 """获取并格式化碳粉状态"""
 print("正在获取打印机状态...")
 # 构建消息内容
 status_report = [
 "### 理光IMC2000碳粉状态报告",
 f"**IP地址**: {PRINTER_IP} \n", # 换行符用于钉钉markdown格式
 "|颜色|剩余量|\n|-|-|"
 ]
 for color, oid in TONER_OIDS.items():
 if 'max' in color:
 continue # 跳过最大容量值
 value = get_snmp_value(oid)
 if value is not None:
 status_report.append(f"|{color.upper()}|{value}%|")
 else:
 status_report.append(f"|{color.upper()}|获取失败|")
 # 发送钉钉通知
 send_dingtalk_message("\n".join(status_report))
if __name__ == "__main__":
 get_toner_status()
作者:callmexiaoyu原文地址:https://www.cnblogs.com/callmexiaoyu/p/18824510

%s 个评论

要回复文章请先登录注册