Meraki API 调用 get.organisation/uplinks 查找失败的连接并将 networkid 转换为网络名称

Meraki API call get.organisation/uplinks find failed connections and translate networkid into a network name

我已经找了几个星期了,但没有找到任何可以帮助我解决这个具体问题的东西。

我从 API 调用 (Meraki) 中获得了大量输出,我希望从列表中提取某些功能。

任务:读取 API 调用的输出,循环输出直到检测到状态 'failed' 并打印该项目的接口和 networkId 将 networkId 转换为预定义列表中的网络名称,并继续打印所有“失败的接口”直到输出结束。

API 调用获取整个组织,我想将 networkid 列表与网络名称相匹配(因为它们没有添加到同一个 API 调用中)所以它可读什么网络有哪个接口失败了。

输出包含大量数据,我不需要所有这些输出值,如 IP、网关、DNS 等

API 调用的输出示例:

{'networkId': 'A_1234567890', 'serial': 'A1B2-C3D4-E5F6', 'model': 'MX64', 'lastReportedAt': '2021-01-01T10:00:00Z', 'uplinks': [{'interface': 'wan1', 'status': 'active', 'ip': '192.168.1.2', 'gateway': '192.168.1.1', 'publicIp': '192.168.1.3', 'primaryDns': '8.8.8.8', 'secondaryDns': '8.8.4.4', 'ipAssignedBy': 'static'}, {'interface': 'wan2', 'status': 'ready', 'ip': '172.16.1.2', 'gateway': '172.16.1.1', 'publicIp': '172.16.1.3', 'primaryDns': '8.8.8.8', 'secondaryDns': '8.8.4.4', 'ipAssignedBy': 'static'}]}

这是一个网络,我想检查该组织中有 50 个网络的状态。

我是 Python 的新手,我试过使用 while 循环筛选输出以找到失败状态,但我无法输出与之相关的整个网络信息,我看过了at 但大多数示例都使用单独的单词或数字的小型预定义列表。

API 调用我使用: (找到模板并在必要时进行修改以获得我组织中所有网络的总列表)

import requests

url = "https://api.meraki.com/api/v1/organizations/{ORG_ID}/uplinks/statuses"

payload = None

headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Cisco-Meraki-API-Key": "API_KEY"
}

response = requests.request('GET', url, headers=headers, data = payload)

pprint(response.json())

根据您的示例输出,您似乎只在响应和接口中获得了一次网络 ID,并且多次被视为上行链路属性的一部分, 因此,您可以将 API 响应解析为 Json 对象,并将网络名称 - 网络 ID 映射到字典中,然后执行类似下面的操作以获取失败状态

net_names = {'A_1234567890':'abc', 'b':'xyz'}
network_id =response_json.get('networkId')
for item in response_json['uplinks']:
    if item['status'] == "failed":
        print('network ID:', network_id,'network_name:',net_names.get(network_id), 'Interface:',item['interface'])

@Szabolcs 在另一个 post 中给出的答案:

net_names = {"A_1234567890": "Name"}
for network_data in json_data:
  network_id = network_data.get("networkId")
  for uplink_data in network_data.get("uplinks", []):
    if uplink_data["status"] == "failed":
      print(
        "network ID:",
        network_id, ""
        "Network:",
        net_names.get(network_id, "n/a"),
        "- Interface:",
        uplink_data["interface"],
        "- failed",)

是我想要的吗