Интересное задание. Вот один из способов ее решения по линии, предложенной Йохеном Рицелем.
Используется pylibpcap вместо pycap . Лично я считаю, что с pycap трудно работать из-за небольшого количества доступной документации. Для pylibpcap вы можете перевести большую часть кода непосредственно из libpcap примеров (см., Например, это руководство для хорошего введения). Справочные страницы для tcpdump и pcap также являются отличными ресурсами.
Возможно, вы захотите взглянуть на стандарты для Ethernet , IPv4 , TCP и HTTP .
Примечание 1: Приведенный ниже код распечатывает только HTTP GET запросы. Фильтрация изображений и загрузка их с помощью модуля urllib не должны создавать проблем.
Примечание 2. Этот код работает в Linux, но не уверен, какие имена устройств вам нужно использовать в Windows / MacOS. Вам также понадобятся права суперпользователя.
#!/usr/bin/env python
import pcap
import struct
def parse_packet(data):
"""
Parse Ethernet/IP/TCP packet.
"""
# See the Ethernet, IP, and TCP standards for details.
data = data[14:] # Strip Ethernet header
header_length = 4 * (ord(data[0]) & 0x0f) # in bytes
data = data[header_length:] # Strip IP header
dest_port = struct.unpack('!H', data[2:4])[0]
if not dest_port == 80: # This is an outgoing package
return
header_length = 4 * ((ord(data[12]) & 0xf0) >> 4) # in bytes
data = data[header_length:] # Strip TCP header
return data
def parse_get(data):
"""
Parse a HTTP GET request, returning the request URI.
"""
if data is None or not data.startswith('GET'):
return
fields = data.split('\n')
uri = fields[0].split()[1]
for field in fields[1:]:
if field.lower().startswith('host:'):
return field[5:].strip() + uri
def packet_handler(length, data, timestamp):
uri = parse_get(parse_packet(data))
if not uri is None:
print uri
# Set up pcap sniffer
INTERFACE = 'wlan0'
FILTER = 'tcp port 80'
p = pcap.pcapObject()
p.open_live(INTERFACE, 1600, 0, 100)
p.setfilter(FILTER, 0, 0)
try:
while True:
p.dispatch(1, packet_handler)
except KeyboardInterrupt:
pass