#!/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. gevent监测单线程下的io进行切换

    from gevent import monkey;monkey.patch_all() import gevent import time def eat(name): print('%s eat ...

  3. CUDA开发

    CUB库 https://nvlabs.github.io/cub/index.html

  4. 51Nod1778 小Q的集合 【组合数】【Lucas定理】

    题目分析: 题解好高深...... 我给一个辣鸡做法算了,题解真的看不懂. 注意到方差恒为$0$,那么其实就是要我们求$\sum_{i=0}^{n}\binom{n}{i}(i^k-(n-i)^k)^ ...

  5. SpringBoot整合ssm

    1.创建工程 使用idea可以快速创建SpringBoot的工程 这里选择常用的类库,SpringBoot将各种框架类库都进行了封装,可以减少pom文件中的引用配置: 比如Spring和Mybatis ...

  6. FPGA中亚稳态相关问题及跨时钟域处理

    前言 触发器输入端口的数据在时间窗口内发生变化,会导致时序违例.触发器的输出在一段时间内徘徊在一个中间电平,既不是0也不是1.这段时间称为决断时间(resolution time).经过resolut ...

  7. bzoj 3123 [Sdoi2013]森林(主席树+启发式合并+LCA)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  8. LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)

    题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...

  9. [NOIp2008] 双栈排序 (二分图染色 + 贪心)

    题意 给你一个长为 \(n\) 的序列 \(p\) ,问是否能够通过对于两个栈进行 push, pop(print) 操作使得最后输出序列单调递增(即为 \(1 \cdots n\) ),如果无解输出 ...

  10. Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query(主席树合并)

    题意 给定一棵 \(n\) 个点的带点权树,以 \(1\) 为根, \(m\) 次询问,每次询问给出两个值 \(p, k\) ,求以下值: \(p\) 的子树中距离 \(p \le k\) 的所有点权 ...