#!/usr/bin/python3 import re import os import sys import net_tree import requests # массив выгружаемых списков ip_list = { 'RU': [ { 'url': 'https://stat.ripe.net/data/country-resource-list/data.json?resource=RU', 'type': 'ipv4' }, { 'url': 'https://ipv4.fetus.jp/ru.txt', 'type': 'ipv4' }, { 'url': 'https://github.com/ipverse/rir-ip/blob/master/country/ru/ipv4-aggregated.txt', 'type': 'ipv4' } ], 'GOOGLE': [ { 'url': 'https://bgp.he.net/AS15169#_prefixes', 'type': 'ipv4' }, { 'url': 'https://ipinfo.io/widget/demo/AS15169?dataset=asn', 'type': 'ipv4' }, { 'url': 'https://api.hackertarget.com/aslookup/?q=AS15169', 'type': 'ipv4' }, { 'url': 'https://www.gstatic.com/ipranges/goog.json', 'type': 'ipv4' } ], 'RKN': [ { 'url': 'https://reestr.rublacklist.net/api/v3/ips/', 'type': 'ipv4' }, { 'url': 'https://antifilter.network/download/ip.lst', 'type': 'ipv4' }, ], 'MSFT': [ { 'url': 'https://bgp.he.net/AS8075#_prefixes', 'type': 'ipv4' }, { 'url': 'https://ipinfo.io/widget/demo/AS8075?dataset=asn', 'type': 'ipv4' }, { 'url': 'https://api.hackertarget.com/aslookup/?q=AS8075', 'type': 'ipv4' }, ], 'VALVE': [ { 'url': 'https://bgp.he.net/AS32590#_prefixes', 'type': 'ipv4' }, { 'url': 'https://ipinfo.io/widget/demo/AS32590?dataset=asn', 'type': 'ipv4' }, { 'url': 'https://api.hackertarget.com/aslookup/?q=AS32590', 'type': 'ipv4' }, ] # 'AMAZONE': [ # { 'url': 'https://bgp.he.net/AS16509#_prefixes', 'type': 'ipv4' }, # { 'url': 'https://ipinfo.io/widget/demo/AS16509?dataset=asn', 'type': 'ipv4' }, # { 'url': 'https://api.hackertarget.com/aslookup/?q=AS16509', 'type': 'ipv4' }, # ] } def list_ip(c_list: dict = []): for c_url in c_list: try: result = requests.get(c_url['url']) if result.status_code == 200: print(f"URL: {c_url['url']}") # обработка ipv4 if c_url['type'] == 'ipv4': # выполняем поиск по регулярному выражению ipv4 ipv4_list=re.finditer(r"[^0-9.](25[0-5]|2[0-4][0-9]|[1-9][0-9][0-9]?|[0-9])\.(25[0-5]|2[0-4][0-9]|[1-9][0-9][0-9]?|[0-9])\.(25[0-5]|2[0-4][0-9]|[1-9][0-9][0-9]?|[0-9])\.(25[0-5]|2[0-4][0-9]|[1-9][0-9][0-9]?|[0-9])(/([0-9]{1}[0-9]*))*[\r\n$\"',]+", result.text) # строим дерево Root = net_tree.Node(net_tree.Net(0,0), 0) # пробегаем в цикле for c in ipv4_list: # готовим данные для добавление в дерево ip = 0 for i in range(1, 5): ip = ip * 256 + int(c.group(i)) if c.group(6): mask_size = int(c.group(6)) else: mask_size = 32 # добавляем запись в дерево Root.addSubnet(net_tree.Node(net_tree.Net(ip, mask_size), 1)) Root.finishTreeFirst() # жесткое сжатие в размер 30000 записей #Root.collapseRoot(Root.real_ip_records_count - 30000) # более мягкое сжатие Root.collapse(1,Root.real_ip_records_count) # возвращаем результат res = Root.returnCollapsedTree('route {addr}/{masklen} blackhole;') # рузультат поиска не пустой if res: print("Успешно") return Root.real_ip_records_count, res # результат поиска пустой print("Список пуст") # обработка ipv6 if c_url['type'] == 'ipv6': return False break; # результат запроса к url пустой print("Ошибка соединения") except Exception as e: # исключение print(f"Ошибка: {e}") return False, False # главная фукция if __name__ == "__main__": # создаем дерриктори. для сохранения outdir=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'unloading') if not os.path.exists(outdir): os.makedirs(outdir,exist_ok=True) # обходим массив списков для выкрузки for list in ip_list: # имя выходного файла out_file=f"{outdir}/{list.lower()}.txt" # вычисляем кол-во записей прошлой выгрузки if os.path.isfile(out_file): old_load_count = sum(1 for line in open(out_file)) else: old_load_count = 0 # выполняем выгрузку print(f"Выгружаю список IP: {list}") load_count, load_list=list_ip(ip_list[list]) if load_count and load_list and load_count >= old_load_count * 0.7: # сохраняем в файл with open(out_file, "w") as file: file.write(load_list) print(f"Файл {out_file} сохранён") print("")