123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- #! /usr/bin/env python3
- # Copyright (c) 2020 Snoop Project <snoopproject@protonmail.com>
- """Плагины Snoop Project/Черновик"""
- import ipaddress
- import json
- import locale
- import os
- import platform
- import re
- import random
- import requests
- import signal
- import socket
- import sys
- import threading
- import time
- import webbrowser
- from colorama import Fore, Style, init
- from rich.console import Console
- from rich.progress import TimeElapsedColumn, Progress
- from rich.table import Table
- from urllib.parse import urlparse
- import snoopbanner
- Android = True if hasattr(sys, 'getandroidapilevel') else False
- locale.setlocale(locale.LC_ALL, '')
- init(autoreset=True)
- console = Console()
- time_date = time.localtime()
- head0 = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + \
- f'Chrome/{random.choice(range(97, 108, 1))}.0.{random.choice(range(2007, 3008, 23))}.100 Safari/537.36'}
- def ravno():
- console.rule(characters='=', style="cyan bold")
- def helpend():
- console.rule("[bold red]Конец справки")
- wZ1bad = [] #отфильтрованные ip (не ip) или отфильтрованные данные Yandex, отфильтрованные 'геокоординаты'
- azS = [] #список результатов future request
- coord = [] #координаты многоцелевой список
- my_session = requests.Session()
- da = requests.adapters.HTTPAdapter(max_retries=2)
- my_session.mount('https://', da)
- progressYa = Progress(TimeElapsedColumn(), "[progress.percentage]{task.percentage:>1.0f}%", auto_refresh=False)
- ## ERR.
- def Erf(hvostfile):
- print(f"\033[31;1mНе могу найти_прочитать файл: '{hvostfile}'.\033[0m \033[36m\n " + \
- f"\nПожалуйста, укажите текстовый файл в кодировке —\033[0m \033[36;1mutf-8.\033[0m\n" + \
- f"\033[36mПо умолчанию, например, блокнот в OS Windows сохраняет текст в кодировке — ANSI.\033[0m\n" + \
- f"\033[36mОткройте ваш файл '{hvostfile}' и измените кодировку [файл ---> сохранить как ---> utf-8].\n" + \
- f"\033[36mИли удалите из файла нечитаемые спецсимволы.")
- ravno()
- ## Карты, мета инфо.
- "Черновик."
- ## Модуль Yandex_parser.
- # api https://yandex.ru/dev/id/doc/dg/reference/response.html#response__norights_5
- def module3():
- while True:
- listlogin = []
- dicYa = {}
- # Парсинг.
- def parsingYa():
- for login in listlogin:
- urlYa = f'https://yandex.ru/collections/api/users/{login}/'
- #urlYa = f'https://yandex.ru/znatoki/api/user/public/{login}/'
- try:
- r = my_session.get(urlYa, headers=head0, timeout=3)
- azS.append(r)
- except Exception:
- print(f"\n{Fore.RED}Ошибка сети пропуск —> '{Style.RESET_ALL}{Style.BRIGHT}" + \
- f"{Fore.RED}{login}{Style.RESET_ALL}{Fore.RED}'{Style.RESET_ALL}")
- if Ya != '4':
- ravno()
- continue
- with progressYa:
- if Ya == '4':
- task = progressYa.add_task("", total=len(listlogin))
- for reqY, login in zip(azS, listlogin):
- if Ya == '4':
- progressYa.update(task, advance=1, refresh=True)
- rY = reqY.text
- #print(rY.text)
- try:
- rdict = json.loads(rY.text)
- if rdict.get('title') == "404 Not Found": #равно
- raise Exception("")
- except Exception:
- rdict = {}
- rdict.update(public_id="Увы", display_name="-No-")
- login_tab = login.split(sep='@', maxsplit=1)[0]
- pub = rdict.get("public_id")
- name = rdict.get("display_name")
- email = f"{login_tab}@yandex.ru"
- avatar = rdict.get("default_avatar_id")
- if rdict.get("display_name") == "-No-":
- if Ya != '4':
- print(Style.BRIGHT + Fore.RED + "\nНе сработало")
- console.rule(characters="=", style="cyan bold\n")
- else:
- continue
- continue
- else:
- table1 = Table(title=f"\n{Style.DIM}{Fore.CYAN}demo_func{Style.RESET_ALL}", style="green")
- table1.add_column("Имя", style="magenta", overflow="fold")
- table1.add_column("Логин", style="cyan", overflow="fold")
- table1.add_column("E-mail", style="cyan", overflow="fold")
- if Ya == '3':
- table1.add_row(name, "Пропуск", "Пропуск")
- else:
- table1.add_row(name, login_tab, email)
- console.print(table1)
- otzyv = f"https://reviews.yandex.ru/user/{pub}"
- market = f"https://market.yandex.ru/user/{pub}/reviews"
- if Ya == '3':
- music = f"\033[33;1mПропуск\033[0m"
- else:
- music = f"https://music.yandex.ru/users/{login}/tracks"
- dzen = f"https://zen.yandex.ru/user/{pub}"
- qu = f"https://yandex.ru/q/profile/{pub}/"
- avatar_html = f"https://avatars.mds.yandex.net/get-yapic/{avatar}/islands-retina-50"
- avatar_cli = f"https://avatars.mds.yandex.net/get-yapic/{avatar}/islands-300"
- print("\033[32;1mЯ.Отзывы:\033[0m", otzyv)
- print("\033[32;1mЯ.Маркет:\033[0m", market)
- print("\033[32;1mЯ.Музыка:\033[0m", music)
- print("\033[32;1mЯ.Дзен:\033[0m", dzen)
- print("\033[32;1mЯ.Кью:\033[0m", qu)
- print("\033[32;1mЯ.Avatar:\033[0m", avatar_cli)
- yalist = [avatar_html, otzyv, market, music, dzen, qu]
- for webopen in yalist:
- if webopen == music and Ya == '3':
- continue
- else:
- if "arm" in platform.platform(aliased=True, terse=0) or "aarch64" in platform.platform(aliased=True, terse=0):
- pass
- else:
- webbrowser.open(webopen)
- ravno()
- azS.clear()
- print("\n\033[36m[\033[0m\033[32;1m1\033[0m\033[36m] --> Указать логин пользователя\n" + \
- "[\033[0m\033[32;1m2\033[0m\033[36m] --> Указать публичную ссылку на Яндекс.Диск\n" + \
- "[\033[0m\033[32;1m3\033[0m\033[36m] --> Указать идентификатор пользователя\n" + \
- "[\033[0m\033[32;1m4\033[0m\033[36m] --> Указать файл с именами пользователей\n" + \
- "[\033[0m\033[32;1mhelp\033[0m\033[36m] --> Справка\n" + \
- "[\033[0m\033[31;1mq\033[0m\033[36m] --> Выход\n")
- Ya = console.input("[cyan]ввод ---> [/cyan]")
- # Выход.
- if Ya == "q":
- print(Style.BRIGHT + Fore.RED + "Выход")
- sys.exit()
- # Help.
- elif Ya == "help":
- snoopbanner.help_yandex_parser()
- helpend()
- # Указать login.
- elif Ya == '1':
- print("\033[36m└──Введите login/email разыскиваемого пользователя, например,\033[0m\033[32;1m bobbimonov\033[0m\n")
- login = console.input("[cyan]login/email ---> [/cyan]")
- login = login.split(sep='@', maxsplit=1)[0]
- listlogin.append(login)
- parsingYa()
- # Указать ссылку на Я.Диск.
- elif Ya == '2':
- print("\033[36m└──Введите публичную ссылку на Яндекс.Диск, например,\033[0m\033[32;1m https://yadi.sk/d/7C6Z9q_Ds1wXkw\033[0m\n")
- urlYD = console.input("[cyan]url ---> [/cyan]")
- try:
- r2 = my_session.get(urlYD, headers=head0, timeout=3)
- except Exception:
- print(Fore.RED + "\nОшибка" + Style.RESET_ALL)
- console.rule(characters='=', style="cyan bold\n")
- continue
- try:
- login = r2.text.split('displayName":"')[1].split('"')[0]
- except Exception:
- login = "NoneStop"
- print(Style.BRIGHT + Fore.RED + "\nНе сработало")
- if login != "NoneStop":
- listlogin.append(login)
- parsingYa()
- # Указать идентификатор Яндекс пользователя.
- elif Ya == '3':
- print("\033[36m└──Введите идентификатор пользователя Яндекс, например,\033[0m\033[32;1m tr6r2c8ea4tvdt3xmpy5atuwg0\033[0m\n")
- login = console.input("[cyan]hash ---> [/cyan]")
- listlogin.append(login)
- if len(login) != 26:
- print(Style.BRIGHT + Fore.RED + "└──Неверно указан идентификатор пользователя" + Style.RESET_ALL)
- ravno()
- else:
- parsingYa()
- # Указать файл с логинами.
- elif Ya == '4':
- print("\033[31;1m└──В demo version этот метод плагина недоступен\033[0m\n")
- snoopbanner.donate()
- else:
- print(Style.BRIGHT + Fore.RED + "└──Неверный выбор" + Style.RESET_ALL)
- ravno()
- ## Модуль Reverse Vgeocoder.
- def module2():
- if Android:
- print(Style.BRIGHT + Fore.RED + "└──Плагин Reverse Vgeocoder 'сложен' и не поддерживается (по умолчанию) " + \
- "в Snoop for Termux\n\nВыход\n" + Style.RESET_ALL)
- sys.exit()
- while True:
- print("""
- \033[36m[\033[0m\033[32;1m1\033[0m\033[36m] --> Выбрать файл\n\
- [\033[0m\033[32;1mhelp\033[0m\033[36m] --> Справка\n\
- [\033[0m\033[31;1mq\033[0m\033[36m] --> Выход\n""")
- Vgeo = console.input("[cyan]ввод ---> [/cyan]")
- # Выход.
- if Vgeo == "q":
- print(Style.BRIGHT + Fore.RED + "Выход")
- sys.exit()
- # Help.
- elif Vgeo == "help":
- snoopbanner.help_vgeocoder_vgeo()
- helpend()
- # выбрать файл с геокоординатами.
- elif Vgeo == '1':
- float_patern = '[-]? (?: (?: \d* \. \d+ ))'
- rx = re.compile(float_patern, re.VERBOSE)
- while True:
- print("\033[36m└──Введите \033[0m\033[32;1mабсолютный путь\033[0m \033[36mк файлу (кодировка файла -> utf-8) с данными: \n\
- [геокоординаты] или перетащите файл в окно терминала\033[0m\n")
- put = console.input("[cyan]File ---> [/cyan]")
- if sys.platform == 'win32':
- put = put.replace('"', '').strip()
- else:
- put = put.replace("'", "").strip()
- # Проверка пути файла с координатами.
- try:
- if os.path.exists(put) is False:
- raise Exception("")
- break
- except Exception:
- print("\033[31;1m└──Указан неверный путь. " + \
- "Укажите корректный абсолютный путь к объекту или перетащите файл в окно терминала\033[0m")
- hvostput = os.path.split(put)[1].replace('"', '')
- Erf(hvostput)
- while True:
- print("\n\033[36m╭Выберите режим геокодирования:\033[0m\n" + \
- "\033[36m├──\033[36m[\033[0m\033[32;1m1\033[0m\033[36m] --> Простой (full version)\033[0m\n" + \
- "\033[36m├──\033[36m[\033[0m\033[32;1m2\033[0m\033[36m] --> Подробный (full version)\033[0m\n" + \
- "\033[36m└──\033[36m[\033[0m\033[31;1mq\033[0m\033[36m] --> Выход\033[0m\n")
- rGeo = console.input("[cyan]ввод ---> [/cyan]")
- if rGeo == "q" or rGeo == '1' or rGeo == '2':
- break
- else:
- print(Style.BRIGHT + Fore.RED + "└──Неверный выбор" + Style.RESET_ALL)
- ravno()
- if rGeo == "q":
- print(Style.BRIGHT + Fore.RED + "Выход")
- break
- sys.exit()
- if rGeo == '1' or rGeo == '2':
- print("\033[31;1m└──В demo version этот метод плагина недоступен\033[0m\n")
- snoopbanner.donate()
- break
- sys.exit()
- else:
- print(Style.BRIGHT + Fore.RED + "└──Неверный выбор" + Style.RESET_ALL)
- ravno()
- ## Модуль GEO_IP/domain.
- def module1():
- t_socket = 4
- domain = None
- res4, res6 = None, None
- # Домен.
- def task_fbn(dip):
- nonlocal domain
- #time.sleep(11)
- domain = socket.getfqdn(dip)
- return domain
- # Домен > IPv4/v6.
- def res46(dipp):
- nonlocal res4, res6
- #time.sleep(11)
- try:
- res46 = socket.getaddrinfo(f"{dipp}", 443)
- try:
- res4 = res46[0][4][0] if ipaddress.IPv4Address(res46[0][4][0]) else ""
- except Exception:
- res4 = "-"
- try:
- res6 = res46[-1][4][0] if ipaddress.IPv6Address(res46[-1][4][0]) else ""
- except Exception:
- res6 = "-"
- except Exception:
- res4, res6 = "-", "-"
- return res4, res6
- # Потоки.
- def treads_dr(fun, args, dr):
- """Потоки необходимы для того, чтобы оборачивать встроенные socket-функции, не имеющие таймаута.
- В случае замедления (на Android ожидание может доходить до > 1 минуты, обычно возвращается пустой результат,
- когда ip/domain ложный) уничтожить потоки через заданное время 't_socket'.
- """
- d1 = threading.Thread(target=fun, args=(args,))
- d1.start()
- d1.join(t_socket)
- if domain is None or (dr=='res' and res4 is None and res6 is None):
- console.log("[bold red]--> таймаут | ресурс не существует.[/bold red]")
- os.kill(os.getpid(), signal.SIGBREAK) if sys.platform == 'win32' else os.kill(os.getpid(), signal.SIGKILL)
- # Запрос future request.
- def reqZ():
- try:
- r = req.result()
- return r.text
- except requests.exceptions.ConnectionError:
- print(Fore.RED + "\nОшибка соединения\n" + Style.RESET_ALL)
- except requests.exceptions.Timeout:
- print(Fore.RED + "\nОшибка таймаут\n" + Style.RESET_ALL)
- except requests.exceptions.RequestException:
- print(Fore.RED + "\nОшибка не идентифицирована\n" + Style.RESET_ALL)
- except requests.exceptions.HTTPError:
- print(Fore.RED + "\nОшибка HTTPS\n" + Style.RESET_ALL)
- return "Err"
- # Выбор поиска одиночный или '-f'.
- ravno()
- print("\n\033[36mВведите домен (пример:\033[0m \033[32;1mexample.com\033[0m\033[36m),\n" + \
- "или IPv4/IPv6 (пример:\033[0m" + \
- "\033[32;1m 8.8.8.8\033[0m\033[36m),\n" + \
- "или url (пример: \033[32;1mhttps://example.com/1/2/3/foo\033[0m\033[36m), \n" + \
- "или укажите файл с данными.\n" + \
- "[\033[0m\033[32;1mfile\033[0m\033[36m] --> обработка файла данных\n" + \
- "[\033[0m\033[32;1menter\033[0m\033[36m] --> информация о своем GEO_IP\n" + \
- "[\033[0m\033[31;1mq\033[0m\033[36m] --> Выход")
- dip = console.input("\n[cyan]ввод ---> [/cyan]")
- # выход.
- if dip == "q":
- print(Style.BRIGHT + Fore.RED + "Выход")
- sys.exit()
- # проверка данных.
- elif dip == 'file':
- while True:
- print("""\033[36m├──Выберите тип поиска
- │
- [\033[0m\033[32;1m1\033[0m\033[36m] --> \033[30;1mOnline (медленно)\033[0m\033[36m
- [\033[0m\033[32;1m2\033[0m\033[36m] --> Offline (быстро)
- [\033[0m\033[32;1m3\033[0m\033[36m] --> Offline_тихий (очень быстро)
- [\033[0m\033[32;1mhelp\033[0m\033[36m] --> Справка\n\
- [\033[31;1mq\033[0m\033[36m] --> Выход\033[0m\n""")
- dipbaza = console.input("[cyan]ввод ---> [/cyan]")
- # Выход.
- if dipbaza == "q":
- print("\033[31;1mВыход\033[0m")
- sys.exit(0)
- # Справка.
- elif dipbaza == "help":
- snoopbanner.geo_ip_domain()
- helpend()
- # Оффлайн поиск.
- # Открываем GeoCity.
- elif dipbaza == "2" or dipbaza == "3":
- while True:
- print("\033[31;1m└──В demo version этот метод плагина недоступен\033[0m\n")
- snoopbanner.donate()
- break
- break
- # Онлайн поиск.
- elif dipbaza == "1":
- print("\033[31;1m└──В demo version этот метод плагина недоступен\033[0m\n")
- snoopbanner.donate()
- break
- # Неверный выбор ключа при оффлайн/онлайн поиске. Выход.
- else:
- print(Style.BRIGHT + Fore.RED + "└──Неверный выбор" + Style.RESET_ALL)
- ravno()
- # одиночный запрос.
- else:
- def ip_check(url_api, dip, res4, err):
- if dip == "": url_api = url_api
- elif res4 == "-": url_api = f"{url_api}{dip}"
- else: url_api = f"{url_api}{res4}"
- try:
- r = my_session.get(url=url_api, headers=head0, timeout=3)
- dip_dic = json.loads(r.text)
- T1 = dip_dic["country_code"] if err is False else dip_dic["country"]["isoCode"]
- T2 = dip_dic["region"] if err is False else dip_dic["city"]["name"]
- T3 = dip_dic["latitude"] if err is False else dip_dic["location"]["latitude"]
- T4 = dip_dic["longitude"] if err is False else dip_dic["location"]["longitude"]
- if err is True and res4 == '-':
- T5 = my_session.get(url=f"https://ipinfo.io/ip", timeout=3).text
- else:
- T5 = dip_dic.get("ip")
- except Exception:
- try:
- if err is True:
- if dip == '': p = ''
- elif res4 != '-': p = res4 + '/'
- else: dip + '/'
- console.log("[bold yellow]--> Внимание! Последний доступный url_ip[/bold yellow]")
- T1 = my_session.get(url=f"https://ipinfo.io/{p}country", timeout=3).text
- T2 = my_session.get(url=f"https://ipinfo.io/{p}region", timeout=3).text
- T5 = my_session.get(url=f"https://ipinfo.io/{p}ip", timeout=3).text
- T3 = "stop"
- T4 = "stop"
- return T1, T2, T3, T4, T5
- # raise Exception("")
- return ip_check('https://ipdb.ipcalc.co/ipdata/', dip, res4, err=True)
- except:
- T1 = "-"
- T2 = "-"
- T3 = "stop"
- T4 = "stop"
- T5 = "-"
- print("""\033[31;1m\n
- |\ | _ ._ _
- | \|(_)| |(/_\033[0m""")
- return T1, T2, T3, T4, T5
- table_name = "Мой ip" if dip == "" else dip
- if '.' not in dip and ':' not in dip and dip != "" or (dip != "" and len(dip) <= 4) or '..' in dip:
- print(Style.BRIGHT + Fore.RED + "└──Неверный ввод\n" + Style.RESET_ALL)
- return module1()
- else:
- u = urlparse(dip).hostname
- if bool(u) is False:
- dip = dip.split("/")[0].strip()
- else:
- dip = u.replace("www.", "").strip()
- with console.status("[cyan]работаю[/cyan]", spinner="earth"):
- treads_dr(task_fbn, dip, dr="dom")
- try:
- ipaddress.ip_address(dip)
- resD1 = domain
- except Exception:
- resD1 = dip
- treads_dr(res46, resD1, dr="res")
- T1, T2, T3, T4, T5 = ip_check('https://ipwho.is/', dip, res4, err=False)
- try:
- if ipaddress.IPv4Address(dip): res4 = dip
- except Exception: pass
- try:
- if ipaddress.IPv6Address(dip): res6 = dip
- except Exception: pass
- table = Table(title=table_name, title_style="italic bold red", style="green", header_style='green')
- table.add_column("Код", style="magenta")
- if dip == "":
- table.add_column("IP", style="cyan", overflow="fold")
- else:
- table.add_column("IPv4", style="cyan", overflow="fold")
- table.add_column("IPv6", style="cyan", overflow="fold")
- table.add_column("Домен", style="green", overflow="fold")
- table.add_column("Регион", style="green", overflow="fold")
- if dip == "":
- table.add_row(T1, T5, domain, T2)
- else:
- table.add_row(T1, res4, res6, domain, T2)
- console.print(table)
- if T3 == "stop" and T4 == "stop":
- print("\n")
- URL_GEO = ""
- else:
- URL_GEO = f"https://www.openstreetmap.org/#map=13/{T3}/{T4}"
- URL_GEO2 = f"https://www.google.com/maps/@{T3},{T4},12z"
- print(Style.BRIGHT + Fore.BLACK + f"{URL_GEO}" + Style.RESET_ALL)
- print(Style.BRIGHT + Fore.BLACK + f"{URL_GEO2}\n" + Style.RESET_ALL)
- return module1()
- if __name__ == "__main__":
- module1()
|