- Введение¶
- Установка¶
- Примеры¶
- Получение токена через код подтверждения¶
- Рекурсивная загрузка файлов¶
- Задание пользовательских свойств файлов¶
- Очищение корзины¶
- Как загрузить файлы на Яндекс Диск, с помощью Python
- Яндекс.Диск REST API
- Python
- Работа с REST API Яндекс.Диска через Python Requests
- Создать приложение и получить токен
- REST API Яндекс.Диск
- HTTP Python
- Программа для загрузки файлов
- Комментарии
Введение¶
YaDisk — это библиотека-клиент REST API Яндекс.Диска.
Установка¶
Примеры¶
import yadisk y = yadisk.YaDisk(token="") # or # y = yadisk.YaDisk("", "", "") # Check if the token is valid print(y.check_token()) # Get disk information print(y.get_disk_info()) # Print files and directories at "/some/path" print(list(y.listdir("/some/path"))) # Upload "file_to_upload.txt" to "/destination.txt" y.upload("file_to_upload.txt", "/destination.txt") # Same thing with open("file_to_upload.txt", "rb") as f: y.upload(f, "/destination.txt") # Download "/some-file-to-download.txt" to "downloaded.txt" y.download("/some-file-to-download.txt", "downloaded.txt") # Permanently remove "/file-to-remove" y.remove("/file-to-remove", permanently=True) # Create a new directory at "/test-dir" print(y.mkdir("/test-dir"))
Получение токена через код подтверждения¶
import sys import yadisk y = yadisk.YaDisk("application-id>", "") url = y.get_code_url() print("Go to the following url: %s" % url) code = input("Enter the confirmation code: ") try: response = y.get_token(code) except yadisk.exceptions.BadRequestError: print("Bad code") sys.exit(1) y.token = response.access_token if y.check_token(): print("Sucessfully received token!") else: print("Something went wrong. Not sure how though. ")
Рекурсивная загрузка файлов¶
import posixpath import os import yadisk def recursive_upload(y, from_dir, to_dir): for root, dirs, files in os.walk(from_dir): p = root.split(from_dir)[1].strip(os.path.sep) dir_path = posixpath.join(to_dir, p) try: y.mkdir(dir_path) except yadisk.exceptions.PathExistsError: pass for file in files: file_path = posixpath.join(dir_path, file) p_sys = p.replace("/", os.path.sep) in_path = os.path.join(from_dir, p_sys, file) try: y.upload(in_path, file_path) except yadisk.exceptions.PathExistsError: pass y = yadisk.YaDisk(token="") to_dir = "/test" from_dir = "/home/ubuntu" recursive_upload(y, from_dir, to_dir)
Задание пользовательских свойств файлов¶
import yadisk y = yadisk.YaDisk(token="") path = input("Enter a path to patch: ") properties = "speed_of_light": 299792458, "speed_of_light_units": "meters per second", "message_for_owner": "MWAHAHA! Your file has been patched by an evil script!"> meta = y.patch(path, properties) print("\nNew properties: ") for k, v in meta.custom_properties.items(): print("%s: %r" % (k, v)) answer = input("\nWant to get rid of them? (y/[n]) ") if answer.lower() in ("y", "yes"): properties = k: None for k in properties> y.patch(path, properties) print("Everything's back as usual")
Очищение корзины¶
import sys import time import yadisk y = yadisk.YaDisk(token="") answer = input("Are you sure about this? (y/[n]) ") if answer.lower() in ("y", "yes"): print("Emptying the trash bin. ") operation = y.remove_trash("/") print("It might take a while. ") if operation is None: print("Nevermind. The deed is done.") sys.exit(0) while True: status = y.get_operation_status(operation.href) if status == "in-progress": time.sleep(5) print("Still waiting. ") elif status == "success": print("Success!") break else: print("Got some weird status: %r" % (status,)) print("That's not normal") break else: print("Not going to do anything")
© Copyright 2023, Ivan Konovalov Revision f053f008 .
Versions latest stable Downloads On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.
Как загрузить файлы на Яндекс Диск, с помощью Python
Приветствую всех, в этом уроке речь пойдет о Яндекс.Диске, а именно о работе с ней через Python. Данный урок будет полезен для новичков, в качестве примера напишем небольшую программу, и научим ее загружать не только файлы, но и папки с содержимым.
Яндекс.Диск REST API
Для начала получим токен, который необходим для работы с API Диском. Для этого перейдем по ссылке (новая, актуальная на 2023г. ссылка, спасибо пользователю govermsk) и зарегистрируем наше приложение, назовём его к примеру, backup, и дадим ему полное разрешение для работы с Я.Диском.
Теперь нужно просто перейти по этой ниже ссылке, заменив ID приложения на свой (ID вы получили после регистрации приложения), и токен готов.
https://oauth.yandex.ru/authorize?response_type=token&client_id=
Python
Для работы с Я.Диск REST API будем использовать уже готовую библиотеку, установим ее командой.
Попробуем подключиться к нашему Я.Диску используя ранее полученный токен.
import yadisk y = yadisk.YaDisk(token="токен") print(y.check_token()) # Проверим токен
Если результат True, значит вы все сделали правильно 🙂
Добавим еще небольшой код, который отправит несколько файлом, и создаст папку на Я.Диске.
y.mkdir("/test/Hello Word") # Создать папку y.upload("file1.txt", "/test/file1.txt") # Загружает первый файл y.upload("file2.txt", "/test/file2.txt") # Загружает второй файл
Всё работает отлично, мы смогли загрузить наши файлы и создать папку.
Усложним задачу, и попробует не создать, а отправить всю папку с содержимым, так скажем, сделать backup данных.
import yadisk import os from datetime import datetime y = yadisk.YaDisk(token="токен") def run(path): date = datetime.strftime(datetime.now(), "%d.%m.%Y-%H.%M.%S") y.mkdir(f'/test/') for address, dirs, files in os.walk(path): for dir in dirs: y.mkdir(f'/test//') print(f'Папка создана') for file in files: print(f'Файл загружен') y.upload(f'/', f'/test//') if __name__ == '__main__': run(r'C:\folder\путь к папке для загрузки')
Теперь при каждом запуске скрипта, наши данные будут загружаться в папку с уникальным именем «дата и время загрузки».
По всем вопросом можете обратиться ко мне через обратную связь, буду рад помочь.
Работа с REST API Яндекс.Диска через Python Requests
Из этой статьи вы узнаете как работать с REST API Яндекс.Диском через Python используя HTTP запросы (ранее мы делали с помощью готовой библиотеки yadisk). Создадим небольшую программу для быстрой загрузки файлов прямо с проводника Windows.
Яндекс не ободряет когда его сервис используют только как хранилище для резервных копий.
Создать приложение и получить токен
Зарегистрируем приложение на oauth.yandex.ru и назовем его к примеру Backup1 , укажем платформу «Веб-сервисы» (воспользуемся URL для разработки), и разрешим API полный доступ к Диску.
В ответ мы должны получить информацию о новом приложение, сейчас нас интересует его ID
Что бы получить отладочный токен перейдем по ссылке ниже, заменив ID приложения на свой
https://oauth.yandex.ru/authorize?response_type=token&client_id=
REST API Яндекс.Диск
Теперь можно потренироваться на полигоне.
Вы можете оценить, как работает API Яндекс.Диска, отправляя запросы из удобного интерфейса.
Для примера создадим папку, укажем ее имя и нажмем кнопку попробовать
Заходим на Яндекс Диск, и видим что папка появилась.
Так же попробуем удалить нашу ранее созданную папку, укажем ее имя и нажмем кнопку попробовать
Таким способом вы можете проверить работу всех функций.
HTTP Python
Воспользуемся параметрами запроса из полигона, и с помощью библиотеки requests повторить все на Python.
Импортирует библиотеку, укажем заголовок запроса, url, и token
import requests URL = 'https://cloud-api.yandex.net/v1/disk/resources' TOKEN = 'AQAAAAAz55vbAAc-fohhPDQSvU5kroy21-HguNA' headers = '>
Напишем две функции для нашей будущей программы
Создать папку
def create_folder(path): """Создание папки. \n path: Путь к создаваемой папке.""" requests.put(f'?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'/upload?path=&overwrite=', headers=headers).json() with open(loadfile, 'rb') as f: try: requests.put(res['href'], files=) 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 = '> def create_folder(path): """Создание папки. \n path: Путь к создаваемой папке.""" requests.put(f'?path=', headers=headers) def upload_file(loadfile, savefile, replace=False): """Загрузка файла. savefile: Путь к файлу на Диске loadfile: Путь к загружаемому файлу replace: true or false Замена файла на Диске""" res = requests.get(f'/upload?path=&overwrite=', headers=headers).json() with open(loadfile, 'rb') as f: try: requests.put(res['href'], files=) except KeyError: print(res) def backup(savepath, loadpath): """Загрузка папки на Диск. \n savepath: Путь к папке на Диске для сохранения \n loadpath: Путь к загружаемой папке""" date_folder = '_'.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('//'.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('\'.format(address, file),\ '//'.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%
Комментарии
pro100bro
Вами было представлено не совсем корректное использование блока try/except. Если при GET запросе по каким-то причинам возникла ошибка, то уже до попадания в try/except, в переменной ‘res’ будет отсутствовать ключ ‘href’, то есть ссылка на загрузку. В этом случае мы можем использовать простой ‘if’, для проверки ответа от Яндекс диска: if ‘href’ not in response.keys(): print(f»Got an error: «) else: with open(loadfile, ‘rb’) as f: requests.put(response[‘href’], files=)
Рамис
@pro100bro, честно, я не помню почему я решил обернуть этот запрос в конструкцию try/except . Вы правы, правильнее было бы использовать условия if :