Из этой статьи вы узнаете как работать с REST API Яндекс.Диском через Python используя HTTP запросы (ранее мы делали с помощью готовой библиотеки yadisk). Создадим небольшую программу для быстрой загрузки файлов прямо с проводника Windows.
Яндекс не ободряет когда его сервис используют только как хранилище для резервных копий.
Создать приложение и получить токен
Зарегистрируем приложение на oauth.yandex.ru и назовем его к примеру Backup1
, укажем платформу "Веб-сервисы" (воспользуемся URL для разработки), и разрешим API полный доступ к Диску.
В ответ мы должны получить информацию о новом приложение, сейчас нас интересует его ID
Что бы получить отладочный токен перейдем по ссылке ниже, заменив ID приложения на свой
https://oauth.yandex.ru/authorize?response_type=token&client_id=<ID приложения>
Токен готов.
REST API Яндекс.Диск
Теперь можно потренироваться на полигоне.
Вы можете оценить, как работает API Яндекс.Диска, отправляя запросы из удобного интерфейса.
Для примера создадим папку, укажем ее имя и нажмем кнопку попробовать
Заходим на Яндекс Диск, и видим что папка появилась.
Так же попробуем удалить нашу ранее созданную папку, укажем ее имя и нажмем кнопку попробовать
Таким способом вы можете проверить работу всех функций.
HTTP Python
Воспользуемся параметрами запроса из полигона, и с помощью библиотеки requests повторить все на Python.
Установим requests
pip install requests
Импортирует библиотеку, укажем заголовок запроса, url, и token
import requests
URL = 'https://cloud-api.yandex.net/v1/disk/resources'
TOKEN = 'AQAAAAAz55vbAAc-fohhPDQSvU5kroy21-HguNA'
headers = {'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': f'OAuth {TOKEN}'}
Напишем две функции для нашей будущей программы
Создать папку
def create_folder(path):
"""Создание папки. \n path: Путь к создаваемой папке."""
requests.put(f'{URL}?path={path}', headers=headers)
Создаст папку hello world
и API
create_folder('hello world')
create_folder('hello world/api')
Загрузить файл
def upload_file(loadfile, savefile, replace=False):
"""Загрузка файла.
savefile: Путь к файлу на Диске
loadfile: Путь к загружаемому файлу
replace: true or false Замена файла на Диске"""
res = requests.get(f'{URL}/upload?path={savefile}&overwrite={replace}', headers=headers).json()
with open(loadfile, 'rb') as f:
try:
requests.put(res['href'], files={'file':f})
except KeyError:
print(res)
Загрузит файл images.rar
в папку hello world
upload_file(r'C:\myFiles\images.rar', 'hello world/images.rar')
Программа для загрузки файлов
Сейчас можно приступить к разработке самой программы, назовем ее backup.py
import os
import requests
from datetime import datetime
from progress.bar import Bar
URL = 'https://cloud-api.yandex.net/v1/disk/resources'
TOKEN = 'AQAAAAAz55vbAAc-fohhPDQSvU5kroy21-HguNA'
headers = {'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': f'OAuth {TOKEN}'}
def create_folder(path):
"""Создание папки. \n path: Путь к создаваемой папке."""
requests.put(f'{URL}?path={path}', headers=headers)
def upload_file(loadfile, savefile, replace=False):
"""Загрузка файла.
savefile: Путь к файлу на Диске
loadfile: Путь к загружаемому файлу
replace: true or false Замена файла на Диске"""
res = requests.get(f'{URL}/upload?path={savefile}&overwrite={replace}', headers=headers).json()
with open(loadfile, 'rb') as f:
try:
requests.put(res['href'], files={'file':f})
except KeyError:
print(res)
def backup(savepath, loadpath):
"""Загрузка папки на Диск. \n savepath: Путь к папке на Диске для сохранения \n loadpath: Путь к загружаемой папке"""
date_folder = '{0}_{1}'.format(loadpath.split('\\')[-1], datetime.now().strftime("%Y.%m.%d-%H.%M.%S"))
create_folder(savepath)
for address, _, files in os.walk(loadpath):
create_folder('{0}/{1}/{2}'.format(savepath, date_folder, address.replace(loadpath, "")[1:].replace("\\", "/")))
bar = Bar('Loading', fill='X', max=len(files))
for file in files:
bar.next()
upload_file('{0}\{1}'.format(address, file),\
'{0}/{1}{2}/{3}'.format(savepath, date_folder, address.replace(loadpath, "").replace("\\", "/"), file))
bar.finish()
if __name__ == '__main__':
#backup('Backup', r'C:\Files\backup')
backup('Backup', os.getcwd())
Программа готова, добавим новую системную переменную
Теперь мы может загружать наши файлы из проводника используя переменную %backup%