#!/usr/bin/python3

import requests,json,re,time,datetime
 
 
url = 'http://xxx.com/api_jsonrpc.php'
headers = {"Content-Type":"application/json"'User-Agent''Godaner.com python-requests'#设置请求头
username = 'username'     #用户名
password = 'passwd'        #密码
 
def get_token():            #获取认证token,token有效时间为zabbix用户配置的自动退出时间
    data = {
        "jsonrpc""2.0",
        "method""user.login",
        "params": {
            "user": username,
            "password": password
        },
        "id"0
    }
    try:
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        token = json.loads(resp.text)['result']
        #resp.close()
    except:
        return 'F'
    return token
#示例获取token 
token = get_token()
print(token)
f24008481e287qc1e931e6598c041od6
 
 
def get_host(token,ip2host=""):
    if ip2host:
        selectItems = "selectItems"
        selectTriggers = "selectTriggers"
    else:
        selectItems = ""
        selectTriggers = ""
    if re.search('[a-z]', ip2host):
        arg = 'host'
    else:
        arg = 'ip'
    #获取单个或者所有zabbix主机信息,ip2host(IP,主机名)为空获取所有主机信息
    #获取所有主机的时候将不输出对应主机的监控项和触发器信息。(大量主机)
    data = {
        "jsonrpc""2.0",
        "method""host.get",
        "params": {
            "output": ["hostid","name","status","available"],
            #返回: [主机id,主机名,主机状态(0监控中|1未监控),主机的可用性(0可用|1不可用)]
            selectItems: ["itemid","key_","name","value_type","status","lastclock","lastvalue"],
            #返回此主机的监控项信息:[id,key,名称,数据类型,可用性(0 启用|1 禁用),上次取值时间,最后一次的值]
            #特别注意value_type,这个参数是创建监控项时,选择的返回值数据类型。当获取不到item值的时候,要注意此值:
            #0 浮点数;1 字符串;2 日志;3 整数 默认值;4 文本长字符串
            selectTriggers: ["expression","priority","status","value"],
            #返回此主机的触发器信息:[触发器表达式,严重级别(0-5),可用性(0 启用|1 禁用),触发器状态(0 正常|1 问题)]
            "selectGroups": ["groupid","name"],
            #返回此主机所在组:[组id,组名]
            "selectInterfaces": ["interfaceid","ip","port"],
            #返回此主机连接信息:[网卡id,ip地址,端口]
            "selectParentTemplates": ["templateid","name"],
            #返回此主机连接的模板信息:[模板id,模板名]
            "filter": {
                arg: ip2host,
            },
            #过滤,这个跟上面的逻辑对应,这里过滤ip或者主机名,只在ip2host参数有值时生效
        },
    "id"0,
    "auth": token,
    }
    resp = requests.post(url=url, headers=headers, data=json.dumps(data))
    return json.loads(resp.text)['result']
#示例 获取所有主机和单个主机,单个主机的时候返回监控项和触发器信息
hosts = get_host(token)    #获取所有主机信息
print(json.dumps(hosts, indent=4, ensure_ascii=False))
[    
    {
        "status""0",
        "name""xxxxxxxxxx",
        "hostid""14700"
        "available""1",
        "parentTemplates": [
            {
                "templateid""12601",
                "name""Agent_SH"
            },
            {
                "templateid""13025",
                "name""Template_Apps"
            }
        ],
        "interfaces": [
            {
                "interfaceid""4771",
                "ip""xx.xx.xx.xx",
                "port""10050"
            }
        ],
        "groups": [
            {
                "name""Discovered hosts",
                "groupid""5"
            },
            {
                "name""OS_CentOS",
                "groupid""15"
            }
        ],
    },
    {
        "status""0",
        "name""xxxxxxxxxx",
        "hostid""14701"
        "available""1",
        "parentTemplates": [
            {
                "templateid""12601",
                "name""Agent_SH"
            },
            {
                "templateid""13025",
                "name""Template_Apps"
            }
        ],
        "interfaces": [
            {
                "interfaceid""4834",
                "ip""xx.xx.xx.xx",
                "port""10050"
            }
        ],
        "groups": [
            {
                "name""Discovered hosts",
                "groupid""5"
            },
            {
                "name""OS_CentOS",
                "groupid""15"
            }
        ],
    },   
    ······
]
host = get_host(token,ip2host='x.x.x.x')    #获取单个主机信息,带项目和触发器信息
print(json.dumps(host, indent=4, ensure_ascii=False))
[
    {
        "interfaces": [
            {
                "ip""x.x.x.x",
                "interfaceid""1",
                "port""10050"
            }
        ],
        "name""Godaner",
        "items": [
            {
                "name""check iptables",
                "lastvalue""it's ok",
                "key_""fwcheck",
                "value_type""4",
                "itemid""23833",
                "lastclock""1554515244",
                "status""0"
            },
            {
                "name""login",
                "lastvalue""Apr 5 16:43:37 Godaner sshd[24987]: Accepted password for ····",
                "key_""log[/var/log/secure,\"Accepted password\",,,skip,]",
                "value_type""2",
                "itemid""23767",
                "lastclock""1554453825",
                "status""0"
            },          
            ······
        ],
        "triggers": [
            {
                "value""0",
                "status""0",
                "priority""5",
                "expression""{13220}=0 and {13221}=0",
                "triggerid""13614"
            },
            {
                "value""0",
                "status""0",
                "priority""4",
                "expression""{13299}>1",
                "triggerid""13616"
            },           
            ······
        ],
        "hostid""10084",
        "groups": [
            {
                "name""testgroup",
                "groupid""4"
            }
        ],
        "available""1",
        "status""0"
    }
]
 
 
def get_trigger_bad(token,hostid=""): 
    if not hostid:
        arg = ""
    else:
        arg = "hostids"
    #获取问题触发器,hostid为空时,获取所有问题触发器
    data = {
        "jsonrpc""2.0",
        "method""trigger.get",
        "params": {
            arg: hostid,
            "only_true"1,         #只返回最近处于问题状态的触发器
            "active"1,            #只返回启用的触发器
            #"skipDependent":1,     #在依赖于其他触发器的问题状态中跳过触发器
            "monitored":1,          #只返回所属被监控主机启用触发器,且包含已启用的监控项(跳过监控项不可用的问题触发器)
            "output": ["priority","status","value","description"],
            #输出: [严重级别|(启用|禁用)|(正常|问题)|触发器名称]
            "selectHosts": ["name"],#返回host,id
            #"selectItems": ["name"],#返回item,id
            "sortfield""priority",#以严重级别排序
            "sortorder""DESC",    #降序 
            "filter": {
               "value"1,         #过滤问题触发器
            }
        },
    "id"0,
    "auth": token,
    }
    resp = requests.post(url=url, headers=headers, data=json.dumps(data))
    return json.loads(resp.text)['result']
#示例 获取当前所有问题触发器
trigger_bad = get_trigger_bad(token)
print(json.dumps(trigger_bad, indent=4, ensure_ascii=False))
[
    {
        "description""Filesystems: 可用磁盘空间少于 5% --> /usr",
        "hosts": [
            {
                "hostid""13382",
                "name""x.x.x.x"
            }
        ],
        "priority""2",
        "value""1",
        "triggerid""77341",
        "status""0"
    },
    {
        "description""zombie on {HOST.NAME}",
        "hosts": [
            {
                "hostid""11820",
                "name""x.x.x.x"
            }
        ],
        "priority""1",
        "value""1",
        "triggerid""63834",
        "status""0"
    },    
    ······    
]
 
 
def get_groups(token):  #获取所有组信息,输出组id,组名
    data = {
        "jsonrpc""2.0",
        "method""hostgroup.get",
        "params": {
           "output": ["groupid","name"],
        },
        "auth": token,
        "id"0,
    }
    resp = requests.post(url=url, headers=headers, data=json.dumps(data))
    return json.loads(resp.text)['result']
#示例 获取所有组
groups = get_groups(token)
print(json.dumps(groups, indent=4, ensure_ascii=False))
[
    {
        "name""SH",
        "groupid""49"
    },
    {
        "name""HK",
        "groupid""4"
    },
    ······
]
 
 
def get_group_hosts(token, groupid):    #获取指定组id里的所有主机,输出主机名跟id
    data = {
        "jsonrpc""2.0",
        "method""host.get"
        "params": {
            "groupids": groupid,
            "output": ["host","hostid"],
        },
        "auth": token,
        "id"0,
    }
    resp = requests.post(url=url, headers=headers, data=json.dumps(data))
    return json.loads(resp.text)['result']
#示例 获取指定组里所有主机
hosts = get_group_hosts(token,groupid='xxx')
print(json.dumps(hosts, indent=4, ensure_ascii=False))
[
    {
        "host""web.zabbix",
        "hostid""13247"
    },
    {
        "host""db.zabbix",
        "hostid""14045"
    },
    ······
]
 
 
def get_items(token, hostid, key=""): #获取指定主机所有监控项,也可指定key名称获取。 
    if re.search('[a-z]', key):
        arg = "key_"
    else:
        arg = "itemid"
    data = {
        'jsonrpc''2.0',
        'method'"item.get",
        "params": {
            "output": ["itemid","key_","name","value_type","status","lastclock","lastvalue"],
            #输出信息跟上面的get_host里的selectItems一样
            "hostids": hostid,
            "filter":{
                arg: key,
            },
        },
        'auth': token,
        'id'0,
    }
    resp = requests.post(url=url, headers=headers, data=json.dumps(data))
    return json.loads(resp.text)['result']
#示例 获取单个主机所有监控项
itemids = get_items(token,hostid='xxxx')
print(json.dumps(itemids, indent=4, ensure_ascii=False))
[
    {
        "lastclock""1554514630",
        "value_type""3",
        "key_""vm.memory.size[total]",
        "name""Total memory",
        "itemid""23830",
        "lastvalue""17180569600",
        "status""0"
    },
    {
        "lastclock""1554517503",
        "value_type""3",
        "key_""webcheck",
        "name""check www.godaner.com",
        "itemid""23832",
        "lastvalue""200",
        "status""0"
    },
    ······
]
 
 
def get_history(token, itemid, limit="10", stime="", etime="", vtp="3"):
    #get_history(token=get_token(),itemid='23809')返回指定监控项23809最近10条数据
    #如果没有值,注意vtp,默认是整数型的,比如要取cpu load的值,就要用vtp=0
    if not etime:
        etime = time.time()
    #不指定结束时间,结束之间为当前时间,也可指定时间段查询,单位为时间戳
    data = {
        "jsonrpc""2.0",
        "method""history.get",
        "params": {
            "output""extend",     #输出所有
            "history": vtp,         #值存储的数据类型
            "itemids": itemid,      #itemid
            "sortfield""clock",   #以时间排序
            "sortorder""DESC",    #倒序
            "limit": limit,         #返回数据的条数
            "time_from": stime,     #返回在给定时间时或之后收到的值
            "time_till": etime,     #返回在给定时间时或之前收到的值
        },
        "auth": token,
        "id"0,
    }
    resp = requests.post(url=url, headers=headers, data=json.dumps(data))
    return json.loads(resp.text)['result']
#示例 获取单个item最近10次的历史记录,也可指定某个时间段,此例为默认
history = get_history(token,itemid='23832')
print(json.dumps(history, indent=4, ensure_ascii=False))
[
    {
        "itemid""23832",
        "ns""670291350",
        "clock""1554516780",
        "value""200"
    },
    {
        "itemid""23832",
        "ns""41115479",
        "clock""1554516660",
        "value""502"
    },
    ······
]
 
 
def get_events(token,tfrom):
    #某个时间之后,由问题触发器产生的事件
    data = {
        "jsonrpc""2.0",
        "method""event.get",
        "params": {
            "output": ["eventid","clock","value"],
            #返回:[事件id,事件,
            #"value这个值是相关对象状态,这个值可能来自于触发器,可能是自动发现,还有可能是内部事件,记住1是问题就行"]
            #"time_from": time.mktime((datetime.datetime.now() - datetime.timedelta(days=1)).timetuple()),
            "time_from": tfrom,         #返回这个时间戳之后的事件
            "selectHosts": ["name"],    #返回这个事件是哪个主机产生的
            "selectRelatedObject": ["triggerid","description"],
            #返回这个事件是哪个对象产生的,如果是触发器的话返回[触发器id,触发器名称]
            "sortfield": ["clock"],     #以时间排序
            "sortorder""desc",        #倒序
            "filter": {                 #过滤
                "source""0",          #0 触发器,1 自动发现,2 自动注册,3内部事件
                "object""0",          #0,1,2,3 同上,0就是触发器事件
                "value""1",           #0 正常事件,1 故障事件
            }
        },
    "auth": token,
    "id"0,
    }
    resp = requests.post(url=url, headers=headers, data=json.dumps(data))
    return json.loads(resp.text)['result']
#示例 获取某个时间之后,所有由问题触发器产生的事件
events = get_events(token,tfrom='1554315660')
print(json.dumps(events, indent=4, ensure_ascii=False))
[
    {
        "eventid""10375",
        "hosts": [
            {
                "name""Godaner",
                "hostid""10084"
            }
        ],
        "clock""1554374074",
        "relatedObject": {
            "triggerid""13654",
            "description""check www.godaner.com"
        },
        "value""1"
    },
    {
        "eventid""10376",
        "hosts": [
            {
                "name""Godaner",
                "hostid""10084"
            }
        ],
        "clock""1554374194",
        "relatedObject": {
            "triggerid""13654",
            "description""check www.godaner.com"
        },
        "value""1"
    },
    ······
]
 
 
def get_alerts(token,tfrom):
    #获取报警信息
    data = {
        "jsonrpc""2.0",
        "method""alert.get",
        "params": {
            "output": ["eventid","subject","clock","esc_step"],
            #输出:[事件id,报警主题,报警时间,
            #警次次数,这个报警次数是针对单事件的,多事件报警这个值永远为1。多事件就是在创建触发器那里有个多事件选择
            #这个值就可以很好的判断 这个报警持续了多久 重要哦]
            "time_from": tfrom,
            #返回这个时间戳之后的报警,上面这个是1天(24小时)前的时间戳
            "selectHosts": ["name"],    #返回报警主机的主机名
            "sortfield": ["clock"],     #以时间排序
            "sortorder""desc",        #倒序
        },
        "auth": token,
        "id"0,
    }
    resp = requests.post(url=url, headers=headers, data=json.dumps(data))
    return json.loads(resp.text)['result']
#示例 获取24小时内报警信息
tt = time.mktime((datetime.datetime.now() - datetime.timedelta(days=3)).timetuple())
alerts = get_alerts(token,tfrom=tt)
print(json.dumps(alerts, indent=4, ensure_ascii=False))
[
    {
        "clock""1554374317",
        "esc_step""3",
        "subject""Godaner: check www.godaner.com",
        "hosts": [
            {
                "hostid""10084",
                "name""Godaner"
            }
        ],
        "eventid""10376",
        "alertid""10129"
    },
    {
        "clock""1554374317",
        "esc_step""3",
        "subject""Godaner: check www.godaner.com",
        "hosts": [
            {
                "hostid""10084",
                "name""Godaner"
            }
        ],
        "eventid""10376",
        "alertid""10130"
    },
    ······
]

Zabbix Web API Get方法整合的更多相关文章

  1. zabbix调用api检索方法

    环境 zabbix:172.16.128.16:zabbix_web:172.16.16.16/zabbix 用户名:Admin 密码:zabbix 获取的数据仅做参考,以Linux发送HTTP的PO ...

  2. 基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用

    我前面几篇随笔介绍了关于几篇关于SqlSugar的基础封装,已经可以直接应用在Winform项目开发上,并且基础接口也通过了单元测试,同时测试通过了一些Winform功能页面:本篇随笔继续深化应用开发 ...

  3. 我这么玩Web Api(一):帮助页面或用户手册(Microsoft and Swashbuckle Help Page)

    前言 你需要为客户编写Api调用手册?你需要测试你的Api接口?你需要和前端进行接口对接?那么这篇文章应该可以帮到你.本文将介绍创建Web Api 帮助文档页面的两种方式,Microsoft Help ...

  4. Web API返回JSON数据

    对Web API新手来说,不要忽略了ApiController 在web API中,方法的返回值如果是实体的话实际上是自动返回JSON数据的例如: 他的返回值就是这样的: { "Conten ...

  5. Web API WinForm使用HttpClient呼叫Web API

    前言 之前几篇文章已经介绍了 Web 与 Web API 的使用方式,接下来将介绍如何在 Windows Form 呼叫 Web API 的方法,要在 WinForm 中使用 Web API 的话,除 ...

  6. WebApi系列~通过HttpClient来调用Web Api接口

    回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...

  7. Web API应用架构设计分析(1)

    Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端(包括浏览器,手机和平板电脑等移动设备)的框架, ASP.NET Web API 是一种用于在 .NET Framewor ...

  8. Web Api 中Get 和 Post 请求的多种情况分析

    转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...

  9. ASP.NET Web API 学习【转】

    转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...

随机推荐

  1. 9.Pod控制器概念和基本操作2

    利用一个简单的例子来启动一个deployment的Pod控制器 [root@master song]# cat deploy.yml apiVersion: apps/v1 kind: Deploym ...

  2. over-relaxation

    逐次超松弛sor 参考1https://blog.csdn.net/lusongno1/article/details/68941137 有各种对比和程序 主要就是取了加权平均,没仔细看

  3. Deconvolution用法

  4. luogu3702-[SDOI2017]序列计数

    Description Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数. Alice还希望,这nn个数中,至少有一个数是质数. Alice想知 ...

  5. 【数学建模】day05-微分方程建模

    很多问题,归结起来是微分方程(组)求解的问题.比如:为什么使用三级火箭发射卫星.阻滞增长人口模型的建立…… MATLAB提供了良好的微分方程求解方案. 一.MATLAB求微分方程的符号解 matlab ...

  6. 【C/C++】c文件重点总结

    c文件重点知识总结 程序文件数据文件--->分文本文件(ASCII文件)和映像文件(二进制文件) .区分是用记事本打开后能否看懂. 用二进制文件读写花费时间少,因为用文本文件需要有一个转换的过程 ...

  7. 19JDBC初体验

    一.JDBC常用类和接口 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为 ...

  8. HUST 1555 数学作业

    参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6394892.html 1555 - A Math Homework 时间限制:1秒 内存限制:12 ...

  9. C Looooops POJ - 2115 拓展gcd 有一个定理待补()

    补算法导论P564 MODULAR-LINEAR-EQUATION-SOLVER算法(P564)

  10. expect交互式安装软件

    公司一些宿主机需要安装软件,吴老师要求写一个安装脚本: 脚本思路:首先要把安装的包拷贝到每台机器上,然后要让每台机器都运行一次安装命令:就想到了应用scp.ssh命令,但这两个命令需要输入对端密码,需 ...