Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save YPermitin/b4749277683a49621991769e4d061444 to your computer and use it in GitHub Desktop.
Save YPermitin/b4749277683a49621991769e4d061444 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

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

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

@bladerunner2020
Copy link

Спасибо большое! Очень помогло, но есть маленькая ошибочка (?). По крайней мере, у меня на маке не работал флаг overwrite, пока я не взял весь URL в кавычке. Иначе терялся символ &.

sendUrlResponse=`curl -s -H "Authorization: OAuth $TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources/upload/?path=app:/$FILENAME&overwrite=true"`

@UlisPaxton
Copy link

UlisPaxton commented Jul 23, 2023

FILENAME и FILEPATH прибиты гвоздями, linux-like пути по всей файловой системе не работают. Полтора часа пытался это поправить, переплевался и завтра перепишу на питоне. Полезно, но реализация ужасна.
P.S.: https://github.com/UlisPaxton/yandex_disk_upload/blob/master/yadisk.py

@ep4sh
Copy link

ep4sh commented Sep 29, 2024

Привет! Огромная благодарность автору за проделанную работу!

Небольшое уточнение: при отправке файла напрямую в YD (по сгенерированной ссылке) OAuth-токен уже не требуется:

# Отправляем файл
sendFileResponse=$(curl -v -T $FILEPATH  $sendUrl)

набросал пакетик на Go для загрузки/скачивания файлов:
https://github.com/ep4sh/yadsharez/

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