当前位置: 首页 > 知识库问答 >
问题:

如何断开Gmail API服务实例?

翟志新
2023-03-14
    def gmailAPIInitialize(self): 
    try: 
        self.waitForInternet()
        logging.info("Initializing the Gmail API Service")
        creds = None
        # The file token.pickle stores the user's access and refresh tokens, and is
        # created automatically when the authorization flow completes for the first
        # time.
        if os.path.exists('token.pickle'):
            with open('token.pickle', 'rb') as token:
                creds = pickle.load(token)
        # If there are no (valid) credentials available, let the user log in.
        if not creds or not creds.valid:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request())
                with open('token.pickle', 'wb') as token:
                    pickle.dump(creds, token)
            else:
                logging.error("Unable to find token.pickle file to initialize Gmail Service. Please provide 'token.pickle' file in current directory")
                sys.exit(-1)
                #flow = InstalledAppFlow.from_client_secrets_file(
                    #'credentials.json', SCOPES)
                #creds = flow.run_local_server(port=0)
            # Save the credentials for the next run
        service = build('gmail', 'v1', credentials=creds, cache_discovery=False)
        self.gmailAPIService  = service 
        logging.info("Successfully initialized the Gmail API Service")
        return True
    except: 
        logging.error("An error was encountered while attempting to initialize the Gmail API")
        tb = traceback.format_exc()
        logging.exception(tb)
        return False
currentTime =  datetime.datetime.now()
            if  currentTime > nextRefresh:
                logging.info("Refreshing Gmail Connection")
                nextRefresh = currentTime + timeDeltaResult
                reinitalized = self.gmailAPIInitialize()
                if reinitalized is True: 
                    logging.error("Successfully Refreshed Gmail connection")
                else:
                    logging.error("Failed to Refresh Gmail connection")
                logging.info("Next Refresh time is at (" + nextRefresh.strftime("%d %b %Y %H:%M:%S") +")")
                
       #RUN MY CALLS AS USUAL TO GMAIL SERVICE

共有1个答案

颛孙国源
2023-03-14
  • socket.timeout在等待响应的单个数据包时超过超时窗口时会出现错误。
  • 为了保持连接打开,您需要使用服务帐户。

当在实际接收数据包之前超过接收预期的新数据包之前的时间时,就会出现套接字超时错误。由于这只发生在开放/连续连接,如果您没有足够频繁地向Gmail API发出请求,那么这很可能是错误的来源。我不确定这是多久一次,但鉴于您的刷新是每6个小时,我希望这是长于令牌的寿命。

您建立的到服务器的连接将为您提供一个授权令牌,该令牌在需要续订之前具有有限的寿命。但是,您收到的刷新令牌在某些情况下可能会过期,例如,如果您有多个应用程序实例并行运行。

和:

请求离线访问是任何需要在用户不在场时访问Google API的应用程序的一个要求。例如,在预定时间执行备份服务或执行操作的应用程序需要能够在用户不在场时刷新其访问令牌

因此,为了保持刷新令牌的有效性,在调用授权流时,需要将access_type关键字参数设置为offline

authorization_url, state = flow.authorization_url(
    # Enable offline access so that you can refresh an access token without
    # re-prompting the user for permission. Recommended for web server apps.
    access_type='offline',
    # Enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true')
  • 了解服务帐户云IAM文档
  • 服务帐户云IAM文档
  • 将OAuth2用于Web服务器应用程序
    • 刷新访问令牌(脱机访问)

    >

  • ConnectionTimeout与SocketTimeout
  • 谷歌API:如何延长访问令牌的有效期?

    如何在Python中使用服务帐户对谷歌云进行身份验证?

 类似资料:
  • 启动mysql服务: sudo service mysql start 停止mysql服务: sudo service mysql stop 要连接到服务器,我们通常需要提供MySQL的用户名来触发mysql,很可能,还需要密码。如果你的服务器运行在一个其他的机器上,你还需要指定主机名。联系管理员来找到连接参数(例如主机名,用户名和密码),当你知道了正确的参数后,你可以像下面那样连接: she

  • 我和Jetty一起使用“Spring-Boot-Starter-Web”。在我启动应用程序之后,我能够调用rest函数。有没有什么方法可以直接访问Jetty实例,或者在Jetty启动后连接服务器/servlet上下文?

  • 为了连接服务器,当调用mysql时,通常需要提供一个MySQL用户名并且很可能需要一个密码。如果服务器运行在登录服务器之外的其它机器上,还需要指定主机名。联系管理员以找出进行连接所使用的参数 (即,连接的主机、用户名和使用的密码)。知道正确的参数后,可以按照以下方式进行连接: shell> mysql -h host -u user -p Enter password: ******** host

  • 我正在制作满足以下条件的Netty服务器: null 在我的情况下,既没有发生“通道不活动”事件,也没有发生“连接被对等方重置”异常。 这是我使用的Netty测试客户端代码的部分。 如何在要回复时注意到断开连接?

  • 我在 EC2 实例上运行 的 CherryPy Web 服务器。 我可以通过EC2机器上的本地连接到Web服务器,但我无法从自己的远程机器访问实例(我通过ssh连接到EC2)。 我需要打开端口8787才能远程访问web服务器吗?如果是这样,如何做到这一点?另外,我可以为此使用EC2实例的公共IP吗?

  • 我正在开发一个与许多客户端连接的服务器。我需要知道客户端何时与服务器断开连接。因此,每个客户端都向服务器发送一个特定的字符。如果两秒钟后没有收到字符,那么我应该断开服务器与客户端的连接(释放为此客户端分配的资源)。 这是我的服务器的主要代码: 第一个问题是,我用来识别在线客户端的方式(每秒发送特定消息)是否是一种好方法? 如果它是好的,我如何使用检测与女巫客户端相关,然后如何断开密钥与服务器的连接