This commit is contained in:
2026-07-19 13:34:50 +03:00
parent 1fd2c5ca00
commit 981187529d
+192
View File
@@ -0,0 +1,192 @@
# Yandex Disk Protected Folder Downloader
Скрипт для рекурсивного скачивания большой публичной папки Яндекс Диска, защищённой паролем.
Скрипт использует cookie `passToken`, скачивает каждый файл отдельно и не пытается сформировать единый ZIP-архив.
## Возможности
* скачивание защищённой публичной папки;
* рекурсивный обход вложенных каталогов;
* сохранение исходной структуры папок;
* скачивание файлов по одному;
* продолжение прерванной загрузки через `wget --continue`;
* автоматический пропуск полностью скачанных файлов;
* проверка размера скачанного файла;
* автоматическая пагинация списка файлов;
* остановка при появлении CAPTCHA;
* сохранение ссылки CAPTCHA в текстовый файл;
* паузы между запросами для снижения вероятности блокировки;
* повторный запуск без потери уже скачанных данных.
## Требования
Поддерживается Linux с Python 3.
Необходимые пакеты:
```bash
sudo apt install -y python3 python3-requests wget
```
## Настройка
Все основные параметры находятся в начале файла:
```python
TARGET_URL = (
"https://disk.yandex.ru/d/"
"cWn4RgSdFcSZXw/ODIS/Flashdaten/Brand-V"
)
PASS_TOKEN = ""
OUTPUT_DIR = "/mnt/hdd1-4TB/ODIS/Flashdaten/Brand-V"
```
### TARGET_URL
Полная ссылка на скачиваемую папку Яндекс Диска:
```python
TARGET_URL = "https://disk.yandex.ru/d/cWn4RgSdFcSZXw/ODIS/Flashdaten/Brand-V"
```
### PASS_TOKEN
Значение cookie `passToken`, полученное после ввода пароля в браузере.
Можно указать только значение:
```python
PASS_TOKEN = "значение_cookie_passToken"
```
### OUTPUT_DIR
Каталог, куда будут сохранены файлы:
```python
OUTPUT_DIR = "/mnt/hdd1-4TB/ODIS/Flashdaten/Brand-V"
```
Каталог будет создан автоматически, если у пользователя есть права на его создание.
## Пример вывода
```text
[INFO] Открываю исходную ссылку...
[INFO] Папка открыта.
[INFO] Корневой hash: public_hash:
[DIR ] /mnt/hdd1-4TB/ODIS/Flashdaten/Brand-V
[GET ] /mnt/hdd1-4TB/ODIS/Flashdaten/Brand-V/038997016C__7000.sgo (1.75 MiB)
[WAIT] 2.4 с перед запросом ссылки
2026-07-19 URL:https://downloader.disk.yandex.ru/... [1835008/1835008]
[PAGE] получено=41, следующий offset=41, completed=False
[WAIT] 4.2 с перед следующей страницей
```
После завершения выводится статистика:
```text
================ РЕЗУЛЬТАТ ================
Найдено файлов: 4500
Скачано сейчас: 250
Уже было скачано: 4250
Ошибок: 0
Известный общий объём: 115.40 GiB
===========================================
```
## CAPTCHA
При большом количестве запросов Яндекс может вернуть CAPTCHA.
Скрипт распознаёт ответ:
```json
{
"type": "captcha"
}
```
После этого загрузка немедленно прекращается.
Будет выведена ссылка:
```text
ЯНДЕКС ПОТРЕБОВАЛ CAPTCHA
Открой ссылку ниже в обычном браузере с того же внешнего IP:
https://disk.yandex.ru/showcaptcha?...
```
Ссылка также сохраняется в файл:
```text
/mnt/hdd1-4TB/ODIS/Flashdaten/Brand-V/yandex-captcha-url.txt
```
## Настройка задержек
### FILE_DELAY_MIN и FILE_DELAY_MAX
Случайная задержка перед запросом прямой ссылки на каждый файл:
```python
FILE_DELAY_MIN = 1.5
FILE_DELAY_MAX = 3.5
```
Скрипт будет ждать от 1.5 до 3.5 секунды перед каждым запросом `download-url`.
### PAGE_DELAY_MIN и PAGE_DELAY_MAX
Задержка между страницами списка файлов:
```python
PAGE_DELAY_MIN = 3.0
PAGE_DELAY_MAX = 6.0
```
### COOLDOWN_EVERY_FILES
Количество запросов файлов, после которого выполняется длинная пауза:
```python
COOLDOWN_EVERY_FILES = 100
```
При значении `100` длинная пауза выполняется после каждых 100 запросов.
### COOLDOWN_MIN и COOLDOWN_MAX
Диапазон длительной паузы:
```python
COOLDOWN_MIN = 60.0
COOLDOWN_MAX = 120.0
```
После каждых 100 запросов скрипт будет ждать от 60 до 120 секунд.
## Коды завершения
Скрипт использует следующие коды выхода:
| Код | Значение |
| ----: | ------------------------------------------ |
| `0` | загрузка завершена без ошибок |
| `1` | загрузка завершена с ошибками |
| `2` | ошибка конфигурации или отсутствует `wget` |
| `75` | Яндекс потребовал CAPTCHA |
| `130` | процесс остановлен через `Ctrl+C` |
Проверить код после завершения:
```bash
echo $?
```