File: geojson.py

package info (click to toggle)
python-shodan 1.28.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 400 kB
  • sloc: python: 2,674; makefile: 150
file content (52 lines) | stat: -rw-r--r-- 1,375 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from json import dumps
from .base import Converter
from ...helpers import get_ip, iterate_files


class GeoJsonConverter(Converter):

    def header(self):
        self.fout.write("""{
            "type": "FeatureCollection",
            "features": [
        """)

    def footer(self):
        self.fout.write("""{ }]}""")

    def process(self, files):
        # Write the header
        self.header()

        # We only want to generate 1 datapoint for each IP - not per service
        unique_hosts = set()
        for banner in iterate_files(files):
            ip = get_ip(banner)
            if not ip:
                continue

            if ip not in unique_hosts:
                self.write(ip, banner)
                unique_hosts.add(ip)

        self.footer()

    def write(self, ip, host):
        try:
            lat, lon = host['location']['latitude'], host['location']['longitude']
            feature = {
                'type': 'Feature',
                'id': ip,
                'properties': {
                    'name': ip,
                    'lat': lat,
                    'lon': lon,
                },
                'geometry': {
                    'type': 'Point',
                    'coordinates': [lon, lat],
                },
            }
            self.fout.write(dumps(feature) + ',')
        except Exception:
            pass