milenium 1.0.2__tar.gz → 1.0.4__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-1.0.2 → milenium-1.0.4}/PKG-INFO +1 -1
- milenium-1.0.4/milenium/modules/config.py +84 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/tui.py +39 -7
- {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/PKG-INFO +1 -1
- {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/SOURCES.txt +1 -0
- {milenium-1.0.2 → milenium-1.0.4}/pyproject.toml +1 -1
- {milenium-1.0.2 → milenium-1.0.4}/README.md +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/__init__.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/cli.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/__init__.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/abuseipdb_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/aggregator.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/breach.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/breach_local.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/censys_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/dehashed.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/dns_history.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/domain.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/dorker.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/email.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/email_validator.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/exif_extractor.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/github_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/gravatar.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/hibp.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/holehe_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/image_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/instagram_osint.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/ip.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/ip_geo_advanced.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/ip_reputation.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/ipinfo_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/leakcheck.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/logger.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/maigret_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/neon_db.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/password_pattern.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/permutator.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/pgp_lookup.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/phone.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/pwned_passwords.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/report.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/reverse_whois.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/sherlock_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/shodan_lite.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/shodan_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/social.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/telegram_analysis.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/telegram_osint.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/tg_parser.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/twitter_osint.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/urlscan_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/username.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/virustotal_search.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/vk_osint.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/wayback.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/wifi_geolocation.py +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/dependency_links.txt +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/entry_points.txt +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/requires.txt +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/top_level.txt +0 -0
- {milenium-1.0.2 → milenium-1.0.4}/setup.cfg +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import json
|
|
3
|
+
import base64
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
CONFIG_DIR = Path.home() / ".milenium"
|
|
7
|
+
CONFIG_FILE = CONFIG_DIR / "config.json"
|
|
8
|
+
|
|
9
|
+
# Твои дефолтные значения — вшиты в код.
|
|
10
|
+
# Чтобы не палить в открытом виде, они закодированы base64.
|
|
11
|
+
# Раскодируй свои и замени строки ниже.
|
|
12
|
+
DEFAULT_DATABASE_URL = base64.b64decode(
|
|
13
|
+
"cG9zdGdyZXNxbDovL25lb25kYl9vd25lcjpucGdfSk5Bam5UYXowVUs1QGVwLXR3aWxpZ2h0LWJhci1iMW9mZHlvdC1wb29sZXIuYy01LmV1LWNlbnRyYWwtMS5hd3MubmVvbi50ZWNoL25lb25kYj9zc2xtb2RlPXJlcXVpcmUmY2hhbm5lbF9iaW5kaW5nPXJlcXVpcmU="
|
|
14
|
+
).decode()
|
|
15
|
+
|
|
16
|
+
DEFAULTS = {
|
|
17
|
+
"DATABASE_URL": DEFAULT_DATABASE_URL,
|
|
18
|
+
"SHODAN_API_KEY": "",
|
|
19
|
+
"CENSYS_TOKEN": "",
|
|
20
|
+
"VIRUSTOTAL_API_KEY": "",
|
|
21
|
+
"ABUSEIPDB_KEY": "",
|
|
22
|
+
"IPINFO_TOKEN": "",
|
|
23
|
+
"URLSCAN_API_KEY": "",
|
|
24
|
+
"TG_API_ID": "",
|
|
25
|
+
"TG_API_HASH": "",
|
|
26
|
+
"SERPER_API_KEY": "",
|
|
27
|
+
"HIBP_KEY": "",
|
|
28
|
+
"DEHASHED_EMAIL": "",
|
|
29
|
+
"DEHASHED_KEY": "",
|
|
30
|
+
"LEAKCHECK_KEY": "",
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def ensure_config():
|
|
35
|
+
"""Создаёт конфиг, если его нет. Возвращает словарь."""
|
|
36
|
+
CONFIG_DIR.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
if not CONFIG_FILE.exists():
|
|
38
|
+
CONFIG_FILE.write_text(json.dumps(DEFAULTS, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
39
|
+
return dict(DEFAULTS)
|
|
40
|
+
try:
|
|
41
|
+
data = json.loads(CONFIG_FILE.read_text(encoding="utf-8"))
|
|
42
|
+
except Exception:
|
|
43
|
+
data = {}
|
|
44
|
+
# Дополняем недостающие ключи
|
|
45
|
+
for k, v in DEFAULTS.items():
|
|
46
|
+
data.setdefault(k, v)
|
|
47
|
+
return data
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get(key, default=""):
|
|
51
|
+
cfg = ensure_config()
|
|
52
|
+
return cfg.get(key, default) or os.environ.get(key, default)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def set_key(key, value):
|
|
56
|
+
cfg = ensure_config()
|
|
57
|
+
cfg[key] = value
|
|
58
|
+
CONFIG_FILE.write_text(json.dumps(cfg, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def set_many(pairs: dict):
|
|
62
|
+
cfg = ensure_config()
|
|
63
|
+
cfg.update(pairs)
|
|
64
|
+
CONFIG_FILE.write_text(json.dumps(cfg, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def all_keys():
|
|
68
|
+
return ensure_config()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def config_path():
|
|
72
|
+
return str(CONFIG_FILE)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def apply_to_env():
|
|
76
|
+
"""Прокидывает конфиг в os.environ, чтобы модули через os.environ.get() его видели."""
|
|
77
|
+
cfg = ensure_config()
|
|
78
|
+
for k, v in cfg.items():
|
|
79
|
+
if v and not os.environ.get(k):
|
|
80
|
+
os.environ[k] = str(v)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def is_first_run():
|
|
84
|
+
return not CONFIG_FILE.exists()
|
|
@@ -25,6 +25,18 @@ LOGO = r"""
|
|
|
25
25
|
╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚═╝ ╚═╝
|
|
26
26
|
"""
|
|
27
27
|
|
|
28
|
+
RESULT_LOG = []
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def push_result(text):
|
|
32
|
+
RESULT_LOG.append(text)
|
|
33
|
+
if len(RESULT_LOG) > 500:
|
|
34
|
+
RESULT_LOG.pop(0)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def clear_result():
|
|
38
|
+
RESULT_LOG.clear()
|
|
39
|
+
|
|
28
40
|
COMMANDS = [
|
|
29
41
|
("ПОИСК", [
|
|
30
42
|
("user <ник>", "Maigret + Sherlock"),
|
|
@@ -92,8 +104,9 @@ def build_layout():
|
|
|
92
104
|
layout = Layout()
|
|
93
105
|
layout.split_column(
|
|
94
106
|
Layout(name="header", size=8),
|
|
95
|
-
Layout(name="body", size=
|
|
96
|
-
Layout(name="
|
|
107
|
+
Layout(name="body", size=18),
|
|
108
|
+
Layout(name="process", size=8),
|
|
109
|
+
Layout(name="result", size=14),
|
|
97
110
|
Layout(name="input", size=3),
|
|
98
111
|
Layout(name="footer", size=3),
|
|
99
112
|
)
|
|
@@ -104,6 +117,23 @@ def build_layout():
|
|
|
104
117
|
)
|
|
105
118
|
return layout
|
|
106
119
|
|
|
120
|
+
def render_process():
|
|
121
|
+
lines = ["[bold red]━━ ПРОЦЕСС ━━[/bold red]"]
|
|
122
|
+
if OUTPUT_LOG:
|
|
123
|
+
lines.extend(OUTPUT_LOG[-6:])
|
|
124
|
+
else:
|
|
125
|
+
lines.append("[white]Введи команду ниже.[/white]")
|
|
126
|
+
return Panel("\n".join(lines), title="[bold red]ПРОЦЕСС[/bold red]", border_style="red")
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def render_result():
|
|
130
|
+
lines = ["[bold red]━━ РЕЗУЛЬТАТ ━━[/bold red]"]
|
|
131
|
+
if RESULT_LOG:
|
|
132
|
+
lines.extend(RESULT_LOG[-12:])
|
|
133
|
+
else:
|
|
134
|
+
lines.append("[white]Здесь появится результат команды.[/white]")
|
|
135
|
+
return Panel("\n".join(lines), title="[bold red]РЕЗУЛЬТАТ[/bold red]", border_style="red")
|
|
136
|
+
|
|
107
137
|
|
|
108
138
|
def render_header():
|
|
109
139
|
logo_text = Text(LOGO, style="bold red")
|
|
@@ -249,7 +279,8 @@ def draw():
|
|
|
249
279
|
layout["left"].update(render_commands())
|
|
250
280
|
layout["center"].update(render_session())
|
|
251
281
|
layout["right"].update(render_status())
|
|
252
|
-
layout["
|
|
282
|
+
layout["process"].update(render_process())
|
|
283
|
+
layout["result"].update(render_result())
|
|
253
284
|
layout["input"].update(render_input())
|
|
254
285
|
layout["footer"].update(render_footer())
|
|
255
286
|
return layout
|
|
@@ -337,6 +368,7 @@ def interactive():
|
|
|
337
368
|
SESSION["current"] = cmd.strip()
|
|
338
369
|
SESSION["current_start"] = time.time()
|
|
339
370
|
push_output(f"▶ выполняю: {cmd}")
|
|
371
|
+
clear_result()
|
|
340
372
|
live.update(draw())
|
|
341
373
|
|
|
342
374
|
if _handle_builtin(cmd):
|
|
@@ -351,15 +383,15 @@ def interactive():
|
|
|
351
383
|
try:
|
|
352
384
|
with contextlib.redirect_stdout(buf):
|
|
353
385
|
main(args, standalone_mode=False)
|
|
354
|
-
|
|
386
|
+
raw = buf.getvalue()
|
|
387
|
+
for line in raw.splitlines():
|
|
355
388
|
if line.strip():
|
|
356
|
-
|
|
357
|
-
log_result(line[:80])
|
|
389
|
+
push_result(line)
|
|
358
390
|
SESSION["results"] += 1
|
|
359
391
|
except SystemExit:
|
|
360
392
|
pass
|
|
361
393
|
except Exception as e:
|
|
362
|
-
|
|
394
|
+
push_result(f"[red]ошибка: {e}[/red]")
|
|
363
395
|
|
|
364
396
|
elapsed = time.time() - t0
|
|
365
397
|
push_output(f"✔ завершено за {elapsed:.1f}s")
|
|
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
|
|
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
|
|
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
|
|
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
|