Nachdem Sie das OneDrive SDK für Python heruntergeladen haben, öffnen Sie eine Eingabeaufforderung und geben Sie Folgendes ein, um es zu installieren:
pip install onedrivesdk
Fügen Sie als Nächstes das SDK in Ihr Python-Projekt ein, indem Sie Folgendes hinzufügen:
import onedrivesdk
Um mit der OneDrive-API interagieren zu können, muss sich Ihre App authentifizieren. Sie können dazu das folgende Codebeispiel verwenden.
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 )
Der obige Code muss kopiert und in Ihren Browser und zurück in Ihre Konsole eingefügt werden. Wenn Sie einen Teil dieser manuellen Arbeit entfernen möchten, können Sie die Hilfsklasse GetAuthCodeServer
verwenden. Diese Hilfsklasse startet einen Webserver, sodass diese Methode nicht in allen Umgebungen verwendet werden kann.
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 )
Sobald Ihre App authentifiziert ist, sollten Sie Zugriff auf die OneDrive-API haben und können mit dem SDK Aufrufe tätigen.
Um mit der OneDrive-API zu interagieren, muss sich Ihre App für eine bestimmte Ressource authentifizieren. Ihre App muss zunächst den Resource Discovery-Helfer verwenden, um herauszufinden, auf welchen Dienst Sie zugreifen können. Anschließend können Sie einen Client erstellen, um auf diese Ressourcen zuzugreifen. Hierbei wird ein etwas anderer Authentifizierungsfluss als beim Standardcodefluss verwendet. Beachten Sie die Verwendung von redeem_refresh_token
mit der service_resource_id
des Dienstes, auf den Sie zugreifen möchten.
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 )
Hinweis: Bei allen Beispielen wird davon ausgegangen, dass Ihre App bereits authentifiziert wurde.
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 ()
Für asynchrone Vorgänge erstellen Sie eine asyncio.coroutine
, die asyncio.ascompleted
implementiert, und führen sie mit loop.run_until_complete
aus.
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 ))
Sie können Ihre OAuth-Sitzungsdetails speichern, sodass Sie nicht jedes Mal, wenn Sie Ihre App starten, den gesamten OAuth-Ablauf durchlaufen müssen. Gehen Sie dazu folgendermaßen vor:
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 )
Nach dem Aufruf von refresh_token()
ist Ihr AuthProvider
bereit, Aufrufe an die OneDrive-API zu authentifizieren. Diese Implementierung ist jedoch nicht vollständig.
Session
erneut implementieren, um den Anforderungen Ihrer App gerecht zu werden..load_session()
kann abhängig von Ihrer Implementierung von Session
eine Ausnahme auslösen. Beispielsweise versucht die Standardimplementierung, die Datei session.pickle
zu öffnen, die möglicherweise nicht vorhanden ist und FileNotFoundError
auslöst. Sie müssen dies hier berücksichtigen (oder, noch besser, bei Ihrer Implementierung von Session
). Wenn Sie Ihre Anfragen weiterleiten müssen, können Sie die Hilfsklasse HttpProviderWithProxy
verwenden.
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 )
Alle Anfragen, die diesen Client verwenden, werden per Proxy weitergeleitet.
Dieses Projekt hat den Microsoft Open Source Verhaltenskodex übernommen. Weitere Informationen finden Sie in den häufig gestellten Fragen zum Verhaltenskodex oder wenden Sie sich bei weiteren Fragen oder Kommentaren an [email protected].