Загрузка файла на Яндекс.Диск с помощью скрипта Bash

В этой статье мы рассмотрим простой скрипт на языке Bash для загрузки файлов на Яндекс.Диск с использованием их API. Этот скрипт может быть полезен для автоматизации процесса резервного копирования или синхронизации файлов с вашим аккаунтом на Яндекс.Диске.

Подготовка к работе

Прежде чем начать использовать скрипт, убедитесь, что у вас есть:

  1. Токен доступа OAuth к API Яндекс.Диска.
  2. Установленные утилиты curl и jq для выполнения HTTP-запросов и обработки JSON-ответов соответственно.

Создание скрипта

Ниже приведен пример скрипта на языке Bash для загрузки файла на Яндекс.Диск:

#!/bin/bash
# Токен доступа к API Яндекс.Диска
accessToken=""
# Путь к файлу, который нужно загрузить на Яндекс.Диск
fileToUpload=""
# Путь, по которому следует загрузить файл на Яндекс.Диск
uploadDir="/"
# Получаем имя файла из пути
fileName=$(basename "$fileToUpload")
# Формируем полный путь загрузки файла
uploadPath="$uploadDir$fileName"
# Временное расширение файла для ускорения загрузки (почему-то некоторые файлы на яндекс грузятся медленно) 
tmpExt=".tmp"
# URL для запроса загрузки файла
uploadRequestUrl="https://cloud-api.yandex.net/v1/disk/resources/upload?path=$uploadPath$tmpExt&overwrite=true"
# Максимальное количество попыток загрузки файла
maxRetryAttempts=3
retryCount=0
while [ $retryCount -lt $maxRetryAttempts ]; do
    # GET-запрос для получения URL загрузки
    response=$(curl -s -X GET -H "Authorization: OAuth $accessToken" "$uploadRequestUrl")
    # Получаем URL для загрузки файла
    uploadUrl=$(echo $response | jq -r '.href')
    # Попытка загрузить файл на Яндекс.Диск
    curl -s -X PUT -T "$fileToUpload" "$uploadUrl"
    if [ $? -eq 0 ]; then
        echo "Файл успешно загружен на Яндекс.Диск."
        # Переименование файла на сервере Яндекс.Диска
        moveResponse=$(curl -s -X POST \
            -H "Authorization: OAuth $accessToken" \
            "https://cloud-api.yandex.net/v1/disk/resources/move?path=$uploadPath&from=$uploadPath$tmpExt&overwrite=true")
        break
    else
        echo "Произошла ошибка при загрузке файла на Яндекс.Диск."
        if [[ $response == *"Precondition Failed"* ]]; then
            range=$(echo "$response" | jq -r '.Range')
            startByte=$(echo "$range" | awk -F'-' '{print $2}' | awk '{print $1 + 1}')
            # Догружаем недостающие части файла
            curl -s -X PUT -H "Content-Range: bytes $startByte-" --data-binary "@$fileToUpload" "$uploadUrl"
            echo "Файл успешно догружен на Яндекс.Диск."
            break
        else
            echo "Не удалось обработать ошибку загрузки файла."
            retryCount=$((retryCount+1))
            if [ $retryCount -lt $maxRetryAttempts ]; then
                echo "Повторная попытка загрузки файла ($retryCount из $maxRetryAttempts)."
            else
                echo "Достигнуто максимальное количество попыток загрузки файла."
            fi
        fi
    fi
done

Использование скрипта

  1. Замените переменную $accessToken на ваш токен доступа OAuth к API Яндекс.Диска.
  2. Укажите путь к файлу, который вы хотите загрузить, в переменной fileToUpload.
  3. Укажите путь, по которому вы хотите загрузить файл на Яндекс.Диск, в переменной uploadDir.

После этого просто запустите скрипт, и он загрузит указанный файл на ваш аккаунт на Яндекс.Диск

Оцените документ
Обновлено 03.02.2025

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *