python3 下 Zabbix监控调用graph.get并且下载监控图

这个代码是如何访问三个不同机房并将传入的zabbix中的监控机器的ip进行判断(因为后来需要登陆网站,不同的机房名称不一样)
可以输入两个参数
只输入IP 返回监控列表

需要准备的包:
prettytable
安装:pip3 install prettytable

只输入IP

输入 IP 序号
下载图片

IP 序号
IP 序号
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 参数都不用管,只看graphid即可,去api接口处获得对应ip的

import urllib.request
import http.cookiejar
import urllib.parse
import urllib.request
import json
import requests
from prettytable import PrettyTable
import time
import sys

t = str(time.time()).replace('.', '')  #去掉.的时间戳 用于给图片命名
dict_graphid_name = {}

class ZabbixGraph:
    def __init__(self,ip,number= -1):#,number):#),graph):
        self.number = int(number)
        self.IP = ip          #

        #self.number = number
        # self.graph = graph     #
        self.header = {"Content-Type": "application/json-rpc"}
    def get_token(self): # 获得token 并返回
        data = {"jsonrpc": "2.0",
                "method": "user.login",
                "params": {
                    "user": 'xxx',
                    "password": 'xxxx',
                },
                "id": 1,
                "auth": None
                }
        url_m6 = 'http://xxx/zabbix/api_jsonrpc.php'
        token = requests.post(url=url_m6, headers=self.header, data=json.dumps(data))
        json_dict_token = json.loads(token.text)
        return json_dict_token['result']
    def get_hostid(self):
        data = {
            "jsonrpc": "2.0",
            "method": "host.get",
            "params": {
                "output":"extend",# ["hostid","name"],
                "filter": {
                    "host": self.IP
                }
            },
            "auth": self.get_token(),
            "id": 1
                        }
        url_m6 = 'http://xxx/zabbix/api_jsonrpc.php'
        hosts = requests.post(url=url_m6, headers=self.header, data=json.dumps(data))
        json_dict_hostid = json.loads(hosts.text)

        json_dict_hostid_result = json_dict_hostid['result'][0]['hostid']
        # print(json_dict_hostid_result)
        return json_dict_hostid_result

    def get_graphid_name(self):
        data ={
        "jsonrpc": "2.0",
        "method": "graph.get",
        "params": {
            "output": "extend",
            "hostids": self.get_hostid(),
            "sortfield": "name"
        },
        "auth": self.get_token(),
        "id": 1

                    }
        url_m6 = 'http://xxx/zabbix/api_jsonrpc.php'
        hosts = requests.post(url=url_m6, headers=self.header, data=json.dumps(data))
        json_dict_host = json.loads(hosts.text)
        json_dict_host_result = json_dict_host["result"]
        return json_dict_host_result
    def choose_object(self):

        counter = 0
        json_dict_host_result = self.get_graphid_name()
        # print(type(json_dict_host_result))
        tables = PrettyTable(['序号','监控项'])
        #tables = PrettyTable(['序号','监控项',' 序号',' 监控项','序号 ','监控项 ',])
        tables.align['序号','监控项','序号','监控项','序号','监控项',] = 'l'
        tables.horizontal_char = '-'
        tables.junction_char = "-"
        tables.left_padding_width = 3


        for i in json_dict_host_result:
            dict_graphid_name[counter]=i['graphid'],i['name']
            counter += 1
        self.dict_graphid_name1 = dict_graphid_name
        for i in dict_graphid_name:
            # print(i,dict_graphid_name[i][1])# 315338
            tables.add_row([i,dict_graphid_name[i][1]])

        #
        #print(dict_graphid_name[1])
        # long = len(dict_graphid_name)//3+1
        # print(long)

        # for i in range(0,len(dict_graphid_name)//3+1):
        #     t =  i * 3
        #     # if dict_graphid_name[i+t][1] == None :
        #     #     dict_graphid_name[i+t][1] == ' '
        #     # if dict_graphid_name[i+1+t][1] == None :
        #     #     dict_graphid_name[i+t][1] == ' '
        #     # if dict_graphid_name[i+2+t][1] == None :
        #     #     dict_graphid_name[i+2+t][1] == ' '
        #
        #     tables.add_row([i+t,dict_graphid_name[i+t][1],i+1+t,dict_graphid_name[i+1+t][1],i+2+t,dict_graphid_name[i+2+t][1]]) # 格式化输出的元素


        # object = dict_graphid_name[self.number][0]  # 将数字和graphid对应
        #
        if self.number == -1:
            print("请输入IP+项序号:")
            print(tables)
        # return object
        else:
            return dict_graphid_name

    def url_jpg(self):
        if self.number == -1:
            url_2hours = -1

        else:
            # print(dict_graphid_name[1])
            self.graph_id = self.choose_object()[self.number][0]

            url_2hours = 'http://xxx/zabbix/chart2.php?graphid=%s&period=7200' % self.graph_id
        # print(url_2hours)
        return url_2hours



    def get_jpg(self):
        # hosturl = 'http://xxx/zabbix/index.php'  # 自己填写
        # post数据接收和处理的页面(我们要向这个页面发送我们构造的Post数据)
        posturl = 'xxx/zabbix/index.php?request=charts.php%3Fddreset%3D1'  # 从数据包中分析出,处理post请求的url
         #Referer: http://xxx/zabbix/index.php?request=charts.php%3Fddreset%3D1


        # 设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
        cj = http.cookiejar.LWPCookieJar()
        cookie_support = urllib.request.HTTPCookieProcessor(cj)
        opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
        urllib.request.install_opener(opener)
        # 打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
       #h = urllib.request.urlopen(hosturl)


        # 构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
                  'Referer': 'http://xxx/zabbix/index.php'}

        # 构造Post数据,他也是从抓大的包里分析得出的。
        postData = {    'name': 'xxx',
                        'password': 'xxx',
                         'autologin':1,
                        'enter':'Sign in'
                     }


        # 需要给Post数据编码

        postData = urllib.parse.urlencode(postData).encode('utf-8')
        # 通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程
        request = urllib.request.Request(posturl, postData, headers)
        response = urllib.request.urlopen(request)
        #text = response.read().decode()

        #下载图片
        jpg_link = self.url_jpg()  #图片链接
        if jpg_link == -1:
            pass
        else:
            path = '/Users/lee/PycharmProjects/pythonProjects/zabbix/ZabbixGraph/888.jpg' #%s_%s.jpg' % (self.graph_id,t)
            #request.urlretrieve(jpg_link, path)
            urllib.request.urlretrieve(jpg_link, path)



if __name__ == "__main__":
    if len(sys.argv) == 2:
        item = ZabbixGraph(sys.argv[1])
        item.get_graphid_name()
        item.choose_object()
    elif len(sys.argv) != 2:
        item = ZabbixGraph(sys.argv[1],sys.argv[2])
        item.get_graphid_name()
        item.choose_object()
        # item.url_jpg()
        item.get_jpg()
    #

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • Zabbix简介 Zabbix官方网站Zabbix中文文档 本文系统环境是CentOS7x86_64, Zabbi...
    Zhang21阅读 7,978评论 0 37
  • 一、zabbix简介 zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企...
    JokerW阅读 4,348评论 2 29
  • 先通过lnmp一键安装包吧nginx和数据库、php搞起来!然后:实现:1. 获取zabbix centos:获取...
    老夫刘某阅读 2,241评论 0 3
  • zabbix是什么在此就不多作介绍了,可以参考之前的文章零代码如何打造自己的实时监控预警系统,这篇主要介绍安装及注...
    欢醉阅读 1,436评论 0 2
  • 本文详细介绍新哥zabbix安装过程及出现的问题,读完后可直接上手安装。内容较长建议收藏后在电脑打开阅读安装...
    学一学大数据阅读 1,178评论 2 5