Skip to main content

Perform simple tasks on Onedrive through the Graph API.

Project description

Graph Onedrive

Interact with Microsoft OneDrive using the Graph API through an object.

License

This project itself is subject to BSD 3-Clause License detailed in LICENSE.

The Graph API is provided by Microsoft Corporation and subject to their terms of use.

Installation

General installation is using pip from PyPI, but depending on your installation you may need to use pip3 instead.

pip install graph-onedrive

You can also install the in-development version:

pip install https://github.com/dariobauer/graph-onedrive/archive/master.zip

Documentation

Authentication

Before the package can interact with the Graph API, it must first create an authenticated session with the Microsoft identity platform.

The Graph API operates securely through each request having an accompanying bearer token containing an "access token". These tokens are used to verify a session has been authenticated. The package generates these access tokens on your behalf, acting as a native OAuth client.

For this process to work, you must configure the OAuth client.

Step 1: Create an Azure app

To interact with the Graph API, an app needs to be registered through the Azure portal. Detailed documentation on how to do this is available directly from Microsoft.

Setup Option Description
Supported account types This is related to the tenant described in the next section. Essentially the more restrictive, the easier it is to get the app registered.
Redirect URI It is recommended this is left as Web to http://localhost.

Step 2: Obtain authentication details

You need to obtain your registered app's authentication details from the Azure portal to use in the package for authentication.

Parameter Location within Azure Portal Description
Directory (tenant) ID App registrations > your app name > Overview The tenant is used to restrict an app to certain accounts. common allows both personal Microsoft accounts as well as work/school accounts to use the app. organizations, and consumers each only allow these account types. All of these types are known as multi-tenant and require more security processes be passed to ensure that you are a legitimate developer. On the contrary, single-tenant apps restrict the app to only one work/school account (i.e. typically one company) and therefore have far fewer security requirements. Single tenants are either a GUID or domain. Refer to the Azure docs for details.
Application (client) ID App registrations > your app name > Overview The application ID that's assigned to your app. You can find this information in the portal where you registered your app. Note that this is not the client secret id but the id of the app itself.
Client secret value App registrations > your app name > Certificates & secrets The client secret that you generated for your app in the app registration portal. Note that this allows you to set an expiry and should be checked if your app stops working. The client secret is hidden after the initial generation so it is important to copy it and keep it secure.

WARNING: The client secret presents a security risk if exposed. It is recommended to revoke the client secret immediately if it becomes exposed.

Step 3: Use the package to authenticate

a) Authenticate at the time of instance initialization

The easiest option is to just create an instance which will guide you through the authentication at the time of creating the instance. This is possible if you are running the script in the command line.

b) Generate a config file ahead of time

Create a config file before creating the instance is useful if your production code will not be run in a terminal.

You can preemptively create a config file using the command-line:

graph-onedrive auth

Creating an instance

Step 1: Import the package

Ensure the package is installed, refer to the installation section above.

import graph_onedrive

Step 2: Create an instance

At the instance creation stage you must provide the authentication configuration.

The configuration can be either set within your code or a configuration file. It is recommended that you use the config file option and helper functions are provided to make this easier.

a) Using a config file (recommended)

The configuration file can be created for you using the command-line tool which will also authenticate at the same time. This is highly recommended:

graph-onedrive auth

Alternatively, create a json file containing the following information:

{
    "onedrive": {
        "tenant_id": "",
        "client_id": "",
        "redirect_url": "http://localhost:8080",
        "client_secret_value": ""
        }
    }
}

Then create an instance of the Onedrive class:

config_path = ""  # path to config.json
my_instance = graph_onedrive.create_from_config_file(config_path)

Note that the onedrive dictionary key can be any string that is specified when creating the instance create_from_config_file(config_path, config_key = "onedrive"). This could facilitate multiple instances running from the same configuration file.

b) Using a set in-script config

This solution is slightly easier but could be a security issue, especially if sharing code.

client_id = ""
client_secret_value = ""
tenant = ""
redirect_url = "http://localhost:8080",
my_instance = graph_onedrive.create(client_id, client_secret_value, tenant, redirect_url)

Using refresh tokens

Access tokens used to authenticate each request directly by the Graph API, without having to re-authenticate each time with the authentication server which speeds up requests. However due to security, these tokens typically expire after one hour. To avoid having to have the user re-authorize the app with their account, refresh tokens are used instead. This process of refreshing access tokens in managed automatically by the package, however if the script ends, then the instance information is lost.

To use the refresh token to create a new instance (e.g. after running the script again), you can save the refresh token and provide it at the time of instance initiation.

WARNING: Saving the refresh token presents a security risk as it could be used by anyone with it exchange it for an access token. If a refresh token is exposed, it is recommended that the app client secret it revoked.

Obtaining the refresh token

a) Saving to a config file

If using a configuration file then you can have the helper functions save the refresh token to your configuration. Simply add the following call after your last API request.

graph_onedrive.save_to_config_file(my_instance, config_path)

Note if using a dictionary key other than onedrive, you can specify it when saving as save_to_config_file(... , config_key = "onedrive").

Then when creating the instance again using your config file, the refresh token will be used.

WARNING: This configuration assumes that your use of the configuration file serves one user only. If using the same code to serve multiple users then the refresh token must be stored independently of the configuration file.

b) Saving the token manually

You can get the refresh token from your instance:

refresh_token = my_instance.refresh_token

Then when creating an instance later, provide the refresh token:

my_instance = graph_onedrive.create(... , refresh_token = refresh_token)

Making requests to the Graph API

These requests to the Graph API are made using the instance of the Onedrive class that you have created.

get_usage

Get the current usage and capacity of the connected Onedrive.

used, capacity, units = my_instance.get_usage(unit, refresh, verbose)

Keyword arguments:

  • unit (str) -- unit to return value, either "b", "kb", "mb", "gb" (default = "gb")
  • refresh (bool) -- refresh the usage data (default = False)
  • verbose (bool) -- print the usage (default = False)

Returns:

  • used (float) -- storage used in unit requested
  • capacity (float) -- storage capacity in unit requested
  • units (str) -- unit of usage

list_directory

List the files and folders within the input folder/root of the connected Onedrive.

items = my_instance.list_directory(folder_id, verbose)

Keyword arguments:

  • folder_id (str) -- the item id of the folder to look into, None being the root directory (default = None)
  • verbose (bool) -- print the items along with their ids (default = False)

Returns:

  • items (dict) -- details of all the items within the requested directory

detail_item

Retrieves the metadata for an item.

item_details = my_instance.detail_item(item_id, verbose)

Positional arguments:

  • item_id (str) -- item id of the folder or file

Keyword arguments:

  • verbose (bool) -- print the main parts of the item metadata (default = False)

Returns:

  • items (dict) -- metadata of the requested item

make_folder

Creates a new folder within the input folder/root of the connected Onedrive.

folder_id = my_instance.make_folder(folder_name, parent_folder_id, check_existing, if_exists)

Positional arguments:

  • folder_name (str) -- the name of the new folder

Keyword arguments:

  • parent_folder_id (str) -- the item id of the parent folder, None being the root directory (default = None)
  • check_existing (bool) -- checks parent and returns folder_id if a matching folder already exists (default = True)
  • if_exists (str) -- if check_existing is set to False; action to take if the new folder already exists, either "fail", "replace", "rename" (default = "rename")

Returns:

  • folder_id (str) -- newly created folder item id

move_item

Moves an item (folder/file) within the connected Onedrive. Optionally rename an item at the same time.

item_id, folder_id = my_instance.move_item(item_id, new_folder_id, new_name)

Positional arguments:

  • item_id (str) -- item id of the folder or file to move
  • new_folder_id (str) -- item id of the folder to shift the item to

Keyword arguments:

  • new_name (str) -- optional new item name with extension (default = None)

Returns:

  • item_id (str) -- item id of the folder or file that was moved, should match input item id
  • folder_id (str) -- item id of the new parent folder, should match input folder id

copy_item

Copies an item (folder/file) within the connected Onedrive server-side.

item_id = my_instance.copy_item(item_id, new_folder_id, new_name, confirm_complete)

Positional arguments:

  • item_id (str) -- item id of the folder or file to copy
  • new_folder_id (str) -- item id of the folder to copy the item to
  • confirm_complete (bool) -- waits for the copy operation to finish before returning (default = False)

Keyword arguments:

  • new_name (str) -- optional new item name with extension (default = None)

Returns:

  • item_id (str) -- item id of the new item

rename_item

Renames an item (folder/file) without moving it within the connected Onedrive.

item_name = my_instance.rename_item(item_id, new_name)

Positional arguments:

  • item_id (str) -- item id of the folder or file to rename
  • new_name (str) -- new item name with extension

Returns:

  • item_name (str) -- new name of the folder or file that was renamed

delete_item

Deletes an item (folder/file) within the connected Onedrive. Potentially recoverable in the Onedrive web browser client.

confirmation = my_instance.delete_item(item_id, pre_confirm)

Positional arguments:

  • item_id (str) -- item id of the folder or file to be deleted

Keyword arguments:

  • pre_confirm (bool) -- confirm that you want to delete the file and not show the warning (default = False)

Returns:

  • confirmation (bool) -- True if item was deleted successfully

download_file

Downloads the file to the current working directory. Note folders cannot be downloaded.

Future development improvement: specify the file location and name.

file_name = my_instance.download_file(item_id)

Positional arguments:

  • item_id (str) -- item id of the file to be deleted

Returns:

  • file_name (str) -- returns the name of the file including extension

upload_file

Uploads a file to a particular folder with a provided file name.

item_id = my_instance.upload_file(file_path, new_file_name, parent_folder_id, if_exists)

Positional arguments:

  • file_path (str|Path) -- path of the file on the drive

Keyword arguments:

  • new_file_name (str) -- new name of the file as it should appear on Onedrive, without extension (default = None)
  • parent_folder_id (str) -- item id of the folder to put the file within, if None then root (default = None)
  • if_exists (str) -- action to take if the new folder already exists, either "fail", "replace", "rename" (default = "rename")

Returns:

  • item_id (str) -- item id of the newly uploaded file

Examples

Examples are provided to aid in development: https://github.com/dariobauer/graph-onedrive/blob/main/examples/

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

graph_onedrive-0.0.1a1.tar.gz (21.4 kB view details)

Uploaded Source

Built Distribution

graph_onedrive-0.0.1a1-py2.py3-none-any.whl (18.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file graph_onedrive-0.0.1a1.tar.gz.

File metadata

  • Download URL: graph_onedrive-0.0.1a1.tar.gz
  • Upload date:
  • Size: 21.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for graph_onedrive-0.0.1a1.tar.gz
Algorithm Hash digest
SHA256 0efd4eddf06885901b469507fae57f8b22bd9ae08755e14a42b52bf3a4573585
MD5 f37984c2336966fcb72ca1645741b3f2
BLAKE2b-256 39e18aabaa4628315779ec2ba60513c753236a5a223673e67b03fadc090c0db6

See more details on using hashes here.

File details

Details for the file graph_onedrive-0.0.1a1-py2.py3-none-any.whl.

File metadata

  • Download URL: graph_onedrive-0.0.1a1-py2.py3-none-any.whl
  • Upload date:
  • Size: 18.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for graph_onedrive-0.0.1a1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 2ef69abe0dcbc4bcccd96b380c8904e7a4548536e88977f66ab5a42805268080
MD5 58de5a0e066aab7916800e1503ac4720
BLAKE2b-256 d83e6ac3cce4e4b32310554fa8bcda7a5da4e484f68bac54c0370861128e38ed

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page