2012-07-31 25 views
5

Estoy tratando de obtener una lista de los archivos en mi Google Drive usando una aplicación de escritorio. El código es el siguiente:No se enumeran los archivos de Google Drive en la solicitud de Drive API

def main(argv): 

    storage = Storage('drive.dat') 
    credentials = storage.get() 

    if credentials is None or credentials.invalid: 
     credentials = run(FLOW, storage) 

    # Create an httplib2.Http object to handle our HTTP requests and authorize it 
    # with our good Credentials. 
    http = httplib2.Http() 
    http = credentials.authorize(http) 

    service = build("drive", "v2", http=http) 
    retrieve_all_files(service) 

Luego, en retrieve_all_files, que imprima los archivos:

param = {} 
if page_token: 
    param['pageToken'] = page_token 
    files = service.files().list(**param).execute() 
    print files 

Pero después de un autentico a mi cuenta, la lista de archivos impresa tiene ningún elemento. ¿Alguien tiene un problema similar o conoce una solución para esto?

+0

¿Puede pegar la totalidad de retrieve_all_files? Parece una función útil. –

+0

@ AliAfshar, puede encontrarlo aquí: https://developers.google.com/drive/v2/reference/files/list –

Respuesta

7

Por favor, corríjanme si me equivoco, pero creo que está utilizando el alcance https://www.googleapis.com/auth/drive.file, que sólo devuelve los archivos que su aplicación se ha creado o se han abierto de forma explícita con su aplicación utilizando el Google Drive UI o la Picker API.

Para recuperar todos los archivos, necesitará usar el alcance más amplio: https://www.googleapis.com/auth/drive.

Para obtener más información sobre los diferentes ámbitos, consulte el documentation.

+0

He intentado su sugerencia pero todavía no hay contenido en la lista devuelta ... –

+1

Es la fuente disponible en cualquier lugar para que podamos tener la oportunidad de tratar de reproducir? Asegúrese de eliminar 'drive.dat' cuando cambie el alcance, ya que podría usar un token antiguo que no haya sido aprobado para un alcance más amplio. – Alain

+0

Gracias, está funcionando ahora ~ –

0

Por un lado, debe recorrer iterativo a través de page_token para obtener todos los contenidos de My Drive y de todas las subcarpetas. Hay algunas otras cosas que podrían ser como no proporcionar una consulta, etc. Pruebe esto:

def retrieve_all_files(service): 
    """ RETURNS a list of files, where each file is a dictionary containing 
     keys: [name, id, parents] 
    """ 

    query = "trashed=false" 

    page_token = None 
    L = [] 

    while True: 
     response = service.files().list(q=query, 
              spaces='drive', 
              fields='nextPageToken, files(id, name, parents)', 
              pageToken=page_token).execute() 
     for file in response.get('files', []): # The second argument is the default 
      L.append({"name":file.get('name'), "id":file.get('id'), "parents":file.get('parents')}) 

     page_token = response.get('nextPageToken', None) # The second argument is the default 

     if page_token is None: # The base My Drive folder has None 
      break 

    return L 
Cuestiones relacionadas