Coder Social home page Coder Social logo

ivknv / yadisk Goto Github PK

View Code? Open in Web Editor NEW
118.0 6.0 9.0 1.28 MB

Библиотека-клиент REST API Яндекс.Диска для Python / Yandex.Disk REST API client library for Python

Home Page: https://yadisk.readthedocs.io

License: GNU Lesser General Public License v3.0

Python 100.00%
python python3 yandex-disk rest-api yandex

yadisk's Introduction

YaDisk

Read the Docs

PyPI

English version of this document

YaDisk - это библиотека-клиент REST API Яндекс.Диска.

Документация доступна на Read the Docs (RU) и Read the Docs (EN).

Установка

yadisk поддерживает несколько HTTP библиотек и реализует одновременно как синхронный, так и асинхронный API.

На данный момент поддерживаются следующие HTTP библиотеки:

  • requests (используется по умолчанию для синхронного API)
  • httpx (синхронный и асинхронный API, используется по умолчанию для асинхронного API)
  • aiohttp (асинхронный API)
  • pycurl (синхронный API)

Для синхронного API (устанавливает requests):

pip install yadisk[sync_defaults]

Для асинхронного API (устанавливает httpx и aiofiles):

pip install yadisk[async_defaults]

Вы можете также вручную установить нужные библиотеки:

# Для использования совместно с pycurl
pip install yadisk pycurl

# Для использования совместно с aiohttp, также установит aiofiles
pip install yadisk[async_files] aiohttp

Примеры

Синхронный API

import yadisk

client = yadisk.Client(token="<токен>")
# или
# client = yadisk.Client("<id-приложения>", "<secret-приложения>", "<токен>")

# Вы можете использовать либо конструкцию with, либо вручную вызвать client.close() в конце
with client:
    # Проверяет, валиден ли токен
    print(client.check_token())

    # Получает общую информацию о диске
    print(client.get_disk_info())

    # Выводит содержимое "/some/path"
    print(list(client.listdir("/some/path")))

    # Загружает "file_to_upload.txt" в "/destination.txt"
    client.upload("file_to_upload.txt", "/destination.txt")

    # То же самое
    with open("file_to_upload.txt", "rb") as f:
        client.upload(f, "/destination.txt")

    # Скачивает "/some-file-to-download.txt" в "downloaded.txt"
    client.download("/some-file-to-download.txt", "downloaded.txt")

    # Безвозвратно удаляет "/file-to-remove"
    client.remove("/file-to-remove", permanently=True)

    # Создаёт новую папку "/test-dir"
    print(client.mkdir("/test-dir"))

Асинхронный API

import yadisk
import aiofiles

client = yadisk.AsyncClient(token="<token>")
# или
# client = yadisk.AsyncClient("<application-id>", "<application-secret>", "<token>")

# Вы можете использовать либо конструкцию with, либо вручную вызвать client.close() в конце
async with client:
    # Проверяет, валиден ли токен
    print(await client.check_token())

    # Получает общую информацию о диске
    print(await client.get_disk_info())

    # Выводит содержимое "/some/path"
    print([i async for i in await client.listdir("/some/path")])

    # Загружает "file_to_upload.txt" в "/destination.txt"
    await client.upload("file_to_upload.txt", "/destination.txt")

    # То же самое
    async with aiofiles.open("file_to_upload.txt", "rb") as f:
        await client.upload(f, "/destination.txt")

    # То же самое, но с обычными файлами
    with open("file_to_upload.txt", "rb") as f:
        await client.upload(f, "/destination.txt")

    # Скачивает "/some-file-to-download.txt" в "downloaded.txt"
    await client.download("/some-file-to-download.txt", "downloaded.txt")

    # То же самое
    async with aiofiles.open("downloaded.txt", "wb") as f:
        await client.download("/some-file-to-download.txt", f)

    # Безвозвратно удаляет "/file-to-remove"
    await client.remove("/file-to-remove", permanently=True)

    # Создаёт новую папку "/test-dir"
    print(await client.mkdir("/test-dir"))

История изменений

  • Release 2.1.0 (2024-01-03)
    • Исправлен баг, из-за которого параметры в теле POST-запроса неправильно кодировались
    • Исправлен баг в PycURLSession.send_request(), из-за которого переданные заголовки игнорировались
    • RequestsSession.close() теперь закрывает сессию для всех потоков
    • Все методы Client и AsyncClient теперь используют существующую сессию
    • Удалены аттрибут session_factory и метод make_session() классов Client и AsyncClient
    • Класс сессии теперь может быть указан в качестве строки (см. Client/AsyncClient)
    • Добавлены методы Client.get_device_code()/AsyncClient.get_device_code()
    • Добавлены методы Client.get_token_from_device_code()/AsyncClient.get_token_from_device_code()
    • Добавлен недостающий параметр redirect_uri для Client.get_auth_url()/AsyncClient.get_auth_url() и Client.get_code_url()/AsyncClient.get_code_url()
    • Добавлена поддержка параметров PKCE для Client.get_auth_url()/AsyncClient.get_auth_url(), Client.get_code_url()/AsyncClient.get_code_url() и Client.get_token()/AsyncClient.get_token()
    • Добавлен аттрибут scope для TokenObject
    • Добавлены новые классы исключений: InvalidClientError, InvalidGrantError, AuthorizationPendingError, BadVerificationCodeError и UnsupportedTokenTypeError
  • Release 2.0.0 (2023-12-12)
    • Библиотека теперь предоставляет как синхронный, так и асинхронный API (см. Введение и Справочник API)
    • Теперь поддерживается несколько HTTP библиотек (см. Доступные реализации сессий для полного списка)
    • Теперь возможно добавить поддержку любой HTTP библиотеки (см. Интерфейс Session)
    • requests - теперь опциональная зависимость (хотя всё ещё используется по умолчанию для синхронного API)
    • Обратите внимание, что аргументы, специфичные для requests теперь передаются по другому (см. Доступные реализации сессий)
    • Предпочитаемые HTTP библиотеки теперь должны быть установлены явным образом (см. Введение)
    • Client.upload() и Client.upload_by_link() теперь могут принимать функцию, возвращающую итератор (или генератор) в качестве полезной нагрузки
  • Release 1.3.4 (2023-10-15)
    • Методы upload() и download() (и связянные с ними) теперь могут загружать/скачивать файлы, не поддерживающие операцию seek() (например, stdin и stdout, при условии, что они открыты в режиме "rb" или "wb"), см. PR #31
  • Release 1.3.3 (2023-04-22)
    • Пути вида app:/ теперь работают правильно (см. issue #26)
  • Release 1.3.2 (2023-03-20)
    • Исправлено issue #29: TypeError: 'type' object is not subscriptable
  • Release 1.3.1 (2023-02-28)
    • Исправлено issue #28: TypeError при вызове download_public() с параметром path
    • Исправлено AttributeError при вызове ResourceLinkObject.public_listdir()
  • Release 1.3.0 (2023-01-30)
    • Добавлены convenience-методы для объектов ...Object (например, см. ResourceObject)
    • Добавлены подсказки типов (type hints)
    • Улучшены проверки ошибок и проверка ответа
    • Добавлены InvalidResponseError, PayloadTooLargeError, UploadTrafficLimitExceededError
    • Добавлено несколько недостающих полей объектов DiskInfoObject и SystemFoldersObject
    • Добавлены методы rename(), upload_by_link() и download_by_link()
    • Добавлен аттрибут default_args объекта YaDisk
    • download() и upload() теперь возвращают ResourceLinkObject
    • До этого возвращаемые объекты LinkObject были заменены более конкретными подклассами
    • ConnectionError теперь тоже вызывает повторную попытку
  • Release 1.2.19 (2023-01-20)
    • Исправлено неправильное поведение фикса из 1.2.18 для путей disk: и trash:.
  • Release 1.2.18 (2023-01-20)
    • Исправлено issue #26: символ ':' в именах файлов приводит к BadRequestError. Это поведение вызвано работой самого REST API Яндекс.Диска, но было исправлено на уровне библиотеки.
  • Release 1.2.17 (2022-12-11)
    • Исправлен баг, связанный с автоматическим закрытием сессии. Использование метода __del__() приводило в некоторых случаях к ошибке ReferenceError (ошибка игнорировалась, но сообщение выводилось). Баг проявляется по большей части в старых версиях Python (например 3.4).
  • Release 1.2.16 (2022-08-17)
    • Исправлен баг в check_token(): функция могла вызвать ForbiddenError, если у приложения недостатчно прав (issue #23).
  • Release 1.2.15 (2021-12-31)
    • Исправлено: не распознавались ссылки на асинхронные операции, если они использовали http:// (вместо https://). Иногда Яндекс.Диск может вернуть http:// ссылку на асинхронную операцию. Теперь обе версии ссылок распознаются правильно, при этом, при получении информации об операции (через get_operation_status()) всегда используется https:// версия ссылки, даже если Яндекс.Диск вернул http://.
  • Release 1.2.14 (2019-03-26)
    • Исправлена ошибка TypeError в функциях get_public_* при использовании с параметром path (issue #7)
    • Добавлен аттрибут unlimited_autoupload_enabled для DiskInfoObject
  • Release 1.2.13 (2019-02-23)
    • Добавлен md5 параметр для remove()
    • Добавлен UserPublicInfoObject
    • Добавлен аттрибут country для UserObject
    • Добавлен аттрибут photoslice_time для ResourceObject, PublicResourceObject и TrashResourceObject
  • Release 1.2.12 (2018-10-11)
    • Исправлен баг: не работает параметр fields в listdir() (issue #4)
  • Release 1.2.11 (2018-06-30)
    • Добавлен недостающий параметр sort для get_meta()
    • Добавлены аттрибуты file и antivirus_status для ResourceObject, PublicResourceObject и TrashResourceObject
    • Добавлен параметр headers
    • Исправлена опечатка в download() и download_public() (issue #2)
    • Убран параметр *args
  • Release 1.2.10 (2018-06-14)
    • Исправлено поведение timeout=None. None должен означать „без таймаута“, но в предыдущих версиях значение None было синонимично со стандартным таймаутом.
  • Release 1.2.9 (2018-04-28)
    • Изменена лицензия на LGPLv3 (см. COPYING и COPYING.lesser)
    • Другие изменения информации о пакете
  • Release 1.2.8 (2018-04-17)
    • Исправлено несколько опечаток: у PublicResourceListObject.items и TrashResourceListObject.items были неправильные типы данных
    • Псевдонимы полей в параметре fields заменяются при выполнении запросов API (например, embedded -> _embedded)
  • Release 1.2.7 (2018-04-15)
    • Исправлен баг перемотки файла при загрузке/скачивании после повторной попытки
  • Release 1.2.6 (2018-04-13)
    • Теперь объекты сессий requests кэшируются, чтобы их можно было переиспользовать (иногда может существенно ускорить выполнение запросов)
    • keep-alive отключается при загрузке/скачивании файлов по умолчанию
  • Release 1.2.5 (2018-03-31)
    • Исправлен баг (ошибка на единицу) в utils.auto_retry() (иногда мог вызвать AttributeError)
    • Повторные попытки применяются для upload(), download() и download_public() целиком
    • Задано stream=True для download() и download_public()
    • Другие мелкие исправления
  • Release 1.2.4 (2018-02-19)
    • Исправлена опечатка (TokenObject.exprires_in -> TokenObject.expires_in)
  • Release 1.2.3 (2018-01-20)
    • Исправлено TypeError при вызове WrongResourceTypeError
  • Release 1.2.2 (2018-01-19)
    • refresh_token() больше не требует валидный или пустой токен.
  • Release 1.2.1 (2018-01-14)
    • Исправлена неработоспособность повторных попыток.
  • Release 1.2.0 (2018-01-14)
    • Исправлено использование n_retries=0 в upload(), download() и download_public()
    • upload(), download() и download_public() больше не возвращают ничего (см. документацию)
    • Добавлен модуль utils (см. документацию)
    • Добавлены RetriableYaDiskError, WrongResourceTypeError, BadGatewayError и GatewayTimeoutError
    • listdir() теперь вызывает WrongResourceTypeError вместо NotADirectoryError
  • Release 1.1.1 (2017-12-29)
    • Исправлена обработка аргументов в upload(), download() и download_public(). До этого использование n_retries и retry_interval вызывало исключение (TypeError).
  • Release 1.1.0 (2017-12-27)
    • Усовершенствованные исключения (см. документацию)
    • Добавлена поддержка параметра force_async
    • Мелкие исправления багов
  • Release 1.0.8 (2017-11-29)
    • Исправлен ещё один баг в listdir()
  • Release 1.0.7 (2017-11-04)
    • Добавлен install_requires в setup.py
  • Release 1.0.6 (2017-11-04)
    • Некоторые функции теперь возвращают OperationLinkObject
  • Release 1.0.5 (2017-10-29)
    • Исправлен setup.py, теперь исключает тесты
  • Release 1.0.4 (2017-10-23)
    • Исправлены баги в upload, download и listdir
    • Значение по-умолчанию limit в listdir установлено в 10000
  • Release 1.0.3 (2017-10-22)
    • Добавлен модуль settings
  • Release 1.0.2 (2017-10-19)
    • Исправлена функция get_code_url (добавлены недостающие параметры)
  • Release 1.0.1 (2017-10-18)
    • Исправлен серьёзный баг в GetTokenRequest (добавлен недостающий параметр)
  • Release 1.0.0 (2017-10-18)
    • Первый релиз

yadisk's People

Contributors

ivknv avatar tordex avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

yadisk's Issues

[Bug] grant_type not in POST при отправке кода подтверждения

grant_type not in POST при отправке кода подтверждения

def main():
    client = yadisk.Client("***", "****")
    with client:
        print(client.get_code_url())
        code = input("Enter the confirmation code: ")
        response = client.get_token(code)
    client.token = response.access_token

    if client.check_token():
        print("Successfully received token!")
    else:
        print("Something went wrong. Not sure how though...")

Получаем:

Traceback (most recent call last):
  File "/home/des/sandbox/test_sandbox.py", line 37, in <module>
    main()
  File "/home/des/sandbox/test_sandbox.py", line 23, in main
    response = client.get_token(code)
  File "/home/des/.virtualenvs/test/lib/python3.10/site-packages/yadisk/client.py", line 380, in get_token
    request.send()
  File "/home/des/.virtualenvs/test/lib/python3.10/site-packages/yadisk/api/api_request.py", line 158, in send
    auto_retry(self._attempt, self.n_retries, self.retry_interval)
  File "/home/des/.virtualenvs/test/lib/python3.10/site-packages/yadisk/utils.py", line 95, in auto_retry
    return func()
  File "/home/des/.virtualenvs/test/lib/python3.10/site-packages/yadisk/api/api_request.py", line 136, in _attempt
    raise self.response.get_exception()
yadisk.exceptions.BadRequestError: grant_type not in POST (<empty> / invalid_request)

Должны получить словарь с токеном

  • ОС: Ubuntu 22.04
  • Версия библиотеки yadisk: 2.0.0
  • Версия Python: 3.10

Downloading photos/videos from unlimited storage | Скачивание фото\видео из безлимитного хранилища

Hello.

Tell me, is it possible to download photos/videos from the unlimited storage into which Yandex allows downloading from mobile applications?

Are there any methods at all for retrieving these files via the Rest API?


Здравствуйте.

Подскажите, есть ли возможность скачивать фото\видео из безлимитного хранилища, в которое яндекс дает загружать с мобильных приложений?

Есть ли вообще какие-то методы получения этих файлов через Rest API?

AttributeError: module 'yadisk' has no attribute 'YaDisk'

Run you code:

import yadisk 
y = yadisk.YaDisk(token="https://disk.yandex.ru/d/****")

I get error:

  File "yadisk.py", line 1, in <module>
    import yadisk
  File ".../yadisk.py", line 23, in <module>
    y = yadisk.YaDisk(token="https://disk.yandex.ru/d/****")
AttributeError: module 'yadisk' has no attribute 'YaDisk'

Немного некорректная работа функции yadisk.YaDisk.check_token() для ограниченных прав

Если приложению в настройках ограничить доступ только для его папки, то эта функция вызовет ошибку
image

Это происходит на примере получения токена из кода подтверждения, опубликованного в документации. Если проверку токена на валидность убрать, то пример и просмотр файлов в папке приложения будет возможен

How to use behind the proxy

Hi

I'm behind the proxy on my Windows system. I have used 'set http_proxy' and 'set https_proxy' to configure system proxies. And, for example, I can use requests lib with no issues:
import requests print(requests.get('http://google.com').text
However if I try using your lib when behind the proxy, I'm getting:

requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='cloud-api.yandex.net', port=443): Max retries exceeded with url: /v1/disk (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x0000019DB5A5A7C0>, 'Connection to cloud-api.yandex.net timed out. (connect timeout=10.0)'))

How can I work around it?

HTTPSConnectionPool(host='cloud-api.yandex.net', port=443) on Android

Использую вашу библиотеку для создания мобильного приложения. При разработке на любом ПК устройстве все отлично работает. В коде этого приложения мне необходимо проверить валидность токена. Делаю я это с помощью метода yadisk.YaDisk.check_token(). Когда интепритатор пытается выполнить эту команду в уже скомпилированном приложении на Android девайсе, поднимается исключение ConnectionError.

Лог ошибки:

[DEBUG  ] [Starting new HTTPS connection (2)] cloud-api.yandex.net:443
[DEBUG  ] [Starting new HTTPS connection (3)] cloud-api.yandex.net:443
[DEBUG  ] [Starting new HTTPS connection (4)] cloud-api.yandex.net:443
[DEBUG  ] [Starting new HTTPS connection (5)] cloud-api.yandex.net:443
[DEBUG  ] [Starting new HTTPS connection (6)] cloud-api.yandex.net:443
[ERROR  ] [Container   ] HTTPSConnectionPool(host='cloud-api.yandex.net', port=443): Max retries exceeded with url: /v1/disk/operations/0000 (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x737c2ce230>: Failed to resolve 'cloud-api.yandex.net' ([Errno 7] No address associated with hostname)"))
Traceback (most recent call last):
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/connection.py", line 203, in _new_conn
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/util/connection.py", line 60, in create_connection
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/Lib/socket.py", line 955, in getaddrinfo
socket.gaierror: [Errno 7] No address associated with hostname

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/connectionpool.py", line 790, in urlopen
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/connectionpool.py", line 491, in _make_request
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/connectionpool.py", line 467, in _make_request
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/connectionpool.py", line 1092, in _validate_conn
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/connection.py", line 611, in connect
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/connection.py", line 210, in _new_conn
urllib3.exceptions.NameResolutionError: <urllib3.connection.HTTPSConnection object at 0x737c2ce230>: Failed to resolve 'cloud-api.yandex.net' ([Errno 7] No address associated with hostname)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/requests/adapters.py", line 486, in send
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/connectionpool.py", line 844, in urlopen
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/urllib3/util/retry.py", line 515, in increment
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='cloud-api.yandex.net', port=443): Max retries exceeded with url: /v1/disk/operations/0000 (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x737c2ce230>: Failed to resolve 'cloud-api.yandex.net' ([Errno 7] No address associated with hostname)"))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/egor/Documents/TodaCheck/.buildozer/android/app/View/container.py", line 48, in connect_to_data
  File "/home/egor/Documents/TodaCheck/.buildozer/android/app/dbmanage.py", line 15, in __init__
  File "/home/egor/Documents/TodaCheck/.buildozer/android/app/diskmanage.py", line 35, in __init__
  File "/home/egor/Documents/TodaCheck/.buildozer/android/app/diskmanage.py", line 49, in read_token
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/yadisk/yadisk.py", line 396, in check_token
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/yadisk/yadisk.py", line 1658, in _get_operation_status
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/yadisk/api/api_request.py", line 124, in send
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/yadisk/utils.py", line 99, in auto_retry
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/yadisk/utils.py", line 96, in auto_retry
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/yadisk/api/api_request.py", line 110, in _attempt
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/requests/sessions.py", line 703, in send
  File "/home/egor/Documents/TodaCheck/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/todacheck/arm64-v8a/requests/adapters.py", line 519, in send
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='cloud-api.yandex.net', port=443): Max retries exceeded with url: /v1/disk/operations/0000 (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x737c2ce230>: Failed to resolve 'cloud-api.yandex.net' ([Errno 7] No address associated with hostname)"))

Versions

OS: Android 13
Python: 3.10.12
yadisk: 1.3.2

Также я провал подключаться к разным DNS серверам, но ошибка все равно остается. После этого я решил проверить смогу ли я вообще подключиться к этому серверу cloud-api.yandex.net через браузер. Итог такой же: на ПК сайт грузит нормально и возвращает json объект, а на Android ничего не грузит. Как возможно решить эту проблему?

Получение содержимого подпапок публичного ресурса

При вызове метода y.public_listdir(public_key, path='/вложенная папка') с параметром 'path' возникает следующая ошибка:
TypeError: _listdir() got multiple values for argument 'path'
Параметр path, согласно документации, нужен для обращения к вложенным ресурсам (подпапкам).
Изменив аргумент path и все его вхождения в функции def _listdir(get_meta_function, session, path, **kwargs) (файл functions/resources.py LINE 283) на public_key ошибка была устранена.

[Bug] Проблема при сборке .exe файла

При сборке в .exe с помощью pyinstaller и запуске .exe происходит ошибка:

Traceback (most recent call last):
  File "yadisk\client.py", line 227, in __init__
  File "yadisk\import_session.py", line 47, in import_session
ModuleNotFoundError: No module named 'yadisk.sessions'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 13, in <module>
  File "yadisk_api.py", line 33, in start_app
  File "yadisk_api.py", line 16, in get_app_token
  File "yadisk\client.py", line 229, in __init__
RuntimeError: requests is not installed. Either install requests or provide a custom session
[15512] Failed to execute script 'main' due to unhandled exception!

Пробовал с опцией --onefile и без, результат одинаков.

Как воспроизвести
Собираем проект в .exe с помощью pyinstaller --onefile main.py, запускаем main.exe, ловим ошибку.

Информация о системе:

  • ОС: Windows 10 x64
  • Версия библиотеки yadisk: 2.1.0
  • Версия Python: 3.11

Собирать в .exe зло, конечно, но возникла нужда)

Example submission

Recursive upload:

import os
import yadisk


y = yadisk.YaDisk("<id-приложения>", "<secret-приложения>", "<токен>")
to_dir = '/test'
from_dir = '/home/ubuntu'
for root, dirs, files in os.walk(from_dir):
    p = root.split(from_dir)[1]
    if not y.exists(to_dir + p):
        y.mkdir(to_dir + p)
    for file in files:
        if not y.exists(to_dir + p + '/' + file):
            y.upload(from_dir + p + '/' + file, to_dir + p + '/' + file)

Падает при загрузке на диск больших файлов

Файл вот такого размера
-rw-rw-r-- 1 maxim maxim 99194880 Jan 12 01:04 cb7d9207.tar

Код метода
def upload_file():
print('Start') # Press Ctrl+F8 to toggle the breakpoint.

y = yadisk.YaDisk(token=TOKEN)
print(y.get_disk_info())

y.upload('/home/maxim/.homeassistant/backups/cb7d9207.tar', '/ha_test/Core 2023.1.0.dev12.tar', overwrite=True, n_retries=3, retry_interval=5.0)

Текст ошибки
Traceback (most recent call last):
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 703, in urlopen
httplib_response = self._make_request(
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 398, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/usr/lib/python3.10/http/client.py", line 1282, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1328, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1277, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1076, in _send_output
self.send(chunk)
File "/usr/lib/python3.10/http/client.py", line 998, in send
self.sock.sendall(data)
File "/usr/lib/python3.10/ssl.py", line 1237, in sendall
v = self.send(byte_view[count:])
File "/usr/lib/python3.10/ssl.py", line 1206, in send
return self._sslobj.write(data)
TimeoutError: The write operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/adapters.py", line 489, in send
resp = conn.urlopen(
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 787, in urlopen
retries = retries.increment(
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/util/retry.py", line 550, in increment
raise six.reraise(type(error), error, _stacktrace)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/packages/six.py", line 769, in reraise
raise value.with_traceback(tb)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 703, in urlopen
httplib_response = self._make_request(
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 398, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/usr/lib/python3.10/http/client.py", line 1282, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1328, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1277, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1076, in _send_output
self.send(chunk)
File "/usr/lib/python3.10/http/client.py", line 998, in send
self.sock.sendall(data)
File "/usr/lib/python3.10/ssl.py", line 1237, in sendall
v = self.send(byte_view[count:])
File "/usr/lib/python3.10/ssl.py", line 1206, in send
return self._sslobj.write(data)
urllib3.exceptions.ProtocolError: ('Connection aborted.', TimeoutError('The write operation timed out'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/maxim/Work/yaBackup/main.py", line 45, in
upload_file()
File "/home/maxim/Work/yaBackup/main.py", line 20, in upload_file
y.upload('/home/maxim/.homeassistant/backups/cb7d9207.tar', '/ha_test/Core 2023.1.0.dev12.tar', overwrite=True, n_retries=3, retry_interval=5.0)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/yadisk.py", line 313, in upload
functions.upload(self.get_session(), path_or_file, dst_path, **kwargs)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/functions/resources.py", line 465, in upload
auto_retry(attempt, n_retries, retry_interval)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/utils.py", line 88, in auto_retry
raise e
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/utils.py", line 85, in auto_retry
return func()
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/functions/resources.py", line 461, in attempt
with contextlib.closing(session.put(link, data=file, **temp_kwargs)) as response:
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/sessions.py", line 647, in put
return self.request("PUT", url, data=data, **kwargs)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/sessions.py", line 587, in request
resp = self.send(prep, **send_kwargs)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/sessions.py", line 701, in send
r = adapter.send(request, **kwargs)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/adapters.py", line 547, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', TimeoutError('The write operation timed out'))

Process finished with exit code 1

[Bug] requests is not installed. После компиляции кода

Код работает, но после компиляции начинает выдавать ошибку:
Traceback (most recent call last):
File "yadisk\client.py", line 227, in init
File "yadisk\import_session.py", line 47, in import_session
ModuleNotFoundError: No module named 'yadisk.sessions'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "main.py", line 3, in
File "yadisk\client.py", line 229, in init
RuntimeError: requests is not installed. Either install requests or provide a custom session

код:

import yadisk

client = yadisk.Client(token="*****")
# или
# client = yadisk.Client("<id-приложения>", "<secret-приложения>", "<токен>")

# Вы можете использовать либо конструкцию with, либо вручную вызвать client.close() в конце
with client:
    # Проверяет, валиден ли токен
    print(client.check_token())

    # Скачивает "/some-file-to-download.txt" в "downloaded.txt"
    client.download("**", "**")
  • ОС: Windows
  • Версия библиотеки yadisk: 2.1.0
  • Версия Python: 3.12.1
  • Компилировал через auto-py-to-exe: "pyinstaller --noconfirm --onefile --windowed "main.py""

ConnectionError: read

Ошибка при попытке скачать файл
Ubuntu 16.04
Python 3.5.2
requests 2.19.1
yadisk 1.2.3

Команда
y.download("/folder/file.txt", "file.txt")

Лог:

Traceback (most recent call last):

  File "<ipython-input-10-833d4f6d52e1>", line 1, in <module>
    y.download("/sammurai/pip-selfcheck.json", "pip-selfcheck.json")

  File "/usr/local/lib/python3.5/dist-packages/yadisk/YaDisk.py", line 256, in download
    functions.download(self.make_session(), src_path, path_or_file, *args, **kwargs)

  File "/usr/local/lib/python3.5/dist-packages/yadisk/functions/resources.py", line 98, in download
    auto_retry(attempt, n_retries, retry_interval)

  File "/usr/local/lib/python3.5/dist-packages/yadisk/utils.py", line 86, in auto_retry
    raise e

  File "/usr/local/lib/python3.5/dist-packages/yadisk/utils.py", line 83, in auto_retry
    return func()

  File "/usr/local/lib/python3.5/dist-packages/yadisk/functions/resources.py", line 88, in attempt
    response = requests.get(link, data=file, **kwargs)

  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)

  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)

  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 512, in request
    resp = self.send(prep, **send_kwargs)

  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 622, in send
    r = adapter.send(request, **kwargs)

  File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 495, in send
    raise ConnectionError(err, request=request)

ConnectionError: read

Не загружаются файлы с ':' в названии

Не получается загрузить файл, если в имени есть двоеточие (таймстемп в ISO формате):

import os
import yadisk

filename = "2022-01-01T00:00:00.000000+03:00.zip"

y = yadisk.YaDisk(token=os.getenv("YDISK_TOKEN"))

y.upload(filename, "/" + filename)

Вывод:

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    y.upload(filename, "/" + filename)
  File "/home/judicator/sandbox/venv/lib/python3.8/site-packages/yadisk/yadisk.py", line 313, in upload
    functions.upload(self.get_session(), path_or_file, dst_path, **kwargs)
  File "/home/judicator/sandbox/venv/lib/python3.8/site-packages/yadisk/functions/resources.py", line 465, in upload
    auto_retry(attempt, n_retries, retry_interval)
  File "/home/judicator/sandbox/venv/lib/python3.8/site-packages/yadisk/utils.py", line 85, in auto_retry
    return func()
  File "/home/judicator/sandbox/venv/lib/python3.8/site-packages/yadisk/functions/resources.py", line 445, in attempt
    link = get_upload_link(session, dst_path, **temp_kwargs)
  File "/home/judicator/sandbox/venv/lib/python3.8/site-packages/yadisk/functions/resources.py", line 241, in get_upload_link
    request.send()
  File "/home/judicator/sandbox/venv/lib/python3.8/site-packages/yadisk/api/api_request.py", line 114, in send
    auto_retry(self._attempt, self.n_retries, self.retry_interval)
  File "/home/judicator/sandbox/venv/lib/python3.8/site-packages/yadisk/utils.py", line 85, in auto_retry
    return func()
  File "/home/judicator/sandbox/venv/lib/python3.8/site-packages/yadisk/api/api_request.py", line 105, in _attempt
    raise get_exception(self.response)
yadisk.exceptions.BadRequestError: Указанный формат ресурса Диска "00:00.000000+03:00.zip" не корректен. Должен начинаться с /. (Specified path "00:00.000000+03:00.zip" has incorrect format / DiskPathFormatError)

Download link shortener function

Hello, thanks for plugin. Could you include link shortener into download_link functions. It's will be very useful opportunity, because now the output links are very big and inconvenient to put them into mail with plain text.
Thank you in advance

[Question] yadisk.exceptions.UnauthorizedError: Не авторизован. (Unauthorized / UnauthorizedError)

yadisk.exceptions.UnauthorizedError: Не авторизован. (Unauthorized / UnauthorizedError)
Использую версию yadisk 1.3.3 в телеграм боте, написанном год назад.
Просрочил истечение срока токена.
Получил новый токен, запустил -> возникает исключение -" yadisk.exceptions.UnauthorizedError: Не авторизован. (Unauthorized / UnauthorizedError)"
исключение происходит на строке - if not disk.exists(temp_dir):
в блоке проверки и создания директории
if not disk.exists(temp_dir):
disk.mkdir(temp_dir)

при этом проверки print(y.check_token()), print(y.get_disk_info()), print(list(y.listdir("/абра))) - выполняются успешно

В настоящий момент в приложении на oauth.yandex.ru вижу следующую надпись с зеленой галочкой:
Приложение подключено
Всё работает и вы получаете авторизации

Все запрашиваемые права - на месте:
Яндекс.Диск WebDAV API
• Доступ к Яндекс.Диску для приложений
Яндекс.Диск REST API
• Доступ к папке приложения на Диске
• Чтение всего Диска
• Запись в любом месте на Диске
• Доступ к информации о Диске

Буду благодарен если подскажете - где я затупил))

Как получить результат метода save_to_disk если результат SyncOperationLinkObject / How to get the result of the save_to_disk method if the result is SyncOperationLinkObject

Здравствуйте!

Подскажите, каким образом можно получить путь к новому ресурсу при вызове метода save_to_disk для копировании общей папки? При вызове данного метода в синхронном режиме возвращается тип SyncOperationLinkObject с использованием того типа мы можем получить момент завершения операции, но как при этом получить путь к новому объекту как это происходит при сохранении на свой диск файла?


Could you please tell me how to get the path to a new resource when calling the save_to_disk method to copy a shared folder? When calling this method in synchronous mode the SyncOperationLinkObject type is returned. Using that type we can get the moment the operation is completed, but how can we get the path to the new object like this happens when saving a file to your disk?

Не работает фильтр полей fields

Делаю запрос:
y.listdir('/path', fields='name, type')
А в ответ приходят все поля. В чем может быть проблема? Я неправильно указываю список полей?
Версия yadisk 1.2.11

Вопрос про прямую ссылку на файл.

Приветствую.
Помогите, пожалуйста, разобраться. Из списка файлов, получаю ссылку:

for file in y.listdir(path):
    d = {'link': i['file'],
         'name': i['name']}
    data.append(d)

Всё прекрасно работает. Но когда пытаюсь перейти по этой ссылке для скачивания файла: "Не удается получить доступ к сайту. Веб-страница по адресу {...} , возможно, временно недоступна или постоянно перемещена по новому адресу. ERR_INVALID_RESPONSE". Система Win10 \ Opera.

Но при этом, переход по ссылке (с автоматическим скачиванием) прекрасно работает в WinXP \ Chrome.

Более того, если эту ссылку скопировать и вставить ручками в адресную строку, например, в Win10 \ Vivaldi, то ссылка распознаётся корректно, запускается диалог скачки файла и он-таки скачивается.

З.Ы. В Firefox не происходит вообще ничего! Ни ошибок, ни сообщений, ни скачивания. Лишь замирает весь интерфейс.

В общем и целом меня устраивает и подобное, так как пишу для системы WinXP, где всё работает, но хотелось бы разобраться что не так. Эту ссылку в современных системах надо передавать как-то особо?

YaDisk.Upload() not actaully apply argument "overwrite"

Steps to reproduce

  1. Create folder inside Yandex Disk (yandexFolder)
  2. prepare file (image for example)
  3. call method YaDisk.upload(localpath, yandexFolder, overwrite=True)
    Actual behaviour:
    Exception raised:
    Message=По указанному пути "disk:/Изображения/SanochkiInteractive/Test Folder" уже существует папка с таким именем. (Specified path "disk:/Изображения/SanochkiInteractive/Test Folder" points to existent directory. / DiskPathPointsToExistentDirectoryError)
    Source=C:\Users\al-gerasimov\source\repos\Chronica\yaHelper.py
    StackTrace:
    File "C:\Users\al-gerasimov\source\repos\Chronica\yaHelper.py", line 51, in saveFileTo
    y.upload(localpath, credentials.main_dirrectory + "/" + yandexFolder, overwrite=TRUE)
    File "C:\Users\al-gerasimov\source\repos\Chronica\bot.py", line 25, in callback_query (Current frame)
    saveFileTo(os.path.join(dst, entry), call.data)
    yadisk.exceptions.DirectoryExistsError: По указанному пути "disk:/Изображения/SanochkiInteractive/Test Folder" уже существует папка с таким именем. (Specified path "disk:/Изображения/SanochkiInteractive/Test Folder" points to existent directory. / DiskPathPointsToExistentDirectoryError)

Expected:
Now exceptions and file was uploaded to existed folder in Yandex Disk

Also, repository haven't test cases cover such cases.

If owner haven't resources for fix issue, I'll start work on it soon.

Thanks

Работа с альбомами

В документации к API Диска я не нашёл упоминания о работе с альбомами (группами фотографий). Может быть кто-то знает как работать с публичными альбомами по API?

Вот пример публичного альбома https://disk.yandex.ru/a/YVYGWGn3x4K6Tg

Progress bar

Очень не хватает функционала полоски загрузки для больших файлов

Как получить прямую ссылку на файл?

Здравствуйте, меня интересует, возможно ли получить прямую ссылку на файл, то есть что бы ссылка заканчивалась на .mp4, .txt, .mp3...?
Если да, то как?

Download files by public link

Приветствую.

Отличная либа и красивый код, всё классно разложено по полочкам :-)

Судя по всему, либу будет несложно пропатчить для работы с публичными ссылками на файл (вроде https://yadi.sk/i/LNjClSXFppELzQ): достаточно в метод yadisk.yadisk.YaDisk#download (или чуть глубже) захардкодить регулярку, которая будет узнавать такие ссылки, и использовать немного другой URL для запроса LinkObject. Или вынести в отдельный метод download_public.

В общем, если это интересно, могу сделать PR на досуге.

Скорость загрузки файла с ПК

Добрый день!

Скорость загрузки 14 мб .mp3 составляет около 2 минут
Тот же файл в браузере грузится за доли сек
Это особенности api или я что-то не учел?
Спасибо!

Не могу создать публичную ссылку на папку.

Сам код:

import yadisk
y = yadisk.YaDisk(token=token)

folder1 = 'TestFolder'
#folder1 = 'disk:/TestFolder'
#folder1 = '/TestFolder'
#folder1 = './TestFolder'

public_url = y.get_meta(folder1).public_url

С файлами работает а вот с папками нет всегда равно = None, что не так делаю ? Спасибо.
(если вручную создать ссылку то ее получаю)

Sometimes a resource is locked

Thanks for your project.
Could you advice me, please?

There are jobs that carried out in parallel for uploading files to yandex disk in my pipeline.
Sometimes, I get error ResourceIsLockedError.

I researched the documents, there finded this parameters:

timeout – float or tuple, request timeout
headers – dict or None, additional request headers
n_retries – int, maximum number of retries
retry_interval – delay between retries in seconds

How I can use them for away issue?

Thanks!

Как получить ссылку на папку?

Как получить ссылку на папку? метод get_download_link возвращает ссылку на скачивание zip архива, а мне нужна ссылка на скачивание папок, но с интерфейсом, например как эта: https://yadi.sk/d/FUTI4ODm9Pn9Dg Я пробовал использовать метод publish, котрый исходя из документации дожен вернуть обьект LinkObject, в котором будет ссылка, я получил обьект, но есди я вставлю эту ссылку в браузер, то я получаю ответ:
{"message": "Не авторизован.", "description": "Unauthorized", "error": "UnauthorizedError"}
как можно получить ссылку на папку, которой можно поделиться файлом?

[Question] Не работает listdir

Здравствуйте. Долгое время пользовался библиотекой без каких-либо проблем, но тут обнаружилась одна: в общем случае функция Client.listdir() работает нормально, но при попытке применить ее к некоторым конкретным папкам вылетает

yadisk.exceptions.RequestTimeoutError: HTTPSConnectionPool(host='cloud-api.yandex.net', port=443): Read timed out. (read timeout=15.0)

В чем может быть причина такого исключения?
Провел несколько тестов: папка над вызывающей ошибку показывается нормально, папка внутри этой ошибочной тоже открывается нормально, но сама (ошибочная) папка не открывается, а падает исключение

TypeError: 'type' object is not subscriptable

I just installed yadisk via pip install yadisk. And it raises error when I run import yadisk

`

import yadisk
Traceback (most recent call last):
File "", line 1, in
File "/home/timofei/.local/lib/python3.8/site-packages/yadisk/init.py", line 4, in
from .yadisk import YaDisk
File "/home/timofei/.local/lib/python3.8/site-packages/yadisk/yadisk.py", line 118, in
def _filter_kwargs_for_requests(kwargs: dict[str, Any]) -> None:
TypeError: 'type' object is not subscriptable

`

Ошибка Доступ запрещён. Возможно, у приложения недостаточно прав для данного действия. (Forbidden / ForbiddenError)

При создании приложения указал доступ к веб сервисам, но в консоли сейчас есть только доступ веб-сервисы и больше никаких настроек нет.

Пробую выполнить код собранный из примеров

y = yadisk.YaDisk("--", "--")
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...")

print(y.check_token())


y.upload("C:\\...\\test.ini","/test.ini")

Вывод консоли

Go to the following url: https://oauth.yandex.ru/authorize?response_type=code&client_id=8276f155c47943e3813ee95275c9fab2&display=popup&force_confirm=yes
Enter the confirmation code: 4767659
Sucessfully received token!

На этапе загрузки получаю:
Получаю ошибку yadisk.exceptions.ForbiddenError: Доступ запрещён. Возможно, у приложения недостаточно прав для данного действия. (Forbidden / ForbiddenError)

Подскажите в чем может быть проблема?

403

Когда я пытаюсь

y = yadisk.YaDisk("...", "...")
url = y.get_code_url()

Возникает:

403
При регистрации приложения не был указан Callback URL, приложение не может получить доступ через веб-интерфейс

I'm getting "DiskUnsupportedUserAccountTypeError" error.

I dont know why i am getting this error. When i input code i am getting this error.

ERROR:telethon.client.updates:Unhandled exception on handler
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/telethon/client/updates.py", line 413, in _dispatch_update
await callback(event)
File "script.py", line 87, in handler
if y.check_token():
File "/usr/local/lib/python3.6/dist-packages/yadisk/yadisk.py", line 408, in check_token
return functions.check_token(self.get_session(token), **kwargs)
File "/usr/local/lib/python3.6/dist-packages/yadisk/functions/auth.py", line 27, in check_token
get_disk_info(session, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/yadisk/functions/disk.py", line 22, in get_disk_info
request.send()
File "/usr/local/lib/python3.6/dist-packages/yadisk/api/api_request.py", line 114, in send
auto_retry(self._attempt, self.n_retries, self.retry_interval)
File "/usr/local/lib/python3.6/dist-packages/yadisk/utils.py", line 84, in auto_retry
return func()
File "/usr/local/lib/python3.6/dist-packages/yadisk/api/api_request.py", line 105, in _attempt
raise get_exception(self.response)
yadisk.exceptions.ForbiddenError: Тип аккаунта пользователя не поддерживается. (User account type is not supported. / DiskUnsupportedUserAccountTypeError)

Ошибка "Connection aborted" / "socket.timeout" при попытке выгрузить любой большой файл (> 3GB)

Уже долгое время пытаюсь использовать данный пакет, но каждый раз валится ошибка:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 357, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python3.6/http/client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1065, in _send_output
    self.send(chunk)
  File "/usr/lib/python3.6/http/client.py", line 986, in send
    self.sock.sendall(data)
  File "/usr/lib/python3.6/ssl.py", line 975, in sendall
    v = self.send(byte_view[count:])
  File "/usr/lib/python3.6/ssl.py", line 944, in send
    return self._sslobj.write(data)
  File "/usr/lib/python3.6/ssl.py", line 642, in write
    return self._sslobj.write(data)
socket.timeout: The write operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 367, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/usr/lib/python3/dist-packages/six.py", line 692, in reraise
    raise value.with_traceback(tb)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 357, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python3.6/http/client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1065, in _send_output
    self.send(chunk)
  File "/usr/lib/python3.6/http/client.py", line 986, in send
    self.sock.sendall(data)
  File "/usr/lib/python3.6/ssl.py", line 975, in sendall
    v = self.send(byte_view[count:])
  File "/usr/lib/python3.6/ssl.py", line 944, in send
    return self._sslobj.write(data)
  File "/usr/lib/python3.6/ssl.py", line 642, in write
    return self._sslobj.write(data)
urllib3.exceptions.ProtocolError: ('Connection aborted.', timeout('The write operation timed out',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "ydsk.py", line 24, in <module>
    y.upload(args.path_from, args.path_to, overwrite=False)
  File "/usr/local/lib/python3.6/dist-packages/yadisk/yadisk.py", line 327, in upload
    functions.upload(self.get_session(), path_or_file, dst_path, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/yadisk/functions/resources.py", line 465, in upload
    auto_retry(attempt, n_retries, retry_interval)
  File "/usr/local/lib/python3.6/dist-packages/yadisk/utils.py", line 87, in auto_retry
    raise e
  File "/usr/local/lib/python3.6/dist-packages/yadisk/utils.py", line 84, in auto_retry
    return func()
  File "/usr/local/lib/python3.6/dist-packages/yadisk/functions/resources.py", line 461, in attempt
    with contextlib.closing(session.put(link, data=file, **temp_kwargs)) as response:
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 578, in put
    return self.request('PUT', url, data=data, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 520, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 630, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 490, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', timeout('The write operation timed out',))

Как воспроизвести:

apt install pigz

# не 'if=/dev/zero' (!)
dd if=/dev/urandom of=testfile.tmp count=300 bs=10M

# без архивирования нормально загружает
tar cf - testfile.tmp | pigz > testfile.tar.gz

python3 ydsk.py --path_from=testfile.tar.gz --path_to=testfile.tar.gz --auth_appid=aaa --auth_appsecret=bbb --auth_apptoken=ccc

Файл ydsk.py: https://gist.github.com/saippuakauppias/0680b0bcedef5c6689459b055fe3b09a

Может быть что-то нужно дополнительно передавать в аргументах при загрузке больших файлов? Или, например, выгружать через open?

Can't download specific file from public link

Path argument for function download_public doesn't reach request's payload.

e.x. after executing this line - yadisk.download_public(link, local_path, path=remote_path) - i got error:
TypeError: Session.request() got an unexpected keyword argument 'path'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.