0

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
Linda Lawton - DaImTo
  • 106,405
  • 32
  • 180
  • 449
r1299597
  • 609
  • 3
  • 10
  • 20

1 Answers1

0

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

Linda Lawton - DaImTo
  • 106,405
  • 32
  • 180
  • 449