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.
Files changed (62) hide show
  1. {milenium-1.0.2 → milenium-1.0.4}/PKG-INFO +1 -1
  2. milenium-1.0.4/milenium/modules/config.py +84 -0
  3. {milenium-1.0.2 → milenium-1.0.4}/milenium/tui.py +39 -7
  4. {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/PKG-INFO +1 -1
  5. {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/SOURCES.txt +1 -0
  6. {milenium-1.0.2 → milenium-1.0.4}/pyproject.toml +1 -1
  7. {milenium-1.0.2 → milenium-1.0.4}/README.md +0 -0
  8. {milenium-1.0.2 → milenium-1.0.4}/milenium/__init__.py +0 -0
  9. {milenium-1.0.2 → milenium-1.0.4}/milenium/cli.py +0 -0
  10. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/__init__.py +0 -0
  11. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/abuseipdb_search.py +0 -0
  12. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/aggregator.py +0 -0
  13. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/breach.py +0 -0
  14. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/breach_local.py +0 -0
  15. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/censys_search.py +0 -0
  16. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/dehashed.py +0 -0
  17. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/dns_history.py +0 -0
  18. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/domain.py +0 -0
  19. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/dorker.py +0 -0
  20. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/email.py +0 -0
  21. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/email_validator.py +0 -0
  22. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/exif_extractor.py +0 -0
  23. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/github_search.py +0 -0
  24. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/gravatar.py +0 -0
  25. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/hibp.py +0 -0
  26. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/holehe_search.py +0 -0
  27. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/image_search.py +0 -0
  28. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/instagram_osint.py +0 -0
  29. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/ip.py +0 -0
  30. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/ip_geo_advanced.py +0 -0
  31. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/ip_reputation.py +0 -0
  32. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/ipinfo_search.py +0 -0
  33. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/leakcheck.py +0 -0
  34. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/logger.py +0 -0
  35. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/maigret_search.py +0 -0
  36. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/neon_db.py +0 -0
  37. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/password_pattern.py +0 -0
  38. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/permutator.py +0 -0
  39. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/pgp_lookup.py +0 -0
  40. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/phone.py +0 -0
  41. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/pwned_passwords.py +0 -0
  42. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/report.py +0 -0
  43. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/reverse_whois.py +0 -0
  44. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/sherlock_search.py +0 -0
  45. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/shodan_lite.py +0 -0
  46. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/shodan_search.py +0 -0
  47. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/social.py +0 -0
  48. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/telegram_analysis.py +0 -0
  49. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/telegram_osint.py +0 -0
  50. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/tg_parser.py +0 -0
  51. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/twitter_osint.py +0 -0
  52. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/urlscan_search.py +0 -0
  53. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/username.py +0 -0
  54. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/virustotal_search.py +0 -0
  55. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/vk_osint.py +0 -0
  56. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/wayback.py +0 -0
  57. {milenium-1.0.2 → milenium-1.0.4}/milenium/modules/wifi_geolocation.py +0 -0
  58. {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/dependency_links.txt +0 -0
  59. {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/entry_points.txt +0 -0
  60. {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/requires.txt +0 -0
  61. {milenium-1.0.2 → milenium-1.0.4}/milenium.egg-info/top_level.txt +0 -0
  62. {milenium-1.0.2 → milenium-1.0.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: milenium
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary: The most powerful OSINT aggregator
5
5
  Author: VexxDev200
6
6
  Requires-Python: >=3.10
@@ -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=20),
96
- Layout(name="output", size=16),
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["output"].update(render_output())
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
- for line in buf.getvalue().splitlines():
386
+ raw = buf.getvalue()
387
+ for line in raw.splitlines():
355
388
  if line.strip():
356
- push_output(line)
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
- push_output(f"[red]ошибка: {e}[/red]")
394
+ push_result(f"[red]ошибка: {e}[/red]")
363
395
 
364
396
  elapsed = time.time() - t0
365
397
  push_output(f"✔ завершено за {elapsed:.1f}s")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: milenium
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary: The most powerful OSINT aggregator
5
5
  Author: VexxDev200
6
6
  Requires-Python: >=3.10
@@ -15,6 +15,7 @@ milenium/modules/aggregator.py
15
15
  milenium/modules/breach.py
16
16
  milenium/modules/breach_local.py
17
17
  milenium/modules/censys_search.py
18
+ milenium/modules/config.py
18
19
  milenium/modules/dehashed.py
19
20
  milenium/modules/dns_history.py
20
21
  milenium/modules/domain.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "milenium"
3
- version = "1.0.2"
3
+ version = "1.0.4"
4
4
  description = "The most powerful OSINT aggregator"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
File without changes
File without changes
File without changes
File without changes