2017-12-04 1 views
0

Ich erhalte die folgende Fehlermeldung zum Download:Keine Erlaubnis meiner Datei von Google Drive

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/XXXXXXXXXXXX?alt=media returned "The user has not granted the app 123456789 read access to the file XXXXXXXXXXXX."> 

Das ist ziemlich seltsam, da ich wie ich die OAuth Web-Authentifizierungsmethode unter Verwendung authentifiziert haben. Ich kann meine Dateien auch auflisten.

Google listet diesen Fehler hier auf: https://developers.google.com/drive/v3/web/handle-errors#403_the_user_has_not_granted_the_app_appid_verb_access_to_the_file_fileid und schlägt vor, dass ich den Benutzer auffordere, die Datei zu öffnen. Nun, der Benutzer ist ich und ich habe diese Datei etwa 20 mal ganz in Ordnung geöffnet. Der Fehler geht nicht weg ...

hier mein komplettes Beispiel ist:

import os 
import httplib2 
import io 
from oauth2client.file import Storage 
from apiclient.discovery import build 
from oauth2client.client import OAuth2WebServerFlow 
from googleapiclient.http import MediaIoBaseDownload 
location import Location 

CLIENT_ID = 'CLIENT ID XYXXYX' 
CLIENT_SECRET = 'YYYYYYYYYYYYYYY' 


OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive' 
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob' 
OUT_PATH = Location.folder_path + "media/dumps/" 
CREDS_FILE ='this_file_is_somewhere.json' 

storage = Storage(CREDS_FILE) 
credentials = storage.get() 

if credentials is None: 
    # Run through the OAuth flow and retrieve credentials 
    flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI) 
    authorize_url = flow.step1_get_authorize_url() 
    print('Go to the following link in your browser: ' + authorize_url) 
    code = raw_input('Enter verification code: ').strip() 
    credentials = flow.step2_exchange(code) 
    storage.put(credentials) 


# Create an httplib2.Http object and authorize it with our credentials 
http = httplib2.Http() 
http = credentials.authorize(http) 
drive_service = build('drive', 'v3', http=http) 

def list_files(service): 
    page_token = None 
    while True: 
     param = {} 
     if page_token: 
      param['pageToken'] = page_token 
     files = service.files().list(**param).execute() 
     for item in files['items']: 
      yield item 
     page_token = files.get('nextPageToken') 
     if not page_token: 
      break 


def download(file_id, path=OUT_PATH): 
    request = drive_service.files().get_media(fileId=file_id) 
    file_meta = drive_service.files().get(fileId=file_id).execute() 
    name = file_to_get['name'] 
    print(file_meta) 
    fh = io.BytesIO() 
    downloader = MediaIoBaseDownload(fh, request) 
    done = False 
    while done is False: 
     status, done = downloader.next_chunk() 
     print(int(status.progress() * 100)) 
    f = open(path + '/' + name, 'wb') 
    f.write(fh.getvalue()) 
    print('File downloaded at', path) 
    f.close() 


download('XXXXXXXXXXXX') 
+0

Obwohl ich nicht weiß, ob dies eine Lösung für Ihr Problem ist, wie wäre es mit dem Entfernen der Anmeldeinformationsdatei von '' this_file_is_somewhere.json'' und neu erstellen? – Tanaike

+0

Versuchen Sie [Öffnen Sie eine Auswahl] (https://developers.google.com/drive/v3/web/integrate-open#open_files_using_the_google_picker) und fordern Sie den Benutzer auf, die Datei zu öffnen, oder weisen Sie den Benutzer zu Drive, um die Datei zu öffnen mit der App. Sie können auch versuchen, [Berechtigungen bearbeiten] (https://developers.google.com/drive/v3/web/manage-sharing#manipulating_permissions) für diese Datei zu bearbeiten. – noogui

+0

@noogui Es scheint nicht so einfach zu verstehen, was ein "Picker" ist. Das habe ich schon verwirrend gefunden, als ich das in der Google-Dokumentation gelesen habe. Ich kann die Datei öffnen, es ist meine Datei. Es öffnet sich gut. Ich habe es auch anderen Personen in der Organisation zugänglich gemacht. – dengar81

Antwort

0

All durch @Tanaike:

einfach die Credential-Datei zu löschen und neu es, dieses Problem zu lösen.