2015-07-13 76 views
0

我在GMail API上运行了许多任务,并且遇到了与this issue中描述的相同的错误。要解决它,我想实施建议的解决方案。不过,我不知道如何将其应用于我的代码。GAE上的Gmail API:正确使用discovery.build_from_document()

我的代码目前看起来如下:

class getLatest(webapp2.RequestHandler): 
    def post(self): 
    try: 
     email = self.request.get('email') 
     g = Credentials.get_by_id(email) 
     REFRESH_TOKEN = g.refresh_token 
     start_history_id = g.hid 

     credentials = OAuth2Credentials(None, settings.CLIENT_ID, 
         settings.CLIENT_SECRET, REFRESH_TOKEN, None, 
         GOOGLE_TOKEN_URI, None, 
         revoke_uri=GOOGLE_REVOKE_URI, 
         id_token=None, 
         token_response=None) 

     http = credentials.authorize(httplib2.Http()) 
     service = discovery.build("gmail", "v1", http=http) 
     for n in range(0, 5): 
     try: 
      history = service.users().history().list(userId=email, startHistoryId=start_history_id).execute(http=http) 
      break 
     except errors.HttpError, e: 
      if n < 4: 
      time.sleep((2 ** n) + random.randint(0, 1000)/1000) 
      else: 
      raise 
     changes = history['history'] if 'history' in history else [] 
     while 'nextPageToken' in history: 
     page_token = history['nextPageToken'] 
     for n in range(0, 5): 
      try: 
      history = service.users().history().list(userId=email, startHistoryId=start_history_id, pageToken=page_token).execute(http=http) 
      break 
      except errors.HttpError, e: 
      if n < 4: 
       time.sleep((2 ** n) + random.randint(0, 1000)/1000) 
      else: 
       raise 
     changes.extend(history['history']) 

    except errors.HttpError, error: 
     logging.exception('An error occurred: '+str(error)) 
     if error.resp.status == 401: 
      # Credentials have been revoked. 
      # TODO: Redirect the user to the authorization URL. 
      raise NotImplementedError() 
     else: 
      stacktrace = traceback.format_exc() 
      logging.exception('%s', stacktrace) 

现在我应该在时间运行在某一时刻下面的代码:

resp, content = h.request('https://www.googleapis.com/discovery/v1/apis/analytics/v3/rest?quotaUser=the_name_of_your_app_goes_here') 

然后保存该值在数据存储的内容。这个问题解释了这不是用户绑定的,但是我不清楚我是否应该运行一次并将值存储到永久,或者在某些时候刷新它。

此外,由于我处理授权有点不同,我感觉我会遇到问题,如果我以完全相同的方式实施它。因为当我建立服务时,我实际上在呼叫中添加凭证:

http = credentials.authorize(httplib2.Http()) 
service = discovery.build("gmail", "v1", http=http) 

回答

0

原来,这是非常简单的。我加了以下功能:

def get_discovery_content(): 
    content = memcache.get('gmail_discovery') 
    if content is not None: 
    return content 
    else: 
    h = httplib2.Http() 
    for n in range(0, 5): 
     resp, content = h.request('https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest?quotaUser=replimeapp') 
     if resp.status == 200: 
     memcache.add('gmail_discovery', content, 86400) 
     return content 

然后我换成这一行:

service = discovery.build("gmail", "v1", http=http) 

通过这样的:

content = get_discovery_content() 
service = discovery.build_from_document(content) 

就像一个魅力至今。