Skip to content

Instantly share code, notes, and snippets.

  • Save DeckerSU/eb9e7691b9c6b7d39e311b314c2e3dfe to your computer and use it in GitHub Desktop.
Save DeckerSU/eb9e7691b9c6b7d39e311b314c2e3dfe to your computer and use it in GitHub Desktop.
Отправка файлов в Yandex Disk через REST API из Bash

Отправка файлов в Yandex Disk через REST API из Bash

Пример выгрузки файлов на Яндекс.Диск из Bash через официальный REST API.

Подготовка токена для работы с API

Тут все просто.

  1. Идем по ссылке и входим под нужной учетной записью Яндекса, после чего нажимаем "Зарегистрировать новое приложение".
  2. Настраиваем новое приложение:
    • Заполняем название приложения и его описание.
    • Даем права для работы с API, а именно в разделе "Яндекс.Диск REST API" отмечаем "Доступ к информации о Диске" и "Доступ к папке приложения на Диске".
    • В разделе "Платформы" устанавливаем флаг "Веб-сервисы", после чего заполняем параметр "Callback URL", нажав на "Подставить URL для разработки".
    • Другие параметры приложения используйте по необходимости.
  3. После сохранения будет выполнено перенаправление на страницу с данными нового приложения. Сохраняем эту информацию себе.
  4. Переходим по ссылке и разрешаем доступ приложения.
https://oauth.yandex.ru/authorize?response_type=token&client_id=<ЗдесьIdПриложенияИзПрошлогоПункта>
  1. После подтверждения получим токен для работы с API, который будет действовать 1 год.
  2. Профит!

Отправляем файл

Вот простой скрипт для отправки файла на Яндекс.Диск. По необходимости в скрипт можно добавить проверки ошибок, логирование и так далее. Здесь лишь простейший пример.

#!/bin/bash

FILENAME="somefile.txt"
FILEPATH="/home/<username>/$FILENAME"
TOKEN='<ТокенЯндексДискAPI>'

# Простая функция для парсинга свойств из JSON
function parseJson()
{
    local output
    regex="(\"$1\":[\"]?)([^\",\}]+)([\"]?)"
    [[ $2 =~ $regex ]] && output=${BASH_REMATCH[2]}
    echo $output
}

# Функция для отправки файла
function sendFile
{
    echo "Start sending a file: $1"

    # Получаем URL для загрузки файла
    sendUrlResponse=`curl -s -H "Authorization: OAuth $TOKEN" https://cloud-api.yandex.net:443/v1/disk/resources/upload/?path=app:/$FILENAME&overwrite=true`
    sendUrl=$(parseJson 'href' $sendUrlResponse)
....
    # Отправляем файл
    sendFileResponse=`curl -s -T $FILEPATH -H "Authorization: OAuth $TOKEN" $sendUrl`
....
    echo "Completing a file upload: $1"
}

sendFile $FILEPATH

Найти эти файлы в веб-интерфейсе можно перейдя на Яндекс.Диск в браузере, далее зайти в папку "Приложения". В ней вы увидите подкаталог с именем приложения, там все файлы и будут расположены.

Полезные ссылки

@DeckerSU
Copy link
Author

DeckerSU commented Oct 3, 2025

#!/usr/bin/env bash
set -euo pipefail

# Использование: ./upload_to_yadisk.sh /path/to/file
# Токен можно передать через переменную окружения TOKEN, иначе возьмется из дефолта ниже.
TOKEN="${TOKEN:-secret}"

if [[ $# -lt 1 ]]; then
  echo "Укажите путь к файлу: $0 <файл>" >&2
  exit 1
fi

FILENAME="$1"
if [[ ! -f "$FILENAME" ]]; then
  echo "Файл не найден: $FILENAME" >&2
  exit 1
fi

# URL-экранирование имени файла для части пути (только basename кладем в app:/)
basename_safe() {
  local raw; raw="$(basename "$1")"
  local out="" c
  for ((i=0; i<${#raw}; i++)); do
    c="${raw:i:1}"
    case "$c" in
      [a-zA-Z0-9._~-]) out+="$c" ;;
      *) printf -v hex '%%%02X' "'$c"; out+="$hex" ;;
    esac
  done
  printf '%s' "$out"
}
BASENAME_ENC="$(basename_safe "$FILENAME")"

API="https://cloud-api.yandex.net/v1/disk/resources/upload"
QUERY="?path=app:/${BASENAME_ENC}&overwrite=true"

# Запрашиваем upload-URL
RESP="$(
  curl -sS \
    -H "Authorization: OAuth $TOKEN" \
    "$API$QUERY"
)"

# Если ответ — это ошибка, печатаем ее поля и выходим с кодом 1
if echo "$RESP" | jq -e 'has("error")' >/dev/null 2>&1; then
  echo "$RESP" | jq -r '"error: \(.error)\ndescription: \(.description)\nmessage: \(.message)"'
  exit 1
fi

# Иначе — вытаскиваем метод и href и выполняем загрузку
METHOD="$(echo "$RESP" | jq -r '.method // "PUT"')"
HREF="$(echo "$RESP" | jq -r '.href // empty')"

if [[ -z "$HREF" ]]; then
  echo "Не получен href из ответа API. Полный ответ:" >&2
  echo "$RESP" >&2
  exit 1
fi

# Загружаем файл указанным методом (обычно PUT) на предоставленный HREF.
# Можно добавить следующий ключ для прогресс бара -#
# -H 'Yandex.Disk {"os":"windows"}' 

HTTP_CODE="$(
  curl --tcp-nodelay -X "$METHOD" \
       --upload-file "$FILENAME" \
       --retry 3 --retry-all-errors \
       --expect100-timeout 3 \
       -w '%{http_code}' -o /dev/null \
       "$HREF"
)"

case "$HTTP_CODE" in
  200|201|202)
    echo "Файл успешно загружен (HTTP $HTTP_CODE)."
    ;;
  *)
    echo "Ошибка загрузки (HTTP $HTTP_CODE)." >&2
    exit 1
    ;;
esac

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment