Яндекс Диск позволяет управлять ресурсами Диска (файлами и папками) посредством HTTP-запросов REST API.
API Диска предназначен для приложений, которые работают с файлами пользователей Яндекс Диска или хранят на Диске собственные файлы и настройки.
Яндекс Диск авторизует приложения с помощью OAuth-токенов. Каждый токен предоставляет определенному приложению доступ к данным определенного пользователя.
Чтобы использовать протокол OAuth при работе с Яндекс Диском:
-
Зарегистрируйте свое OAuth-приложение.
-
Войдите в аккаунт на Яндексе.
-
Откройте страницу создания приложения. https://oauth.yandex.ru/client/new/
Обратите внимание, на странице https://oauth.yandex.ru/ кнопка "Создать приложение" ведёт не туда, там лишний /id/ в url и она не позволяет указать доступы -
Укажите название вашего сервиса и при необходимости прикрепите иконку.
-
Выберите платформу Веб-сервисы и в поле Redirect URI подставьте значение по умолчанию, которое появится в подсказке Подставить URL для отладки: https://oauth.yandex.ru/verification_code.
-
В разделе Доступ к данным укажите необходимые права доступа (помимо доступа к файлам пользователя можно пользоваться папкой приложения):
- Запись в любом месте на Диске — cloud_api:disk.write;
- Чтение всего Диска — cloud_api:disk.read;
- Доступ к папке приложения на Диске — cloud_api:disk.app_folder;
- Доступ к информации о Диске — cloud_api:disk.info.
-
Укажите электронную почту для связи.
-
Внизу страницы нажмите Создать приложение. На экране появятся его описание.
-
Скопируйте идентификатор приложения из поля ClientID — он потребуется для получения OAuth-токена. В дальнейшем открыть страницу со всеми вашими приложениями вы сможете по ссылке oauth.yandex.ru.
-
-
Получите OAuth-токены для доступа к данным пользователей любым подходящим способом.
Запрос OAuth-токена при помощи кода подтверждения
Отладочный токен необходимо получить вручную:
-
Перейдите по ссылке
https://oauth.yandex.ru/authorize?response_type=token&client_id=<ClientID>
Вместо "ClientID" подставьте значение из пункта 1.8.
-
Если токен вашему приложению выдается впервые, откроется экран авторизации. После входа Яндекс OAuth перенаправит вас на страницу с токеном.
На самом деле оно открывается всегда, так что код надо брать из браузера
-
Можно воспользоваться
Request-YDiskAuthorizationCode -ClientID <clientid> -TryAuto
. Эта команда откроет "за вас" нужную страницу и попробует дождаться кода. Или просто выдаст ссылку на эту страницу без -TryAuto
-
-
Для авторизации в модуле надо получить токены с помощью
$token = Get-YDiskAccessToken -Code 123456 -ClientID $client_id -ClientSecret $client_secret
Потом безопасно сохранить ClientID, ClientSecret, refresh_token
И обновлять access_token через
$token = Get-YDiskAccessToken -RefreshToken $token.refresh_token -ClientID $client_id -ClientSecret $client_secret
Кстати, одновременно с access_token мы получаем и новый refresh_token, но старый продолжает действовать
ClientID, ClientSecret и Refresh_Token надо сохранить где-то в безопасном месте, напрямую в код их класть не надо
Для этого можно использовать модуль SecretManagement и его дополнения или хотя бы самописные функции типа
function Protect-String {
<#
.SYNOPSIS
Convert String to textual form of SecureString
.PARAMETER String
String to convert
.OUTPUTS
String
.NOTES
Author: MVKozlov
#>
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
[string]$String
)
PROCESS {
$String | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString
}
}
function Unprotect-String {
<#
.SYNOPSIS
Convert SecureString to string
.PARAMETER String
String to convert (textual form of SecureString)
.PARAMETER SecureString
SecureString to convert
.OUTPUTS
String
.NOTES
Author: MVKozlov
#>
[CmdletBinding(DefaultParameterSetName='s')]
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0, ParameterSetName='s')]
[string]$String,
[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0, ParameterSetName='ss')]
[SecureString]$SecureString
)
PROCESS {
if ($String) {
$SecureString = $String | ConvertTo-SecureString
}
if ($SecureString) {
(New-Object System.Net.NetworkCredential '', ($SecureString)).Password
}
}
}
Get-YDiskSummary -AccessToken $token.access_token
Add-YDiskItem -AccessToken $token.access_token -Path '/myfile.txt' -InFile D:\MyFile.txt
Publish-YDiskItem -AccessToken $token.access_token -Path '/myfile.txt'