Причина, по которой вы не можете декодировать как JSON, заключается в том, что строка пакета не является JSON:
# print_json.py
import pyshark
import json
capture = pyshark.LiveCapture(interface='en0', use_json=True)
for packet in capture.sniff_continuously(packet_count=1):
print(packet)
Вывод:
$ python print_json.py
Packet (Length: 78)
Layer ETH:
dst:
ig: 0
eth.dst_resolved: cc:65:ad:da:39:70
dst_resolved: cc:65:ad:da:39:70
lg: 0
...
В соответствии с соответствующий файл PyShark , параметр use_ json является экспериментальным:
: параметр use_ json: использует tshark в режиме JSON (ЭКСПЕРИМЕНТАЛЬНО). Это намного быстрее, чем XML
Использование tshark с флагом -T json
даст вам json быстрее (и на этом основан use_json
).
Использование Tshark напрямую, вместо
Вам следует рассмотреть возможность использования scapy или tshark напрямую. В этом примере мы печатаем слой ethe rnet одного пакета, вызывая tshark с подпроцессом:
# print_eth_json.py
import json
import subprocess as sp
improt pprint
json_str = sp.check_output("tshark -c 2 -T json".split(' ')).decode('utf-8')
tshark_pkts = json.loads(json_str)
# Transform tshark json into a scapy-like packet-json list.
pkts_json = [pkt['_source']['layers'] for pkt in tshark_pkts]
pprint.pprint(pkts_json[0]['eth'])
, а затем запускаем его:
$ python print_eth_json.py
Capturing on 'Wi-Fi: en0'
2
55 packets dropped from Wi-Fi: en0
{'eth.dst': 'cc:65:ad:da:39:70',
'eth.dst_tree': {'eth.addr': 'cc:65:ad:da:39:70',
'eth.addr_resolved': 'ArrisGro_da:39:70',
'eth.dst_resolved': 'ArrisGro_da:39:70',
'eth.ig': '0',
...