HLS Downloader:浏览器中轻松下载流媒体视频的终极解决方案
2026/6/30 8:29:12
importrequestsimportjsonimporttimeclassZabbixCollector:""" Zabbix API 数据采集器,专为提取存储性能月度数据设计。 """def__init__(self,zabbix_url,username,password):self.url=f"{zabbix_url}/api_jsonrpc.php"self.headers={'Content-Type':'application/json-rpc'}self.username=username self.password=password self.auth_token=Noneself.req_id=1def_call_api(self,method,params):"""底层封装:统一处理 Zabbix JSON-RPC 请求与响应"""payload={"jsonrpc":"2.0","method":method,"params":params,"id":self.req_id}ifself.auth_token:payload['auth']=self.auth_token self.req_id+=1try:response=requests.post(self.url,headers=self.headers,json=payload,timeout=10)response.raise_for_status()result=response.json()if'error'inresult:print(f"[-] API 调用错误 ({method}):{result['error']['data']}")returnNonereturnresult.get('result')exceptExceptionase:print(f"[-] 请求异常:{e}")returnNonedeflogin(self):"""第一步:登录并获取鉴权 Token"""print("[*] 正在连接 Zabbix API...")params={"user":self.username,"password":self.password}self.auth_token=self._call_api("user.login",params)ifself.auth_token:print("[+] Zabbix 登录成功!")returnTruereturnFalsedefget_host_id(self,host_name):"""第二步:通过设备名称获取 Zabbix Host ID"""params={"filter":{"host":[host_name]}}hosts=self._call_api("host.get",params)ifhosts:returnhosts[0]['hostid']returnNonedefdump_all_items_to_file(self,host_id,filename="zabbix_items_dump.txt"):"""辅助排错工具:导出该主机下的所有监控项清单"""print(f"[*] 正在拉取 Host ID{host_id}的所有监控项,请稍候...")params={"output":["itemid","name","key_"],"hostids":host_id}items=self._call_api("item.get",params)ifitems:withopen(filename,"w",encoding="utf-8")asf:f.write(f"=== 主机 ID{host_id}监控项清单 (共{len(items)}项) ===\n\n")foriteminitems:f.write(f"名称:{item['name']}\n")f.write(f" --> ID:{item['itemid']}| Key:{item['key_']}\n")f.write("-"*40+"\n")print(f"[+] 成功导出{len(items)}个监控项,已保存至文件:{filename}")returnTrueprint("[-] 导出失败或该主机下无监控项。")returnFalsedefget_item_id(self,host_id,item_keyword):"""第三步:根据关键词(模糊)查找特定监控项 ID"""params={"output":["itemid","name","key_"],"hostids":host_id,"search":{"name":item_keyword},"searchWildcardsEnabled":True}items=self._call_api("item.get",params)ifitems:returnitems[0]['itemid'],items[0]['name']returnNone,Nonedefget_monthly_trend(self,item_id,days_back=30):"""第四步:按月度拉取趋势数据,计算最大值与均值"""time_till=int(time.time())time_from=time_till-(days_back*24*3600)params={"output":["itemid","clock","value_min","value_max","value_avg"],"itemids":[item_id],"time_from":time_from,"time_till":time_till}trends=self._call_api("trend.get",params)ifnottrends:returnNoneall_max=max(float(t['value_max'])fortintrends)all_avg=sum(float(t['value_avg'])fortintrends)/len(trends)return{"monthly_max":all_max,"monthly_avg":all_avg,"data_points":len(trends)}# ================= 运行逻辑 =================if__name__=="__main__":# 配置信息ZABBIX_URL="http://192.168.0.130/zabbix"ZABBIX_USER="Admin"ZABBIX_PASS="zabbix"TARGET_HOST="Dorado5000202606"# 模式控制:设为 True 用于寻找未知的监控项名称;设为 False 用于拉取性能数据MODE_DUMP_ITEMS=Truezabbix=ZabbixCollector(ZABBIX_URL,ZABBIX_USER,ZABBIX_PASS)ifzabbix.login():print(f"[*] 正在查询主机:{TARGET_HOST}...")host_id=zabbix.get_host_id(TARGET_HOST)ifnothost_id:print(f"[-] 在 Zabbix 里未找到主机{TARGET_HOST}。")else:print(f"[+] 成功定位主机 (Host ID:{host_id})")ifMODE_DUMP_ITEMS:# 模式 1:导出所有监控项找名字zabbix.dump_all_items_to_file(host_id,"dorado_items.txt")print("\n[!] 提示:请打开 dorado_items.txt 搜索 IOPS/时延,确认具体名称后,修改脚本切换为模式 2。")else:# 模式 2:根据确切名字拉取性能数据# TODO: 当你在 txt 文件中找到正确名字后,填在这里,并将 MODE_DUMP_ITEMS 改为 FalseSEARCH_KEYWORD='填入你找到的确切名称'print(f"[*] 正在查找监控项: '{SEARCH_KEYWORD}'...")item_id,item_name=zabbix.get_item_id(host_id,SEARCH_KEYWORD)ifitem_id:print(f"[+] 找到监控项: [{item_name}] (ID:{item_id})")print("[*] 正在计算过去 30 天的性能聚合数据...")trend_data=zabbix.get_monthly_trend(item_id,days_back=30)iftrend_data:print("\n=== 月度性能统计 ===")print(f"设备名称:{TARGET_HOST}")print(f"指标名称:{item_name}")print(f"月度均值 (Avg):{trend_data['monthly_avg']:.2f}")print(f"月度峰值 (Max):{trend_data['monthly_max']:.2f}")else:print("[-] 该监控项近期无趋势数据。")else:print(f"[-] 未找到名称包含 '{SEARCH_KEYWORD}' 的监控项。")