Sorry for my english. I try copy files to another folder. But i have error:
googleapiclient.errors.HttpError: https://www.googleapis.com/drive/v2/files/1yH7LZ54uaiOl4T0J5UoJ9zb30cVKtW19/copy?alt=json returned "This file cannot be copied by the authenticated user.">
my code:
parent_folder = 'sdadasdasdasdasd23123123123-9'
drive = DriveBox()
list_files = drive.list_files_from_parent_folder(parent_folder)
new_folder = drive.create_folder("228", parent_folder)
for file in list_files:
drive.g_drive.auth.service.files().copy(fileId=file['id'],
body={"parents": [{"kind": "drive#fileLink",
"id": new_folder['id']}], 'title': file['title']})\
.execute()
class DriveBox:
class DriveBox:
g_drive = None
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
gauth = GoogleAuth()
try:
gauth.CommandLineAuth()
except (AuthenticationError, RefreshError) as e:
print(e)
cls.g_drive = GoogleDrive(gauth)
cls.instance = super(DriveBox, cls).__new__(cls)
return cls.instance
my settings.yaml
client_config_backend: settings
client_config:
client_id: 1111111111111111
client_secret: 1111111111111111
save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json
get_refresh_token: True
oauth_scope:
- https://www.googleapis.com/auth/drive
- https://www.googleapis.com/auth/drive.file
- https://www.googleapis.com/auth/drive.install
- https://www.googleapis.com/auth/drive.appfolder
- https://www.googleapis.com/auth/drive.metadata
This file cannot be copied by the authenticated user.
Means exactly that. You are trying to open a private file owned by a user without authenticating the user first.
I suggest you go though the Drive tutorial and see how the authentication process should be accomplished Python quickstart
def get_credentials():
"""Gets valid user credentials from storage.
If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.
Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir,
'drive-python-quickstart.json')
store = Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = tools.run(flow, store)
print('Storing credentials to ' + credential_path)
return credentials
Side note: be reasonable with the scopes you are requesting https://www.googleapis.com/auth/drive
will give you access to everything already doubling up is pointless