Загрузив OneDrive SDK для Python, откройте командную строку и введите следующую команду, чтобы установить его:
pip install onedrivesdk
Затем включите SDK в свой проект Python, добавив:
import onedrivesdk
Для взаимодействия с API OneDrive ваше приложение должно пройти проверку подлинности. Для этого вы можете использовать следующий пример кода.
import onedrivesdk
redirect_uri = 'http://localhost:8080/'
client_secret = 'your_client_secret'
client_id = 'your_client_id'
api_base_url = 'https://api.onedrive.com/v1.0/'
scopes = [ 'wl.signin' , 'wl.offline_access' , 'onedrive.readwrite' ]
http_provider = onedrivesdk . HttpProvider ()
auth_provider = onedrivesdk . AuthProvider (
http_provider = http_provider ,
client_id = client_id ,
scopes = scopes )
client = onedrivesdk . OneDriveClient ( api_base_url , auth_provider , http_provider )
auth_url = client . auth_provider . get_auth_url ( redirect_uri )
# Ask for the code
print ( 'Paste this URL into your browser, approve the app ' s access.' )
print ( 'Copy everything in the address bar after "code=", and paste it below.' )
print ( auth_url )
code = raw_input ( 'Paste code here: ' )
client . auth_provider . authenticate ( code , redirect_uri , client_secret )
Приведенный выше код требует копирования в ваш браузер и обратно в консоль. Если вы хотите удалить часть этой ручной работы, вы можете использовать вспомогательный класс GetAuthCodeServer
. Этот вспомогательный класс запускает веб-сервер, поэтому этот метод нельзя использовать во всех средах.
import onedrivesdk
from onedrivesdk . helpers import GetAuthCodeServer
redirect_uri = 'http://localhost:8080/'
client_secret = 'your_app_secret'
scopes = [ 'wl.signin' , 'wl.offline_access' , 'onedrive.readwrite' ]
client = onedrivesdk . get_default_client (
client_id = 'your_client_id' , scopes = scopes )
auth_url = client . auth_provider . get_auth_url ( redirect_uri )
#this will block until we have the code
code = GetAuthCodeServer . get_auth_code ( auth_url , redirect_uri )
client . auth_provider . authenticate ( code , redirect_uri , client_secret )
После проверки подлинности вашего приложения вы получите доступ к API OneDrive и сможете совершать вызовы с помощью SDK.
Чтобы взаимодействовать с API OneDrive, ваше приложение должно пройти проверку подлинности для определенного ресурса. Ваше приложение должно сначала использовать помощник обнаружения ресурсов, чтобы узнать, к какой службе вы можете получить доступ. Затем вы можете создать клиент для доступа к этим ресурсам. Здесь используется немного другой поток аутентификации, чем в стандартном потоке кода — обратите внимание на использование redeem_refresh_token
с service_resource_id
службы, к которой вы хотите получить доступ.
import onedrivesdk
from onedrivesdk . helpers import GetAuthCodeServer
from onedrivesdk . helpers . resource_discovery import ResourceDiscoveryRequest
redirect_uri = 'http://localhost:8080'
client_id = your_client_id
client_secret = your_client_secret
discovery_uri = 'https://api.office.com/discovery/'
auth_server_url = 'https://login.microsoftonline.com/common/oauth2/authorize'
auth_token_url = 'https://login.microsoftonline.com/common/oauth2/token'
http = onedrivesdk . HttpProvider ()
auth = onedrivesdk . AuthProvider ( http ,
client_id ,
auth_server_url = auth_server_url ,
auth_token_url = auth_token_url )
auth_url = auth . get_auth_url ( redirect_uri )
code = GetAuthCodeServer . get_auth_code ( auth_url , redirect_uri )
auth . authenticate ( code , redirect_uri , client_secret , resource = discovery_uri )
# If you have access to more than one service, you'll need to decide
# which ServiceInfo to use instead of just using the first one, as below.
service_info = ResourceDiscoveryRequest (). get_service_info ( auth . access_token )[ 0 ]
auth . redeem_refresh_token ( service_info . service_resource_id )
client = onedrivesdk . OneDriveClient ( service_info . service_resource_id + '/_api/v2.0/' , auth , http )
Примечание. Во всех примерах предполагается, что ваше приложение уже прошло аутентификацию.
returned_item = client . item ( drive = 'me' , id = 'root' ). children [ 'newfile.txt' ]. upload ( './path_to_file.txt' )
root_folder = client . item ( drive = 'me' , id = 'root' ). children . get ()
id_of_file = root_folder [ 0 ]. id
client . item ( drive = 'me' , id = id_of_file ). download ( './path_to_download_to.txt' )
f = onedrivesdk . Folder ()
i = onedrivesdk . Item ()
i . name = 'New Folder'
i . folder = f
returned_item = client . item ( drive = 'me' , id = 'root' ). children . add ( i )
from onedrivesdk . item_reference import ItemReference
ref = ItemReference ()
ref . id = 'yourparent!id' #path also supported
copy_operation = client . item ( drive = 'me' , id = 'youritemtocopy!id' ). copy ( name = 'new copied name' , parent_reference = ref ). post ()
#copy_operation.item will return None until the copy has completed.
#If you would like to block until the operation has been completed
#and copy_operation.item is no longer None
copy_operation . poll_until_complete ()
renamed_item = onedrivesdk . Item ()
renamed_item . name = 'NewItemName'
renamed_item . id = 'youritemtorename!id'
new_item = client . item ( drive = 'me' , id = renamed_item . id ). update ( renamed_item )
#get the top three elements of root, leaving the next page for more elements
collection = client . item ( drive = 'me' , id = 'root' ). children . request ( top = 3 ). get ()
#get the first item in the collection
item = collection [ 0 ]
#get the next page of three elements, if none exist, returns None
collection2 = onedrivesdk . ChildrenCollectionRequest . get_next_page_request ( collection , client ). get ()
Для асинхронных операций вы создаете asyncio.coroutine
, реализующую asyncio.ascompleted
, и выполняете ее с помощью loop.run_until_complete
.
import asyncio
@ asyncio . coroutine
def run_gets ( client ):
coroutines = [ client . drive ( 'me' ). request (). get_async () for i in range ( 3 )]
for future in asyncio . as_completed ( coroutines ):
drive = yield from future
print ( drive . id )
loop = asyncio . get_event_loop ()
loop . run_until_complete ( run_gets ( client ))
Вы можете сохранить данные сеанса OAuth, чтобы вам не приходилось проходить весь процесс OAuth каждый раз при запуске приложения. Для этого выполните следующие действия:
auth_provider = onedrivesdk . AuthProvider ( http_provider ,
client_id ,
scopes )
auth_provider . authenticate ( code , redirect_uri , client_secret )
# Save the session for later
auth_provider . save_session ()
#### Next time you start the app ####
auth_provider = onedrivesdk . AuthProvider ( http_provider ,
client_id ,
scopes )
auth_provider . load_session ()
auth_provider . refresh_token ()
client = onedrivesdk . OneDriveClient ( base_url , auth_provider , http_provider )
После вызова refresh_token()
ваш AuthProvider
будет готов к аутентификации вызовов API OneDrive. Однако эта реализация не является полной.
Session
в соответствии с потребностями вашего приложения..load_session()
может вызвать исключение, в зависимости от вашей реализации Session
. Например, реализация по умолчанию пытается открыть файл session.pickle
, который может не существовать и вызовет FileNotFoundError
. Вам нужно будет учесть это здесь (или, что еще лучше, в вашей реализации Session
). Если вам нужно проксировать ваши запросы, вы можете использовать вспомогательный класс HttpProviderWithProxy
.
import onedrivesdk
from onedrivesdk . helpers import http_provider_with_proxy
proxy = {
'http' : 'http://localhost:8888' ,
'https' : 'https://localhost:8888'
}
http = http_provider_with_proxy . HttpProviderWithProxy ( proxy , verify_ssl = True )
auth = onedrivesdk . AuthProvider ( http , my_client_id , [ 'onedrive.readwrite' ])
client = onedrivesdk . OneDriveClient ( my_base_url , auth , http )
Все запросы, использующие этот клиент, будут пересылаться.
В этом проекте принят Кодекс поведения Microsoft с открытым исходным кодом. Для получения дополнительной информации см. часто задаваемые вопросы о Кодексе поведения или свяжитесь с нами по адресу [email protected], если у вас возникнут дополнительные вопросы или комментарии.