Search code examples
pythongoogle-apigoogle-drive-apigoogle-api-python-clientpydrive

PyDrive copy file This file cannot be copied by the authenticated user(Python)


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

Solution

  • 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