谷歌驱动的Python API可恢复上传错误401后2小时(Google Drive Python

2019-07-18 02:54发布

首先,我很抱歉,如果这是个太傻的问题......这是我第一次尝试使用任何参与这个脚本(Python中,驱动器API,OAuth 2.0用户等)的技术。 我发誓,我一直在寻找,并张贴问题之前尝试这一个星期左右。 呵呵呵

我试图使用谷歌的API的Python客户端上传文件大(3.5GiB)这是一个终端仅适用于Linux的Debian上。 我已经有一些成功上传小文件,但是当我尝试上传文件大,上传站约1〜2小时后,它开始与HTTP 401错误(未经授权)。 我一直在寻找如何获得新的访问令牌,但都收效甚微。

这是我的( 更新 )到目前为止的代码:

#!/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, resumable=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!"

一些挖后,我发现授权HTTP对象接收401虽然它真的改变了访问令牌,它仍然没有继续如预期上传......看到下面的输出后,自动刷新访问令牌:

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.

我使用Debian的lenny安装的Python 2.5.2,并安装了SSL和谷歌API的Python客户端通过PIP安装大约一个星期前。

在此先感谢您的帮助。

编辑:显然,这个问题是不是与API。 我尝试了相同的代码之上,但是有两个小文件,它们之间1H(system.sleep())。 输出是:

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

对于第二上传,新的访问令牌被成功地使用。 所以,也许可恢复会话一段时间后到期或只适用于特定访问令牌?

Answer 1:

我提交了关于谷歌的-API的Python客户端项目的问题 ,并根据从谷歌乔格雷戈里奥,问题是在后端:

“这是与后端,而不是使用API​​或与您的代码的问题。当你推断,如果上传去过长到期的access_token,在这一点上,继续上传无法继续。有进展工作现在解决这个问题,一旦问题被固定在服务器端我会更新这个bug“。



Answer 2:

我认为问题是,1-2小时后,限制你的访问令牌到远程数据库届满; 切断与远程服务器的连接。 我想你可以做的是看你的主机API手册什么......他们应该在那里有关于“刷新令牌”的东西(他们让你一个访问令牌,注意某些主机只允许您使用每个会话一个刷新令牌),如果他们被允许无限量的,你可以使用计时器和AJAX的组合来继续要求更多的访问令牌。

如果没有,那么你将有一个让另一个授权令牌的AJAX请求和交换,每一个小时,一个访问令牌。 这听起来像一个非常严谨的过程,但我认为这是唯一的方法,如果您的令牌不断到期。

也只是在另一方面你试过上载其它方法吗? 如果说上面的脚本运行1-2小时,只上传了可能需要100个小时,充分上传(太长了只有3演出)文件的1.44%。



文章来源: Google Drive Python API resumable upload error 401 after 2 hours