infra/@yandex-disk.storage/PUBLIC_FOLDER_GUIDE.md

Работа с публичной папкой Яндекс.Диска

URL папки: https://disk.yandex.ru/d/qjKx1sj375BcZw

Быстрый старт

Просмотр содержимого

# Список файлов в корне папки
python3 projects/infra-yandex-disk/solution/scripts/yd_public.py list \
  --url "https://disk.yandex.ru/d/qjKx1sj375BcZw"

# Список файлов в подпапке "номенклатура"
python3 projects/infra-yandex-disk/solution/scripts/yd_public.py list \
  --url "https://disk.yandex.ru/d/qjKx1sj375BcZw" \
  --path "/номенклатура"

Скачивание файлов

# Скачать конкретный файл
python3 projects/infra-yandex-disk/solution/scripts/yd_public.py download \
  --url "https://disk.yandex.ru/d/qjKx1sj375BcZw" \
  --file "/номенклатура/1с-nomen-zapas.xlsx" \
  --output "/tmp/номенклатура.xlsx"

# Скачать ВСЮ папку целиком
python3 projects/infra-yandex-disk/solution/scripts/yd_public.py download-all \
  --url "https://disk.yandex.ru/d/qjKx1sj375BcZw" \
  --output "/tmp/yandex-data"

Примеры использования

Пример 1: Скачать последнюю версию номенклатуры

#!/bin/bash
# Скрипт для загрузки номенклатуры с Яндекс.Диска

YDISK_URL="https://disk.yandex.ru/d/qjKx1sj375BcZw"
OUTPUT_DIR="/opt/data/nomenclature"

# Скачать файл
python3 projects/infra-yandex-disk/solution/scripts/yd_public.py download \
  --url "${YDISK_URL}" \
  --file "/номенклатура/1с-nomen-zapas.xlsx" \
  --output "${OUTPUT_DIR}/nomenclature-$(date +%Y%m%d).xlsx"

echo "Номенклатура загружена: ${OUTPUT_DIR}/nomenclature-$(date +%Y%m%d).xlsx"

Пример 2: Автоматическая синхронизация (cron)

# Добавить в crontab -e
# Скачивать обновлённую номенклатуру каждый день в 03:00

0 3 * * * /usr/bin/python3 $WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_public.py download-all --url "https://disk.yandex.ru/d/qjKx1sj375BcZw" --output /opt/data/ydisk-sync >> /var/log/ydisk-sync.log 2>&1

Пример 3: Использование в Python коде

#!/usr/bin/env python3
"""Интеграция с публичной папкой Яндекс.Диска"""

import sys
sys.path.insert(0, '$WORKSPACE/projects/infra-yandex-disk/solution/scripts')

# Импортировать класс
import importlib.util
spec = importlib.util.spec_from_file_location(
    "yd_public",
    "$WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_public.py"
)
yd_public = importlib.util.module_from_spec(spec)
spec.loader.exec_module(yd_public)

# Использовать
client = yd_public.YandexPublicDisk("https://disk.yandex.ru/d/qjKx1sj375BcZw")

# Получить список файлов
files = client.list_files("/номенклатура")
print(f"Найдено файлов: {len(files['_embedded']['items'])}")

# Скачать файл
client.download_file(
    "/номенклатура/1с-nomen-zapas.xlsx",
    "/tmp/nomenclature.xlsx"
)
print("Файл скачан!")

Структура папки

https://disk.yandex.ru/d/qjKx1sj375BcZw
└── номенклатура/
    ├── 1с-nomen-zapas.xlsx      (441 KB)
    └── 1с-тщьутлдфегкф.pdf     (2.2 MB)

Возможности

Список файлов - просмотр содержимого папки
Скачивание файлов - загрузка отдельных файлов
Скачивание папок - рекурсивная загрузка всей структуры
БЕЗ авторизации - не требует OAuth токена
Безопасность - доступ только к публичной папке, только чтение

Ограничения

Только чтение - нельзя загружать/изменять/удалять файлы
Только эта папка - доступ только к публичной ссылке
⚠️ Требует публичный доступ - папка должна быть открыта по ссылке

Устранение проблем

Ошибка: "Resource not found"

# Проверьте путь - он должен начинаться со слэша
# Неправильно:
--path "номенклатура"

# Правильно:
--path "/номенклатура"

Ошибка: "DiskNotFoundError"

Возможные причины:
1. Папка перестала быть публичной
2. Ссылка изменилась
3. Файл был удалён или переименован

Проверка доступности

# Проверить что папка доступна
python3 projects/infra-yandex-disk/solution/scripts/yd_public.py list \
  --url "https://disk.yandex.ru/d/qjKx1sj375BcZw"

# Если работает - всё в порядке
# Если ошибка - проверьте ссылку в браузере

API Reference

list - Список файлов

python3 yd_public.py list --url "URL" [--path "PATH"]

Параметры:
- --url - публичная ссылка на папку (обязательно)
- --path - путь внутри папки (опционально)

Вывод:
- Имя папки/файла
- Тип (dir/file)
- Даты создания/изменения
- Список содержимого

download - Скачать файл

python3 yd_public.py download --url "URL" --file "FILE" --output "OUTPUT"

Параметры:
- --url - публичная ссылка на папку (обязательно)
- --file - путь к файлу внутри папки (обязательно)
- --output - куда сохранить локально (обязательно)

download-all - Скачать папку

python3 yd_public.py download-all --url "URL" --output "OUTPUT"

Параметры:
- --url - публичная ссылка на папку (обязательно)
- --output - директория для сохранения (обязательно)

Особенности:
- Рекурсивно скачивает всю структуру
- Создаёт подпапки автоматически
- Показывает прогресс для каждого файла

Автоматизация

Скрипт для регулярной синхронизации

#!/bin/bash
# /opt/scripts/sync-ydisk-nomenclature.sh

YDISK_URL="https://disk.yandex.ru/d/qjKx1sj375BcZw"
LOCAL_DIR="/opt/data/nomenclature"
SCRIPT_PATH="$WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_public.py"
LOG_FILE="/var/log/ydisk-nomenclature-sync.log"

echo "=== Sync started: $(date) ===" >> "${LOG_FILE}"

# Создать директорию если не существует
mkdir -p "${LOCAL_DIR}"

# Скачать всю папку
python3 "${SCRIPT_PATH}" download-all \
  --url "${YDISK_URL}" \
  --output "${LOCAL_DIR}" >> "${LOG_FILE}" 2>&1

if [ $? -eq 0 ]; then
    echo "=== Sync completed: $(date) ===" >> "${LOG_FILE}"
else
    echo "=== Sync FAILED: $(date) ===" >> "${LOG_FILE}"
fi

Сделать исполняемым:

chmod +x /opt/scripts/sync-ydisk-nomenclature.sh

Добавить в cron:

# Синхронизация каждые 6 часов
0 */6 * * * /opt/scripts/sync-ydisk-nomenclature.sh

Последнее обновление: 2025-11-16
Проверено: ✅ Работает
Путь к скрипту: projects/infra-yandex-disk/solution/scripts/yd_public.py