milenium 0.1.0__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {milenium-0.1.0 → milenium-0.2.0}/PKG-INFO +1 -1
- milenium-0.2.0/milenium/cli.py +161 -0
- milenium-0.2.0/milenium/modules/dorker.py +44 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/modules/logger.py +9 -12
- milenium-0.2.0/milenium/modules/permutator.py +39 -0
- milenium-0.2.0/milenium/modules/report.py +19 -0
- milenium-0.2.0/milenium/modules/username.py +47 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium.egg-info/PKG-INFO +1 -1
- {milenium-0.1.0 → milenium-0.2.0}/milenium.egg-info/SOURCES.txt +2 -0
- {milenium-0.1.0 → milenium-0.2.0}/pyproject.toml +1 -1
- milenium-0.1.0/milenium/cli.py +0 -78
- milenium-0.1.0/milenium/modules/report.py +0 -7
- milenium-0.1.0/milenium/modules/username.py +0 -30
- {milenium-0.1.0 → milenium-0.2.0}/README.md +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/__init__.py +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/modules/__init__.py +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/modules/breach.py +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/modules/domain.py +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/modules/email.py +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/modules/ip.py +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/modules/phone.py +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium/modules/social.py +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium.egg-info/dependency_links.txt +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium.egg-info/entry_points.txt +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium.egg-info/requires.txt +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/milenium.egg-info/top_level.txt +0 -0
- {milenium-0.1.0 → milenium-0.2.0}/setup.cfg +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import click
|
|
3
|
+
from rich.console import Console
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
from milenium.modules.logger import TeeLogger
|
|
6
|
+
from milenium.modules import username, email, phone, ip, domain, breach, social, report, dorker
|
|
7
|
+
|
|
8
|
+
console = Console()
|
|
9
|
+
|
|
10
|
+
def _init_logger():
|
|
11
|
+
logger = TeeLogger("milenium.log", mode="a")
|
|
12
|
+
sys.stdout = logger
|
|
13
|
+
return logger
|
|
14
|
+
|
|
15
|
+
@click.group()
|
|
16
|
+
def main():
|
|
17
|
+
"""milenium — OSINT / dox / deanon toolkit"""
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
@main.command()
|
|
21
|
+
@click.argument("nick")
|
|
22
|
+
@click.option("--permutations", default=30, help="Сколько вариаций генерить")
|
|
23
|
+
@click.option("--dorks/--no-dorks", default=True, help="Искать через Google Dorks")
|
|
24
|
+
def user(nick, permutations, dorks):
|
|
25
|
+
"""Глубокий поиск по нику + вариации + Google Dorks"""
|
|
26
|
+
logger = _init_logger()
|
|
27
|
+
lines = [f"=== DEEP SEARCH: {nick} ===", f"Permutations: {permutations}", ""]
|
|
28
|
+
|
|
29
|
+
console.print("[bold cyan]Генерирую вариации...[/bold cyan]")
|
|
30
|
+
results = username.check(nick, permutations=permutations)
|
|
31
|
+
|
|
32
|
+
table = Table(title=f"Username: {nick} (+ {len(results)-1} вариаций)")
|
|
33
|
+
table.add_column("Вариация")
|
|
34
|
+
table.add_column("Сайт")
|
|
35
|
+
table.add_column("Статус")
|
|
36
|
+
table.add_column("URL")
|
|
37
|
+
|
|
38
|
+
found_count = 0
|
|
39
|
+
for variant, sites in results.items():
|
|
40
|
+
for site, info in sites.items():
|
|
41
|
+
if info["found"]:
|
|
42
|
+
table.add_row(variant, site, "[green]FOUND[/green]", info["url"])
|
|
43
|
+
lines.append(f"{variant}\t{site}\tFOUND\t{info['url']}")
|
|
44
|
+
found_count += 1
|
|
45
|
+
|
|
46
|
+
console.print(table)
|
|
47
|
+
console.print(f"[bold green]Найдено: {found_count}[/bold green]")
|
|
48
|
+
lines.append(f"\nTotal found: {found_count}")
|
|
49
|
+
|
|
50
|
+
if dorks:
|
|
51
|
+
console.print("\n[bold cyan]Ищу через Google Dorks...[/bold cyan]")
|
|
52
|
+
dork_results = dorker.search_nick(nick, num=10)
|
|
53
|
+
if dork_results:
|
|
54
|
+
for q, links in dork_results.items():
|
|
55
|
+
console.print(f"\n[bold]{q}[/bold]")
|
|
56
|
+
lines.append(f"\nQUERY: {q}")
|
|
57
|
+
for link in links:
|
|
58
|
+
console.print(f" {link}")
|
|
59
|
+
lines.append(f" {link}")
|
|
60
|
+
else:
|
|
61
|
+
console.print("[yellow]Serper API не настроен или нет результатов[/yellow]")
|
|
62
|
+
lines.append("\nDorks: not configured")
|
|
63
|
+
|
|
64
|
+
path = report.save_text(lines, name=f"deep_{nick}")
|
|
65
|
+
console.print(f"\n[bold cyan]Отчёт:[/bold cyan] {path}")
|
|
66
|
+
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
67
|
+
logger.close()
|
|
68
|
+
|
|
69
|
+
@main.command()
|
|
70
|
+
@click.argument("mail")
|
|
71
|
+
def mail(mail):
|
|
72
|
+
"""Проверка email: MX, соцсети, утечки"""
|
|
73
|
+
logger = _init_logger()
|
|
74
|
+
results = email.check(mail)
|
|
75
|
+
lines = [f"Email: {mail}"]
|
|
76
|
+
for k, v in results.items():
|
|
77
|
+
console.print(f"[bold]{k}:[/bold] {v}")
|
|
78
|
+
lines.append(f"{k}: {v}")
|
|
79
|
+
path = report.save_text(lines, name=f"mail_{mail.split('@')[0]}")
|
|
80
|
+
console.print(f"\n[bold cyan]Отчёт сохранён:[/bold cyan] {path}")
|
|
81
|
+
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
82
|
+
logger.close()
|
|
83
|
+
|
|
84
|
+
@main.command()
|
|
85
|
+
@click.argument("number")
|
|
86
|
+
def phone_cmd(number):
|
|
87
|
+
"""Инфа по номеру телефона"""
|
|
88
|
+
logger = _init_logger()
|
|
89
|
+
results = phone.check(number)
|
|
90
|
+
lines = [f"Phone: {number}"]
|
|
91
|
+
for k, v in results.items():
|
|
92
|
+
console.print(f"[bold]{k}:[/bold] {v}")
|
|
93
|
+
lines.append(f"{k}: {v}")
|
|
94
|
+
path = report.save_text(lines, name=f"phone_{number.replace('+','')}")
|
|
95
|
+
console.print(f"\n[bold cyan]Отчёт сохранён:[/bold cyan] {path}")
|
|
96
|
+
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
97
|
+
logger.close()
|
|
98
|
+
|
|
99
|
+
@main.command()
|
|
100
|
+
@click.argument("address")
|
|
101
|
+
def ip_cmd(address):
|
|
102
|
+
"""Гео, ASN, reverse DNS по IP"""
|
|
103
|
+
logger = _init_logger()
|
|
104
|
+
results = ip.check(address)
|
|
105
|
+
lines = [f"IP: {address}"]
|
|
106
|
+
for k, v in results.items():
|
|
107
|
+
console.print(f"[bold]{k}:[/bold] {v}")
|
|
108
|
+
lines.append(f"{k}: {v}")
|
|
109
|
+
path = report.save_text(lines, name=f"ip_{address.replace('.','_')}")
|
|
110
|
+
console.print(f"\n[bold cyan]Отчёт сохранён:[/bold cyan] {path}")
|
|
111
|
+
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
112
|
+
logger.close()
|
|
113
|
+
|
|
114
|
+
@main.command()
|
|
115
|
+
@click.argument("host")
|
|
116
|
+
def dom(host):
|
|
117
|
+
"""WHOIS, DNS, subdomains по домену"""
|
|
118
|
+
logger = _init_logger()
|
|
119
|
+
results = domain.check(host)
|
|
120
|
+
lines = [f"Domain: {host}"]
|
|
121
|
+
for k, v in results.items():
|
|
122
|
+
console.print(f"[bold]{k}:[/bold] {v}")
|
|
123
|
+
lines.append(f"{k}: {v}")
|
|
124
|
+
path = report.save_text(lines, name=f"dom_{host.replace('.','_')}")
|
|
125
|
+
console.print(f"\n[bold cyan]Отчёт сохранён:[/bold cyan] {path}")
|
|
126
|
+
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
127
|
+
logger.close()
|
|
128
|
+
|
|
129
|
+
@main.command()
|
|
130
|
+
@click.argument("query")
|
|
131
|
+
def leaks(query):
|
|
132
|
+
"""Проверка утечек (HIBP, etc.)"""
|
|
133
|
+
logger = _init_logger()
|
|
134
|
+
results = breach.check(query)
|
|
135
|
+
lines = [f"Leaks: {query}"]
|
|
136
|
+
for k, v in results.items():
|
|
137
|
+
console.print(f"[bold]{k}:[/bold] {v}")
|
|
138
|
+
lines.append(f"{k}: {v}")
|
|
139
|
+
path = report.save_text(lines, name=f"leaks_{query.split('@')[0]}")
|
|
140
|
+
console.print(f"\n[bold cyan]Отчёт сохранён:[/bold cyan] {path}")
|
|
141
|
+
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
142
|
+
logger.close()
|
|
143
|
+
|
|
144
|
+
@main.command()
|
|
145
|
+
@click.argument("nick")
|
|
146
|
+
def social_cmd(nick):
|
|
147
|
+
"""Поиск соцсетей по нику"""
|
|
148
|
+
logger = _init_logger()
|
|
149
|
+
results = social.check(nick)
|
|
150
|
+
lines = [f"Social: {nick}"]
|
|
151
|
+
for site, info in results.items():
|
|
152
|
+
status = "FOUND" if info["found"] else "NO"
|
|
153
|
+
console.print(f"[bold]{site}:[/bold] {status} — {info['url']}")
|
|
154
|
+
lines.append(f"{site}\t{status}\t{info['url']}")
|
|
155
|
+
path = report.save_text(lines, name=f"social_{nick}")
|
|
156
|
+
console.print(f"\n[bold cyan]Отчёт сохранён:[/bold cyan] {path}")
|
|
157
|
+
console.print(f"[bold cyan]Лог:[/bold cyan] {logger.path}")
|
|
158
|
+
logger.close()
|
|
159
|
+
|
|
160
|
+
if __name__ == "__main__":
|
|
161
|
+
main()
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
|
|
3
|
+
SERPER_API_KEY = "aa5e4493cf512ca03e544aaef8fd1f90538eda2e" # вставь свой
|
|
4
|
+
SERPER_URL = "https://google.serper.dev/search"
|
|
5
|
+
|
|
6
|
+
def dork(query, num=10):
|
|
7
|
+
"""
|
|
8
|
+
Выполняет Google Dork через Serper API.
|
|
9
|
+
Возвращает список ссылок.
|
|
10
|
+
"""
|
|
11
|
+
if not SERPER_API_KEY or SERPER_API_KEY == "YOUR_SERPER_KEY":
|
|
12
|
+
return []
|
|
13
|
+
|
|
14
|
+
payload = {"q": query, "num": num}
|
|
15
|
+
headers = {
|
|
16
|
+
"X-API-KEY": SERPER_API_KEY,
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
}
|
|
19
|
+
try:
|
|
20
|
+
r = requests.post(SERPER_URL, json=payload, headers=headers, timeout=15)
|
|
21
|
+
data = r.json()
|
|
22
|
+
return [item["link"] for item in data.get("organic", [])]
|
|
23
|
+
except Exception:
|
|
24
|
+
return []
|
|
25
|
+
|
|
26
|
+
def search_nick(nick, num=10):
|
|
27
|
+
"""Ищет ник через Google с разными операторами."""
|
|
28
|
+
queries = [
|
|
29
|
+
f'"{nick}"',
|
|
30
|
+
f'"{nick}" site:github.com',
|
|
31
|
+
f'"{nick}" site:twitter.com',
|
|
32
|
+
f'"{nick}" site:reddit.com',
|
|
33
|
+
f'"{nick}" site:instagram.com',
|
|
34
|
+
f'"{nick}" inurl:profile',
|
|
35
|
+
f'"{nick}" filetype:pdf',
|
|
36
|
+
f'"{nick}" site:pastebin.com',
|
|
37
|
+
f'"{nick}" site:linkedin.com',
|
|
38
|
+
]
|
|
39
|
+
results = {}
|
|
40
|
+
for q in queries:
|
|
41
|
+
links = dork(q, num)
|
|
42
|
+
if links:
|
|
43
|
+
results[q] = links
|
|
44
|
+
return results
|
|
@@ -1,19 +1,12 @@
|
|
|
1
|
-
# milenium/modules/logger.py
|
|
2
1
|
import sys
|
|
3
2
|
import os
|
|
4
3
|
from datetime import datetime
|
|
5
4
|
|
|
6
5
|
class TeeLogger:
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
Использование:
|
|
10
|
-
import sys
|
|
11
|
-
from milenium.modules.logger import TeeLogger
|
|
12
|
-
sys.stdout = TeeLogger("milenium.log")
|
|
13
|
-
"""
|
|
14
|
-
def __init__(self, filepath, mode="a"):
|
|
6
|
+
def __init__(self, filepath="milenium.log", mode="a"):
|
|
7
|
+
self.filepath = os.path.abspath(filepath)
|
|
15
8
|
self.terminal = sys.__stdout__
|
|
16
|
-
self.file = open(filepath, mode, encoding="utf-8", buffering=1)
|
|
9
|
+
self.file = open(self.filepath, mode, encoding="utf-8", buffering=1)
|
|
17
10
|
self._write_header()
|
|
18
11
|
|
|
19
12
|
def _write_header(self):
|
|
@@ -24,7 +17,7 @@ class TeeLogger:
|
|
|
24
17
|
def write(self, message):
|
|
25
18
|
self.terminal.write(message)
|
|
26
19
|
self.file.write(message)
|
|
27
|
-
self.file.flush()
|
|
20
|
+
self.file.flush()
|
|
28
21
|
|
|
29
22
|
def flush(self):
|
|
30
23
|
self.terminal.flush()
|
|
@@ -32,4 +25,8 @@ class TeeLogger:
|
|
|
32
25
|
|
|
33
26
|
def close(self):
|
|
34
27
|
self.file.close()
|
|
35
|
-
sys.stdout = self.terminal
|
|
28
|
+
sys.stdout = self.terminal
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def path(self):
|
|
32
|
+
return self.filepath
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import itertools
|
|
2
|
+
|
|
3
|
+
def generate(nick, suffixes=None, leet=True, limit=50):
|
|
4
|
+
"""
|
|
5
|
+
Генерит вариации ника:
|
|
6
|
+
- базовый
|
|
7
|
+
- с цифрами (1337, 2024, 0x, 777)
|
|
8
|
+
- с leet-заменами (a->4, e->3, i->1, o->0, s->5)
|
|
9
|
+
- с подчёркиваниями/точками
|
|
10
|
+
- с суффиксами (dev, hack, x, _)
|
|
11
|
+
"""
|
|
12
|
+
if suffixes is None:
|
|
13
|
+
suffixes = ["", "1337", "2024", "0x", "777", "x", "dev", "hack", "_", "01", "99", "pro"]
|
|
14
|
+
|
|
15
|
+
variants = set()
|
|
16
|
+
variants.add(nick)
|
|
17
|
+
variants.add(nick.lower())
|
|
18
|
+
variants.add(nick.upper())
|
|
19
|
+
|
|
20
|
+
# с суффиксами
|
|
21
|
+
for s in suffixes:
|
|
22
|
+
variants.add(f"{nick}{s}")
|
|
23
|
+
variants.add(f"{s}{nick}")
|
|
24
|
+
|
|
25
|
+
# с подчёркиваниями/точками
|
|
26
|
+
variants.add(f"_{nick}_")
|
|
27
|
+
variants.add(f"{nick}_")
|
|
28
|
+
variants.add(f"_{nick}")
|
|
29
|
+
variants.add(f"{nick}.{nick}")
|
|
30
|
+
|
|
31
|
+
# leet-замены
|
|
32
|
+
if leet:
|
|
33
|
+
leet_map = {"a": "4", "e": "3", "i": "1", "o": "0", "s": "5", "t": "7"}
|
|
34
|
+
leet_nick = "".join(leet_map.get(c.lower(), c) for c in nick)
|
|
35
|
+
variants.add(leet_nick)
|
|
36
|
+
for s in suffixes[:5]:
|
|
37
|
+
variants.add(f"{leet_nick}{s}")
|
|
38
|
+
|
|
39
|
+
return list(variants)[:limit]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
|
|
5
|
+
def save(data, name="report"):
|
|
6
|
+
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
7
|
+
filename = f"{name}_{ts}.json"
|
|
8
|
+
path = os.path.abspath(filename)
|
|
9
|
+
with open(path, "w", encoding="utf-8") as f:
|
|
10
|
+
json.dump({"ts": ts, "data": data}, f, indent=2, ensure_ascii=False)
|
|
11
|
+
return path
|
|
12
|
+
|
|
13
|
+
def save_text(lines, name="report"):
|
|
14
|
+
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
15
|
+
filename = f"{name}_{ts}.txt"
|
|
16
|
+
path = os.path.abspath(filename)
|
|
17
|
+
with open(path, "w", encoding="utf-8") as f:
|
|
18
|
+
f.write("\n".join(lines))
|
|
19
|
+
return path
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
from milenium.modules.permutator import generate
|
|
3
|
+
|
|
4
|
+
SITES = {
|
|
5
|
+
"github": "https://github.com/{}",
|
|
6
|
+
"twitter": "https://twitter.com/{}",
|
|
7
|
+
"instagram": "https://instagram.com/{}",
|
|
8
|
+
"reddit": "https://reddit.com/user/{}",
|
|
9
|
+
"telegram": "https://t.me/{}",
|
|
10
|
+
"tiktok": "https://tiktok.com/@{}",
|
|
11
|
+
"youtube": "https://youtube.com/@{}",
|
|
12
|
+
"vk": "https://vk.com/{}",
|
|
13
|
+
"facebook": "https://facebook.com/{}",
|
|
14
|
+
"twitch": "https://twitch.tv/{}",
|
|
15
|
+
"steam": "https://steamcommunity.com/id/{}",
|
|
16
|
+
"pinterest": "https://pinterest.com/{}",
|
|
17
|
+
"medium": "https://medium.com/@{}",
|
|
18
|
+
"habr": "https://habr.com/ru/users/{}/",
|
|
19
|
+
"keybase": "https://keybase.io/{}",
|
|
20
|
+
"hackerone": "https://hackerone.com/{}",
|
|
21
|
+
"bugcrowd": "https://bugcrowd.com/{}",
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
HEADERS = {"User-Agent": "Mozilla/5.0"}
|
|
25
|
+
|
|
26
|
+
def check_one(nick):
|
|
27
|
+
"""Проверяет один ник по всем сайтам."""
|
|
28
|
+
out = {}
|
|
29
|
+
for site, url in SITES.items():
|
|
30
|
+
full = url.format(nick)
|
|
31
|
+
try:
|
|
32
|
+
r = requests.get(full, headers=HEADERS, timeout=8, allow_redirects=True)
|
|
33
|
+
out[site] = {"found": r.status_code == 200, "url": full}
|
|
34
|
+
except Exception:
|
|
35
|
+
out[site] = {"found": False, "url": full}
|
|
36
|
+
return out
|
|
37
|
+
|
|
38
|
+
def check(nick, permutations=30):
|
|
39
|
+
"""
|
|
40
|
+
Проверяет ник и все его вариации.
|
|
41
|
+
Возвращает {ник: {сайт: {found, url}}}
|
|
42
|
+
"""
|
|
43
|
+
variants = generate(nick, limit=permutations)
|
|
44
|
+
all_results = {}
|
|
45
|
+
for v in variants:
|
|
46
|
+
all_results[v] = check_one(v)
|
|
47
|
+
return all_results
|
|
@@ -11,9 +11,11 @@ milenium.egg-info/top_level.txt
|
|
|
11
11
|
milenium/modules/__init__.py
|
|
12
12
|
milenium/modules/breach.py
|
|
13
13
|
milenium/modules/domain.py
|
|
14
|
+
milenium/modules/dorker.py
|
|
14
15
|
milenium/modules/email.py
|
|
15
16
|
milenium/modules/ip.py
|
|
16
17
|
milenium/modules/logger.py
|
|
18
|
+
milenium/modules/permutator.py
|
|
17
19
|
milenium/modules/phone.py
|
|
18
20
|
milenium/modules/report.py
|
|
19
21
|
milenium/modules/social.py
|
milenium-0.1.0/milenium/cli.py
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import click
|
|
2
|
-
from rich.console import Console
|
|
3
|
-
from rich.table import Table
|
|
4
|
-
from .modules import username, email, phone, ip, domain, breach, social
|
|
5
|
-
import sys
|
|
6
|
-
from milenium.modules.logger import TeeLogger
|
|
7
|
-
|
|
8
|
-
def main():
|
|
9
|
-
sys.stdout = TeeLogger("milenium.log", mode="a")
|
|
10
|
-
console = Console()
|
|
11
|
-
|
|
12
|
-
@click.group()
|
|
13
|
-
def main():
|
|
14
|
-
"""milenium — OSINT / dox / deanon toolkit"""
|
|
15
|
-
pass
|
|
16
|
-
|
|
17
|
-
@main.command()
|
|
18
|
-
@click.argument("nick")
|
|
19
|
-
def user(nick):
|
|
20
|
-
"""Прогон никнейма по соцсетям"""
|
|
21
|
-
results = username.check(nick)
|
|
22
|
-
table = Table(title=f"Username: {nick}")
|
|
23
|
-
table.add_column("Site")
|
|
24
|
-
table.add_column("Status")
|
|
25
|
-
for site, status in results.items():
|
|
26
|
-
table.add_row(site, "[green]found[/green]" if status else "[red]no[/red]")
|
|
27
|
-
console.print(table)
|
|
28
|
-
|
|
29
|
-
@main.command()
|
|
30
|
-
@click.argument("mail")
|
|
31
|
-
def mail(mail):
|
|
32
|
-
"""Проверка email: MX, соцсети, утечки"""
|
|
33
|
-
results = email.check(mail)
|
|
34
|
-
for k, v in results.items():
|
|
35
|
-
console.print(f"[bold]{k}:[/bold] {v}")
|
|
36
|
-
|
|
37
|
-
@main.command()
|
|
38
|
-
@click.argument("number")
|
|
39
|
-
def phone_cmd(number):
|
|
40
|
-
"""Инфа по номеру телефона"""
|
|
41
|
-
results = phone.check(number)
|
|
42
|
-
for k, v in results.items():
|
|
43
|
-
console.print(f"[bold]{k}:[/bold] {v}")
|
|
44
|
-
|
|
45
|
-
@main.command()
|
|
46
|
-
@click.argument("address")
|
|
47
|
-
def ip_cmd(address):
|
|
48
|
-
"""Гео, ASN, reverse DNS по IP"""
|
|
49
|
-
results = ip.check(address)
|
|
50
|
-
for k, v in results.items():
|
|
51
|
-
console.print(f"[bold]{k}:[/bold] {v}")
|
|
52
|
-
|
|
53
|
-
@main.command()
|
|
54
|
-
@click.argument("host")
|
|
55
|
-
def dom(host):
|
|
56
|
-
"""WHOIS, DNS, subdomains по домену"""
|
|
57
|
-
results = domain.check(host)
|
|
58
|
-
for k, v in results.items():
|
|
59
|
-
console.print(f"[bold]{k}:[/bold] {v}")
|
|
60
|
-
|
|
61
|
-
@main.command()
|
|
62
|
-
@click.argument("query")
|
|
63
|
-
def leaks(query):
|
|
64
|
-
"""Проверка утечек (HIBP, etc.)"""
|
|
65
|
-
results = breach.check(query)
|
|
66
|
-
for k, v in results.items():
|
|
67
|
-
console.print(f"[bold]{k}:[/bold] {v}")
|
|
68
|
-
|
|
69
|
-
@main.command()
|
|
70
|
-
@click.argument("nick")
|
|
71
|
-
def social_cmd(nick):
|
|
72
|
-
"""Поиск соцсетей по нику"""
|
|
73
|
-
results = social.check(nick)
|
|
74
|
-
for k, v in results.items():
|
|
75
|
-
console.print(f"[bold]{k}:[/bold] {v}")
|
|
76
|
-
|
|
77
|
-
if __name__ == "__main__":
|
|
78
|
-
main()
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import requests
|
|
2
|
-
|
|
3
|
-
SITES = {
|
|
4
|
-
"github": "https://github.com/{}",
|
|
5
|
-
"twitter": "https://twitter.com/{}",
|
|
6
|
-
"instagram": "https://instagram.com/{}",
|
|
7
|
-
"reddit": "https://reddit.com/user/{}",
|
|
8
|
-
"telegram": "https://t.me/{}",
|
|
9
|
-
"tiktok": "https://tiktok.com/@{}",
|
|
10
|
-
"youtube": "https://youtube.com/@{}",
|
|
11
|
-
"vk": "https://vk.com/{}",
|
|
12
|
-
"facebook": "https://facebook.com/{}",
|
|
13
|
-
"twitch": "https://twitch.tv/{}",
|
|
14
|
-
"steam": "https://steamcommunity.com/id/{}",
|
|
15
|
-
"pinterest": "https://pinterest.com/{}",
|
|
16
|
-
"medium": "https://medium.com/@{}",
|
|
17
|
-
"habr": "https://habr.com/ru/users/{}/",
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
HEADERS = {"User-Agent": "Mozilla/5.0"}
|
|
21
|
-
|
|
22
|
-
def check(nick):
|
|
23
|
-
out = {}
|
|
24
|
-
for site, url in SITES.items():
|
|
25
|
-
try:
|
|
26
|
-
r = requests.get(url.format(nick), headers=HEADERS, timeout=8, allow_redirects=True)
|
|
27
|
-
out[site] = r.status_code == 200
|
|
28
|
-
except Exception:
|
|
29
|
-
out[site] = False
|
|
30
|
-
return out
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|