milenium 0.5.0__tar.gz → 0.5.2__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 (49) hide show
  1. {milenium-0.5.0 → milenium-0.5.2}/PKG-INFO +1 -1
  2. {milenium-0.5.0 → milenium-0.5.2}/milenium/tui.py +101 -72
  3. {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/PKG-INFO +1 -1
  4. {milenium-0.5.0 → milenium-0.5.2}/pyproject.toml +1 -1
  5. {milenium-0.5.0 → milenium-0.5.2}/README.md +0 -0
  6. {milenium-0.5.0 → milenium-0.5.2}/milenium/__init__.py +0 -0
  7. {milenium-0.5.0 → milenium-0.5.2}/milenium/cli.py +0 -0
  8. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/__init__.py +0 -0
  9. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/aggregator.py +0 -0
  10. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/breach.py +0 -0
  11. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/breach_local.py +0 -0
  12. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/dehashed.py +0 -0
  13. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/dns_history.py +0 -0
  14. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/domain.py +0 -0
  15. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/dorker.py +0 -0
  16. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/email.py +0 -0
  17. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/email_validator.py +0 -0
  18. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/exif_extractor.py +0 -0
  19. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/github_search.py +0 -0
  20. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/gravatar.py +0 -0
  21. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/hibp.py +0 -0
  22. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/instagram_osint.py +0 -0
  23. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/ip.py +0 -0
  24. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/ip_geo_advanced.py +0 -0
  25. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/ip_reputation.py +0 -0
  26. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/leakcheck.py +0 -0
  27. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/logger.py +0 -0
  28. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/password_pattern.py +0 -0
  29. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/permutator.py +0 -0
  30. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/pgp_lookup.py +0 -0
  31. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/phone.py +0 -0
  32. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/pwned_passwords.py +0 -0
  33. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/report.py +0 -0
  34. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/reverse_whois.py +0 -0
  35. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/shodan_lite.py +0 -0
  36. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/social.py +0 -0
  37. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/telegram_osint.py +0 -0
  38. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/tg_parser.py +0 -0
  39. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/twitter_osint.py +0 -0
  40. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/username.py +0 -0
  41. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/vk_osint.py +0 -0
  42. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/wayback.py +0 -0
  43. {milenium-0.5.0 → milenium-0.5.2}/milenium/modules/wifi_geolocation.py +0 -0
  44. {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/SOURCES.txt +0 -0
  45. {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/dependency_links.txt +0 -0
  46. {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/entry_points.txt +0 -0
  47. {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/requires.txt +0 -0
  48. {milenium-0.5.0 → milenium-0.5.2}/milenium.egg-info/top_level.txt +0 -0
  49. {milenium-0.5.0 → milenium-0.5.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: milenium
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: OSINT / dox / deanon toolkit
5
5
  Requires-Python: >=3.9
6
6
  Description-Content-Type: text/markdown
@@ -1,4 +1,7 @@
1
1
  import sys
2
+ import shlex
3
+ import io
4
+ import contextlib
2
5
  from datetime import datetime
3
6
  from rich.console import Console
4
7
  from rich.layout import Layout
@@ -29,20 +32,41 @@ BANNER = """
29
32
  ╚══════════════════════════════════════════════════════════════════════════╝[/bold red]
30
33
  """
31
34
 
32
- MENU_ITEMS = [
33
- ("1", "user <ник>", "Поиск по соцсетям + вариации"),
34
- ("2", "mail <email>", "MX, HIBP, Gravatar"),
35
- ("3", "phone_cmd <номер>", "Оператор, страна"),
36
- ("4", "ip_cmd <IP>", "Гео, ASN, Shodan"),
37
- ("5", "dom <домен>", "WHOIS, DNS, crt.sh"),
38
- ("6", "leaks <email>", "Утечки HIBP"),
39
- ("7", "social_cmd <ник>", "Соцсети"),
40
- ("8", "pwned <пароль>", "Проверка пароля"),
41
- ("9", "telegram <канал>", "Парсинг TG"),
42
- ("A", "full --email ...", "Агрегатор"),
43
- ("T", "tui", "Этот интерфейс"),
44
- ("Q", "exit", "Выход"),
45
- ]
35
+ # Все команды с категориями
36
+ COMMANDS = {
37
+ "ПОИСК ЛЮДЕЙ": [
38
+ ("user <ник> [--permutations N] [--dorks]", "Глубокий поиск по нику + вариации + Google Dorks"),
39
+ ("social_cmd <ник>", "Поиск соцсетей по нику"),
40
+ ("email_check <email>", "SMTP + Gravatar + PGP + GitHub по email"),
41
+ ("mail <email>", "MX, HIBP, Gravatar"),
42
+ ("phone_cmd <номер>", "Оператор, страна, часовой пояс"),
43
+ ("telegram <канал>", "Парсинг публичного Telegram-канала"),
44
+ ],
45
+ "УТЕЧКИ И ПАРОЛИ": [
46
+ ("pwned <пароль>", "Проверка пароля в утечках (бесплатно)"),
47
+ ("leaks <email>", "HIBP утечки"),
48
+ ("pwgen [--name N] [--surname S] [--year Y] [--nick N]", "Генератор вероятных паролей"),
49
+ ("full [--email E] [--username U] [--phone P] [--password PW]", "Агрегатор всех модулей"),
50
+ ],
51
+ "СЕТЬ И ДОМЕНЫ": [
52
+ ("ip_cmd <IP>", "Гео, ASN, reverse DNS, Shodan, репутация"),
53
+ ("dom <домен>", "WHOIS, DNS, subdomains, crt.sh"),
54
+ ("whois_rev <домен>", "Reverse WHOIS"),
55
+ ("ssl_info <host>", "SSL-сертификат: издатель, даты, SAN"),
56
+ ("robots <домен>", "robots.txt + sitemap"),
57
+ ("subdomains <домен>", "Перебор поддоменов"),
58
+ ],
59
+ "ФАЙЛЫ И МЕТАДАННЫЕ": [
60
+ ("exif <path>", "EXIF/GPS из фото"),
61
+ ("pdf_meta <path>", "Метаданные PDF"),
62
+ ("eml <path>", "Анализ заголовков письма"),
63
+ ("wayback <url>", "Wayback Machine"),
64
+ ],
65
+ "ИНТЕРФЕЙС": [
66
+ ("tui", "Этот интерфейс"),
67
+ ("exit / q", "Выход"),
68
+ ],
69
+ }
46
70
 
47
71
  SESSION = {
48
72
  "start": datetime.now(),
@@ -53,6 +77,15 @@ SESSION = {
53
77
  "db_loaded": False,
54
78
  }
55
79
 
80
+ OUTPUT_LOG = []
81
+
82
+
83
+ def push_output(text):
84
+ ts = datetime.now().strftime("%H:%M:%S")
85
+ OUTPUT_LOG.append(f"[red]{ts}[/red] [white]{text}[/white]")
86
+ if len(OUTPUT_LOG) > 50:
87
+ OUTPUT_LOG.pop(0)
88
+
56
89
 
57
90
  def log_result(text):
58
91
  ts = datetime.now().strftime("%H:%M:%S")
@@ -64,55 +97,39 @@ def log_result(text):
64
97
  def build_layout():
65
98
  layout = Layout()
66
99
  layout.split_column(
67
- Layout(name="header", size=10),
68
- Layout(name="body"),
100
+ Layout(name="header", size=9),
101
+ Layout(name="body", ratio=3),
102
+ Layout(name="output", size=12),
69
103
  Layout(name="input", size=3),
70
104
  Layout(name="footer", size=3),
71
105
  )
72
106
  layout["body"].split_row(
73
- Layout(name="left", ratio=1),
107
+ Layout(name="left", ratio=2),
74
108
  Layout(name="center", ratio=2),
75
109
  Layout(name="right", ratio=1),
76
110
  )
77
111
  return layout
78
112
 
79
113
 
80
- def render_input():
81
- return Panel(
82
- "[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]~[/white] [bold white]введи команду ниже[/bold white]",
83
- title="[bold red]ВВОД[/bold red]",
84
- border_style="red",
85
- )
86
-
87
-
88
114
  def render_header():
89
115
  logo = Text.from_markup(ASCII_LOGO)
90
116
  banner = Text.from_markup(BANNER)
91
- return Panel(
92
- Align.center(logo + banner),
93
- border_style="red",
94
- title="[bold red]MILENIUM[/bold red]",
95
- subtitle="[red]v0.4.2[/red]",
96
- )
117
+ return Panel(Align.center(logo + banner), border_style="red", title="[bold red]MILENIUM[/bold red]", subtitle="[red]v0.5.2[/red]")
97
118
 
98
119
 
99
- def render_left():
100
- table = Table(show_header=False, box=None, padding=(0, 1))
101
- table.add_column("Key", style="bold red")
102
- table.add_column("Cmd", style="bold white")
103
- for key, cmd, _ in MENU_ITEMS:
104
- table.add_row(f"[{key}]", cmd)
105
- return Panel(
106
- table,
107
- title="[bold red]МЕНЮ[/bold red]",
108
- border_style="red",
109
- subtitle="[red]выбери команду[/red]",
110
- )
120
+ def render_commands():
121
+ table = Table(show_header=True, box=None, padding=(0, 1), header_style="bold red")
122
+ table.add_column("Команда", style="bold white")
123
+ table.add_column("Описание", style="red")
124
+ for category, cmds in COMMANDS.items():
125
+ table.add_row(f"[bold red]━━ {category} ━━[/bold red]", "")
126
+ for cmd, desc in cmds:
127
+ table.add_row(f"[white]{cmd}[/white]", f"[red]{desc}[/red]")
128
+ return Panel(table, title="[bold red]ВСЕ КОМАНДЫ[/bold red]", border_style="red")
111
129
 
112
130
 
113
- def render_center():
131
+ def render_session():
114
132
  lines = []
115
- lines.append("[bold red]=== СТАТИСТИКА СЕССИИ ===[/bold red]")
116
133
  uptime = datetime.now() - SESSION["start"]
117
134
  mins, secs = divmod(int(uptime.total_seconds()), 60)
118
135
  lines.append(f"[white]Uptime:[/white] [red]{mins:02d}:{secs:02d}[/red]")
@@ -124,41 +141,45 @@ def render_center():
124
141
  if SESSION["last"]:
125
142
  lines.extend(SESSION["last"])
126
143
  else:
127
- lines.append("[white]Пока ничего. Запусти команду.[/white]")
128
- return Panel(
129
- "\n".join(lines),
130
- title="[bold red]СЕССИЯ[/bold red]",
131
- border_style="red",
132
- )
144
+ lines.append("[white]Пока ничего.[/white]")
145
+ return Panel("\n".join(lines), title="[bold red]СЕССИЯ[/bold red]", border_style="red")
133
146
 
134
147
 
135
- def render_right():
148
+ def render_status():
136
149
  lines = []
137
- lines.append("[bold red]СОСТОЯНИЕ МОДУЛЕЙ:[/bold red]")
138
- lines.append("")
139
- lines.append("[white]whois:[/white] [green]OK[/green]")
140
- lines.append("[white]dns:[/white] [green]OK[/green]")
141
- lines.append("[white]requests:[/white] [green]OK[/green]")
142
- lines.append("[white]rich:[/white] [green]OK[/green]")
143
- lines.append("[white]click:[/white] [green]OK[/green]")
144
- lines.append("[white]phonenumbers:[/white][green]OK[/green]")
145
- lines.append("[white]bs4:[/white] [green]OK[/green]")
150
+ lines.append("[bold red]МОДУЛИ:[/bold red]")
151
+ for m in ["whois", "dns", "requests", "rich", "click", "phonenumbers", "bs4"]:
152
+ lines.append(f"[white]{m}:[/white] [green]OK[/green]")
146
153
  lines.append("")
147
154
  lines.append("[bold red]API-КЛЮЧИ:[/bold red]")
148
155
  lines.append("[white]HIBP:[/white] [red]NOT SET[/red]")
149
156
  lines.append("[white]DeHashed:[/white] [red]NOT SET[/red]")
150
157
  lines.append("[white]LeakCheck:[/white] [red]NOT SET[/red]")
151
158
  lines.append("[white]Serper:[/white] [red]NOT SET[/red]")
159
+ lines.append("[white]Shodan:[/white] [red]NOT SET[/red]")
160
+ return Panel("\n".join(lines), title="[bold red]СТАТУС[/bold red]", border_style="red")
161
+
162
+
163
+ def render_output():
164
+ lines = ["[bold red]=== ПРОЦЕСС ===[/bold red]"]
165
+ if OUTPUT_LOG:
166
+ lines.extend(OUTPUT_LOG[-10:])
167
+ else:
168
+ lines.append("[white]Введи команду ниже.[/white]")
169
+ return Panel("\n".join(lines), title="[bold red]ВЫВОД[/bold red]", border_style="red")
170
+
171
+
172
+ def render_input():
152
173
  return Panel(
153
- "\n".join(lines),
154
- title="[bold red]СТАТУС[/bold red]",
174
+ "[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]~[/white] [bold white]введи команду[/bold white]",
175
+ title="[bold red]ВВОД[/bold red]",
155
176
  border_style="red",
156
177
  )
157
178
 
158
179
 
159
180
  def render_footer():
160
181
  return Panel(
161
- Align.center("[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]|[/white] [green]SYSTEM READY[/green]"),
182
+ Align.center("[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]|[/white] [green]SYSTEM READY[/green] [white]|[/white] [red]ESC/Ctrl+C для выхода[/red]"),
162
183
  border_style="red",
163
184
  )
164
185
 
@@ -166,20 +187,22 @@ def render_footer():
166
187
  def draw():
167
188
  layout = build_layout()
168
189
  layout["header"].update(render_header())
169
- layout["left"].update(render_left())
170
- layout["center"].update(render_center())
171
- layout["right"].update(render_right())
190
+ layout["left"].update(render_commands())
191
+ layout["center"].update(render_session())
192
+ layout["right"].update(render_status())
193
+ layout["output"].update(render_output())
194
+ layout["input"].update(render_input())
172
195
  layout["footer"].update(render_footer())
173
196
  return layout
174
197
 
175
198
 
176
199
  def interactive():
177
200
  console.clear()
178
- # Live без screen=True — не стирает ввод
201
+ push_output("сессия запущена")
202
+ push_output("введи 'help' для списка команд")
179
203
  with Live(draw(), refresh_per_second=4) as live:
180
204
  while True:
181
205
  try:
182
- # Сначала останавливаем Live, чтобы prompt был виден
183
206
  live.stop()
184
207
  cmd = Prompt.ask("[bold red]milenium[/bold red] [white]@[/white] [red]VexxDev200[/red] [white]~[/white]")
185
208
  live.start()
@@ -191,15 +214,21 @@ def interactive():
191
214
  continue
192
215
 
193
216
  SESSION["queries"] += 1
194
- import shlex
217
+ push_output(f"выполняю: {cmd}")
218
+
195
219
  from milenium.cli import main
196
220
  args = shlex.split(cmd)
221
+ buf = io.StringIO()
197
222
  try:
198
- main(args, standalone_mode=False)
223
+ with contextlib.redirect_stdout(buf):
224
+ main(args, standalone_mode=False)
225
+ for line in buf.getvalue().splitlines():
226
+ if line.strip():
227
+ push_output(line)
199
228
  except SystemExit:
200
229
  pass
201
230
  except Exception as e:
202
- console.print(f"[bold red]Ошибка:[/bold red] {e}")
231
+ push_output(f"[red]ошибка: {e}[/red]")
203
232
  live.update(draw())
204
233
  except KeyboardInterrupt:
205
234
  break
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: milenium
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: OSINT / dox / deanon toolkit
5
5
  Requires-Python: >=3.9
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "milenium"
3
- version = "0.5.0"
3
+ version = "0.5.2"
4
4
  description = "OSINT / dox / deanon toolkit"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"
File without changes
File without changes
File without changes
File without changes