Error 401 de carga resumible de la API de Python de Google Drive después de 2 horas

En primer lugar, lo siento si esta es una pregunta demasiado tonta … esta es la primera vez que bash usar alguna de las tecnologías involucradas en este script (Python, la unidad de disco duro, auth 2.0, etc.). Juro que he estado buscando e intentando esto durante aproximadamente una semana antes de publicar la pregunta. jejeje

Estoy tratando de usar el cliente google-api-python para cargar un archivo grande (3.5GiB) que está en un terminal solo Linux Debian. He tenido algún éxito al cargar archivos pequeños, pero cuando bash cargar el archivo grande, la carga se detiene aproximadamente 1 a 2 horas después de que se inició con el error HTTP 401 (no autorizado). He estado buscando cómo obtener un nuevo token de acceso, pero he tenido poco éxito.

Este es mi código ( actualizado ) hasta ahora:

#!/usr/bin/python import httplib2 import pprint import time from apiclient.discovery import build from apiclient.http import MediaFileUpload from apiclient import errors from oauth2client.client import OAuth2WebServerFlow # Copy your credentials from the APIs Console CLIENT_ID = 'myclientid' CLIENT_SECRET = 'myclientsecret' # Check https://developers.google.com/drive/scopes for all available scopes OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive' # Redirect URI for installed apps REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob' # 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) # Create an httplib2.Http object and authorize it with our credentials http = httplib2.Http() http = credentials.authorize(http) drive_service = build('drive', 'v2', http=http) # Insert a file media_body = MediaFileUpload('bigfile.zip', mimetype='application/octet-stream', chunksize=1024*256, resumble=True) body = { 'title': 'bigfile.zip', 'description': 'Big File', 'mimeType': 'application/octet-stream' } retries = 0 request = drive_service.files().insert(body=body, media_body=media_body) response = None while response is None: try: print http.request.credentials.access_token status, response = request.next_chunk() if status: print "Uploaded %.2f%%" % (status.progress() * 100) retries = 0 except errors.HttpError, e: if e.resp.status == 404: print "Error 404! Aborting." exit() else: if retries > 10: print "Retries limit exceeded! Aborting." exit() else: retries += 1 time.sleep(2**retries) print "Error (%d)... retrying." % e.resp.status continue print "Upload Complete!" 

Después de algunas excavaciones, descubrí que el objeto http autorizado actualiza automáticamente el token de acceso después de recibir 401. Aunque realmente está cambiando el token de acceso, aún no continúa la carga como se esperaba … vea la salida a continuación:

 ya29.AHES6ZTo_-0oDqwn3JnU2uCR2bRjpRGP0CSQSMHGr6KvgEE Uploaded 2.28% ya29.AHES6ZTo_-0oDqwn3JnU2uCR2bRjpRGP0CSQSMHGr6KvgEE Uploaded 2.29% ya29.AHES6ZTo_-0oDqwn3JnU2uCR2bRjpRGP0CSQSMHGr6KvgEE Uploaded 2.29% ya29.AHES6ZTo_-0oDqwn3JnU2uCR2bRjpRGP0CSQSMHGr6KvgEE Uploaded 2.30% ya29.AHES6ZTo_-0oDqwn3JnU2uCR2bRjpRGP0CSQSMHGr6KvgEE Error (401)... retrying. ya29.AHES6ZQqp3_qbWsTk4yVDdHnlwc_7GvPZiFIReDnhIIiHao Error (401)... retrying. ya29.AHES6ZSqx90ZOUKqDEP4AAfWCVgXZYT2vJAiLwKDRu87JOs Error (401)... retrying. ya29.AHES6ZTp0RZ6U5K5UdDom0gq3XHnyVS-2sVU9hILOrG4o3Y Error (401)... retrying. ya29.AHES6ZSR-IOiwJ_p_Dm-OnCanVIVhCZLs7H_pYLMGIap8W0 Error (401)... retrying. ya29.AHES6ZRnmM-YIZj4S8gvYBgC1M8oYy4Hv5VlcwRqgnZCOCE Error (401)... retrying. ya29.AHES6ZSF7Q7C3WQYuPAWrxvqbTRsipaVKhv_TfrD_gef1DE Error (401)... retrying. ya29.AHES6ZTsGzwIIprpPhCrqmoS3UkPsRzst5YHqL-zXJmz6Ak Error (401)... retrying. ya29.AHES6ZSS_1ZBiQJvZG_7t5uW3alsy1piGe4-u2YDnwycVrI Error (401)... retrying. ya29.AHES6ZTLFbBS8mSFWQ9zK8cgbX8RPeLghPxkfiKY54hBB-0 Error (401)... retrying. ya29.AHES6ZQBeMWY50z6fWXvaCcd5_AJr_AYOuL2aiNKpK-mmyU Error (401)... retrying. ya29.AHES6ZTs2mYYSEyOqI_Ms4itKDx36t39Oc5RNZHkV4Dq49c Retries limit exceeded! Aborting. 

Estoy usando debian lenny con Python 2.5.2 instalado, e instalé ssl y google-api-python-client a través de pip install hace aproximadamente una semana.

Gracias de antemano por cualquier ayuda.

EDITAR: Al parecer, el problema no es con la api. Intenté el mismo código anterior, pero con dos archivos pequeños, con 1 hora entre ellos (system.sleep ()). La salida fue:

 ya29.AHES6ZRUssiLfuhqCP9Cu7C7LuhRV2rYzPldU27wiMJZWb8 Uploaded 66.89% ya29.AHES6ZRUssiLfuhqCP9Cu7C7LuhRV2rYzPldU27wiMJZWb8 Upload 1 Complete! ya29.AHES6ZRUssiLfuhqCP9Cu7C7LuhRV2rYzPldU27wiMJZWb8 Uploaded 57.62% ya29.AHES6ZQd3o1ciwXpNFImH3CK0-dJAtQba_oeIO9DDbIq154 Upload 2 Complete! 

Para la segunda carga, un nuevo token de acceso se utilizó con éxito. Entonces, ¿quizás la sesión reanudable está expirando después de algún tiempo o solo es válida para ese token de acceso específico?

Presenté un problema en el proyecto google-api-python-client y, según Joe Gregorio de google, el problema está en el backend:

“Este es un problema con el backend y no con la API o con su código. Como ha deducido, si la carga se prolonga demasiado, el access_token caduca y en ese punto no se puede continuar con la carga reanudable. corregir este problema ahora mismo, actualizaré este error una vez que el problema se solucione en el lado del servidor “.

Supongo que el problema es que, después del límite de 1 a 2 horas, su token de acceso a su base de datos remota caduca; cortando su conexión con el servidor remoto. Creo que lo que podrías hacer es mirar el manual de la API de tus hosts … Deberían tener algo sobre ‘tokens de actualización’ (te consiguen otro Token de acceso, nota que algunos hosts solo te permiten usar un token de actualización por sesión), si se les permite una cantidad ilimitada, puede usar una combinación de un temporizador y AJAX para seguir pidiendo más tokens de acceso.

De lo contrario, tendría que realizar una solicitud AJAX para otro token de autorización y cambiarlo por otro token de acceso cada hora. Eso suena como un proceso muy riguroso, pero creo que es la única manera si su token sigue expirando.

También solo en otra nota, ¿has probado otros métodos de carga? Si dijiste que la secuencia de comandos anterior se ejecutó durante 1-2 horas y solo se cargó el 1.44% del archivo, lo que podría demorar más de 100 horas en cargarse (demasiado tiempo para solo 3 Gigs).