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

点击查看代码

复制代码
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()