import os import requests from tqdm.auto import tqdm def download_yandex_file(public_file_url: str, destination_path: str, filename: str): """ Скачивает один файл с публичного Яндекс.Диска по прямой ссылке на файл. """ api_url = "https://cloud-api.yandex.net/v1/disk/public/resources/download" params = {'public_key': public_file_url} print(f"🔎 Получение информации о файле: {filename}...") try: response = requests.get(api_url, params=params) response.raise_for_status() data = response.json() download_url = data.get('href') if not download_url: print(f"❌ Не удалось получить URL для скачивания файла '{filename}'. Ответ API: {data}") return False except requests.exceptions.RequestException as e: print(f"❌ Ошибка при получении информации о файле '{filename}': {e}") return False except KeyError as e: print(f"❌ Ошибка при разборе ответа API для '{filename}': отсутствует ключ {e}. Ответ: {data}") return False full_path = os.path.join(destination_path, filename) os.makedirs(destination_path, exist_ok=True) print(f"📥 Скачивание '{filename}' в '{full_path}'...") try: size_response = requests.head(download_url) total_size = int(size_response.headers.get('content-length', 0)) download_response = requests.get(download_url, stream=True) download_response.raise_for_status() with open(full_path, 'wb') as f: with tqdm(total=total_size, unit='B', unit_scale=True, desc=filename) as pbar: for chunk in download_response.iter_content(chunk_size=8192): if chunk: f.write(chunk) pbar.update(len(chunk)) except requests.exceptions.RequestException as e: print(f"\n❌ Ошибка при скачивании файла '{filename}': {e}") return False except Exception as e: print(f"\n❌ Неожиданная ошибка при скачивании '{filename}': {e}") return False print(f"🎉 Файл '{filename}' успешно скачан.") return True