Python용 OneDrive SDK를 다운로드한 후 명령 프롬프트를 열고 다음을 입력하여 설치합니다.
pip install onedrivesdk
다음으로, 다음을 추가하여 Python 프로젝트에 SDK를 포함합니다.
import onedrivesdk
OneDrive API와 상호 작용하려면 앱이 인증되어야 합니다. 다음 코드 샘플을 사용하여 이를 수행할 수 있습니다.
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 )
앱이 인증되면 OneDrive API에 액세스할 수 있어야 하며 SDK를 사용하여 호출을 시작할 수 있습니다.
OneDrive API와 상호 작용하려면 앱이 특정 리소스에 대해 인증해야 합니다. 앱은 먼저 Resource Discovery 도우미를 사용하여 액세스할 수 있는 서비스를 찾아야 합니다. 그런 다음 클라이언트를 구축하여 해당 리소스에 액세스할 수 있습니다. 이는 표준 코드 흐름과 약간 다른 인증 흐름을 사용합니다. 액세스하려는 서비스의 service_resource_id
와 함께 redeem_refresh_token
을 사용하는 점에 유의하세요.
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.ascompleted
구현하는 asyncio.coroutine
을 만들고 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
는 OneDrive API에 대한 호출을 인증할 준비가 됩니다. 하지만 이 구현은 완전하지 않습니다.
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 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 행동 강령 FAQ를 참조하거나 추가 질문이나 의견이 있는 경우 [email protected]으로 문의하세요.