156 lines
5.9 KiB
Python
156 lines
5.9 KiB
Python
|
import requests
|
||
|
import json
|
||
|
import urllib
|
||
|
import os
|
||
|
from getpass import getpass
|
||
|
import time
|
||
|
from datetime import datetime
|
||
|
|
||
|
#list files
|
||
|
def list_files():
|
||
|
response = requests.get(URL + 'me/drive/root/children', headers=HEADERS)
|
||
|
if response.status_code == 200:
|
||
|
files = json.loads(response.text)['value']
|
||
|
for file in files:
|
||
|
print(file['name'])
|
||
|
else:
|
||
|
print('Error fetching file list.')
|
||
|
|
||
|
#delete a file
|
||
|
def delete_file(filename):
|
||
|
response = requests.delete(URL + f'me/drive/root:/{filename}', headers=HEADERS)
|
||
|
if response.status_code == 204:
|
||
|
print(f'{filename} deleted successfully.')
|
||
|
else:
|
||
|
print(f'Error deleting {filename}.')
|
||
|
|
||
|
|
||
|
|
||
|
#delete files by a portion of their name
|
||
|
def delete_files_by_name_in_folder(folder_id, name_portion):
|
||
|
response = requests.get(URL + f'me/drive/items/{folder_id}/children', headers=HEADERS)
|
||
|
if response.status_code == 200:
|
||
|
items = json.loads(response.text)['value']
|
||
|
deleted_count = 0
|
||
|
for item in items:
|
||
|
if name_portion in item['name'] and item['file']:
|
||
|
response = requests.delete(URL + f"me/drive/items/{item['id']}", headers=HEADERS)
|
||
|
if response.status_code == 204:
|
||
|
print(f"{item['name']} deleted successfully.")
|
||
|
deleted_count += 1
|
||
|
else:
|
||
|
print(f"Error deleting {item['name']}.")
|
||
|
elif 'folder' in item:
|
||
|
delete_files_by_name_in_folder(item['id'], name_portion)
|
||
|
if deleted_count == 0:
|
||
|
print(f"No files with '{name_portion}' in their name found in this folder.")
|
||
|
else:
|
||
|
print('Error fetching item list.')
|
||
|
|
||
|
# Get folder IDs and names within a specific folder
|
||
|
def get_folder_ids_and_names(folder_id):
|
||
|
response = requests.get(URL + f'me/drive/items/{folder_id}/children', headers=HEADERS)
|
||
|
if response.status_code == 200:
|
||
|
items = json.loads(response.text)['value']
|
||
|
folders = {}
|
||
|
for item in items:
|
||
|
if 'folder' in item:
|
||
|
folders[item['name']] = item['id']
|
||
|
return folders
|
||
|
else:
|
||
|
print('Error fetching folder list.')
|
||
|
|
||
|
# Delete files by a portion of their name
|
||
|
def delete_files_by_name(name_portion):
|
||
|
response = requests.get(URL + 'me/drive/items/root/children', headers=HEADERS)
|
||
|
if response.status_code == 200:
|
||
|
items = json.loads(response.text)['value']
|
||
|
deleted_count = 0
|
||
|
for item in items:
|
||
|
if name_portion in item['name'] and item['file']:
|
||
|
response = requests.delete(URL + f"me/drive/items/{item['id']}", headers=HEADERS)
|
||
|
if response.status_code == 204:
|
||
|
print(f"{item['name']} deleted successfully.")
|
||
|
deleted_count += 1
|
||
|
else:
|
||
|
print(f"Error deleting {item['name']}.")
|
||
|
if deleted_count == 0:
|
||
|
print(f"No files with '{name_portion}' in their name found.")
|
||
|
else:
|
||
|
print('Error fetching item list.')
|
||
|
|
||
|
# Call this function to start the process of deleting files within folders and subfolders based on name portion
|
||
|
def delete_files_in_all_folders():
|
||
|
name_portion = input("Enter the portion of the filename to delete: ")
|
||
|
|
||
|
root_folders = get_folder_ids_and_names('root')
|
||
|
if root_folders:
|
||
|
print("Available folders:")
|
||
|
for name, folder_id in root_folders.items():
|
||
|
print(f"{name}: {folder_id}")
|
||
|
|
||
|
selected_folder_name = input("Enter the name of the folder to start deletion from: ")
|
||
|
selected_folder_id = root_folders.get(selected_folder_name)
|
||
|
if selected_folder_id:
|
||
|
delete_files_by_name_in_folder(selected_folder_id, name_portion)
|
||
|
print('Deletion process completed.')
|
||
|
else:
|
||
|
print("Invalid folder name.")
|
||
|
else:
|
||
|
print("No folders found.")
|
||
|
|
||
|
URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'
|
||
|
client_id = "CLIENT_ID"
|
||
|
permissions = ['files.readwrite']
|
||
|
response_type = 'token'
|
||
|
redirect_uri = 'https://localhost:8000/'
|
||
|
scope = ''
|
||
|
for items in range(len(permissions)):
|
||
|
scope = scope + permissions[items]
|
||
|
if items < len(permissions)-1:
|
||
|
scope = scope + '+'
|
||
|
|
||
|
print('Click over this link ' +URL + '?client_id=' + client_id + '&scope=' + scope + '&response_type=' + response_type+\
|
||
|
'&redirect_uri=' + urllib.parse.quote(redirect_uri))
|
||
|
print('Sign in to your account, copy the whole redirected URL.')
|
||
|
code = input("Paste the URL here :")
|
||
|
token = code[(code.find('access_token') + len('access_token') + 1) : (code.find('&token_type'))]
|
||
|
URL = 'https://graph.microsoft.com/v1.0/'
|
||
|
HEADERS = {'Authorization': 'Bearer ' + token}
|
||
|
response = requests.get(URL + 'me/drive/', headers=HEADERS)
|
||
|
if response.status_code == 200:
|
||
|
response = json.loads(response.text)
|
||
|
print('Connected to the OneDrive of', response['owner']['user']['displayName']+' (',response['driveType']+' ).', \
|
||
|
'\nConnection valid for one hour. Reauthenticate if required.')
|
||
|
|
||
|
while True:
|
||
|
print('\nCRUD Menu:')
|
||
|
print('1. List Files')
|
||
|
print('2. Delete File by Name')
|
||
|
print('3. Delete Files by Name Portion')
|
||
|
print('4. Delete Files in All Folders')
|
||
|
print('5. Exit')
|
||
|
|
||
|
choice = input('Enter your choice: ')
|
||
|
|
||
|
if choice == '1':
|
||
|
list_files()
|
||
|
elif choice == '2':
|
||
|
filename = input('Enter the filename to delete: ')
|
||
|
delete_file(filename)
|
||
|
elif choice == '3':
|
||
|
name_portion = input("Enter the portion of the filename to delete: ")
|
||
|
delete_files_by_name(name_portion)
|
||
|
elif choice == '4':
|
||
|
delete_files_in_all_folders()
|
||
|
elif choice == '5':
|
||
|
print('Exiting...')
|
||
|
break
|
||
|
else:
|
||
|
print('Invalid choice. Please choose again.')
|
||
|
|
||
|
else:
|
||
|
response_data = json.loads(response.text)
|
||
|
print('API Error! : ', response_data['error']['code'],\
|
||
|
'\nSee response for more details.')
|