我已经寻找了几个星期,但我没有找到任何可以帮助我解决这个特定问题的东西。
我从一个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循环来筛选输出,以找到失败的状态,但我无法输出连接到它的整个网络的信息,我已经看过了,但大多数示例都是使用单独的单词或数字的小预定义列表。
API调用im使用:(找到了模板,并在必要时进行了修改,以获得我组织中所有网络的总列表)
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())发布于 2021-10-28 12:32:48
在另一个帖子中,@Szabolcs给出了答案:
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",)做我想做的一切。
发布于 2021-10-25 13:07:26
根据您的示例输出,您似乎只在响应和接口中获得了一次网络ID,并且多次被视为Uplink属性的一部分,因此,您可以将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'])https://stackoverflow.com/questions/69707701
复制相似问题