对API响应进行排序



我正试图循环通过API响应,只显示唯一的、非重复的ip-srcs:及其值。我设法弄清楚了如何用Python进行调用,并以json格式显示输出,但我在过滤字典时遇到了问题,只能显示ip:src及其值。我尝试了不同的方法,但没有成功。任何建议

这是我的初始代码:

data = '{ "query": "+basetypes:(indicator_attribute) +type:\"ip-src\" +timestamp:[now-300d TO now]", "_source_includes": [ "type", "value" ] }'

response = requests.post('https://notarealapi.com/api/v4/all/search', headers=headers, 
data=data)
data2 = response.json()
data3 = data2['hits']['hits']
result = {}
for index,item  in enumerate(data3):
temp = {}
temp['ip-src'] = item['_source']['value']['ip-src']
result[index]=temp
print("List of unique ip-srcs:n")
pprint.pprint(result)

以下是我当前的api响应:

{0: {'ip-src': '193.56.28.103'},
1: {'ip-src': '62.173.147.175'},
2: {'ip-src': '194.90.6.2'},
3: {'ip-src': '103.94.157.5'},
4: {'ip-src': '62.77.33.18'},
5: {'ip-src': '23.83.209.13'},
6: {'ip-src': '89.163.241.193'},
7: {'ip-src': '62.77.33.18'},
8: {'ip-src': '80.74.144.29'},
9: {'ip-src': '240.140.48.116'},
10: {'ip-src': '159.65.140.182'},

如果我正确理解您的问题,您需要以下输出:

{
0: '193.56.28.103',
1: '62.173.147.175'
}

在这种情况下,您应该将结果(即item['_source']['value']['ip-src'](存储在一个简单的变量中,而不是将其存储在另一个dict中。

为了让它工作,你的循环应该是这样的:

for index,item  in enumerate(data3):
temp = item['_source']['value']['ip-src']
result[index]=temp

或者更简单,你可以做:

for index,item  in enumerate(data3):
result[index] = item['_source']['value']['ip-src']

您可以通过计算每个ip-src的出现次数并只打印出只出现一次的次数来完成此操作。一个简单的方法是使用collections.Counter字典子类来计算每种情况发生的次数,然后只打印出计数为1的情况。

from collections import Counter
data3 =  {0: {'ip-src': '193.56.28.103'},
1: {'ip-src': '62.173.147.175'},
2: {'ip-src': '194.90.6.2'},
3: {'ip-src': '103.94.157.5'},
4: {'ip-src': '62.77.33.18'},
5: {'ip-src': '23.83.209.13'},
6: {'ip-src': '89.163.241.193'},
7: {'ip-src': '62.77.33.18'},
8: {'ip-src': '80.74.144.29'},
9: {'ip-src': '240.140.48.116'},
10: {'ip-src': '159.65.140.182'},}
counts = Counter(value['ip-src'] for value in data3.values())
print("List of unique ip-srcs:n")
for ip_src, count in counts.items():
if count == 1:  # Unique?
print(ip_src)

您可以使用内部字典的值来过滤字典以消除重复,并根据过滤的值创建最终字典:

data1 = {0: {'ip-src': '193.56.28.103'}, 1: {'ip-src': '62.173.147.175'}, 2: {'ip-src': '194.90.6.2'}, 3: {'ip-src': '103.94.157.5'}, 4: {'ip-src': '62.77.33.18'}, 5: {'ip-src': '23.83.209.13'}, 6: {'ip-src': '89.163.241.193'}, 7: {'ip-src': '62.77.33.18'}, 8: {'ip-src': '80.74.144.29'}, 9: {'ip-src': '240.140.48.116'}, 10: {'ip-src': '159.65.140.182'}}
data2 = [] # list to hold unique values
for k,v in data1.items():
if v not in data2: #append items that do not already exist in data2 
data2.append(v)  
final_dict = dict([(data2.index(a),a) for a in data2]) #create a final dictionary
print(final_dict)

输出

{0: {'ip-src': '193.56.28.103'},
1: {'ip-src': '62.173.147.175'},
2: {'ip-src': '194.90.6.2'},
3: {'ip-src': '103.94.157.5'},
4: {'ip-src': '62.77.33.18'},
5: {'ip-src': '23.83.209.13'},
6: {'ip-src': '89.163.241.193'},
7: {'ip-src': '80.74.144.29'},
8: {'ip-src': '240.140.48.116'},
9: {'ip-src': '159.65.140.182'}}

最新更新