我有Python脚本,它通过 IMAP 创建到 GMail 邮箱的代理。此代理将身份验证令牌添加到请求。最终用户运行此脚本,然后使用一些工具从邮箱下载所有用户电子邮件。当然,这个与代理和代理连接的工具使所有的身份验证变得神奇。
我目前的解决方案仅适用于小型邮箱。当我们想从大邮箱下载所有邮件时,我们会收到认证错误。身份验证错误与令牌过期有关。身份验证令牌仅在一小时内有效。之后服务器返回错误并关闭连接。
这个剧本不是我写的。我从某人那里收到了它,我必须修复这个错误。在这个脚本中,我使用Twisted 引擎(Twisted 代码示例)。
让我展示一些源代码。下面你可以看到 Proxy 类的两个主要方法:
def dataReceived(self, data):
if OPTIONS.verbose:
print "> " + data
#send raw data
Proxy.dataReceived(self,data)
def lineReceived(self, line):
if self.logged_in:
self.setRawMode()
self.peer.setRawMode()
Proxy.lineReceived(self,line)
else:
login_match = self.factory.login_re.match(line)
if login_match != None:
#Create token and send it
consumer = OAuthEntity(self.domain, self.secret)
xoauth_string = GenerateXOauthString(consumer, self.email_address)
xoauth_b64 = base64.b64encode(xoauth_string)
line = login_match.groups()[0] + " AUTHENTICATE XOAUTH " + xoauth_b64
Proxy.lineReceived(self,line)
else:
Proxy.lineReceived(self,line)
正如您在lineReceived
方法中看到的那样,我创建令牌并在收到来自客户端工具的登录请求时发送它。现在脚本只创建一次令牌。我决定在dataReceived
每小时后更改此脚本并在方法中重新创建令牌。您可以在下面看到我的更改:
def dataReceived(self, data):
if OPTIONS.verbose:
print "> " + data
if anHourPassedFromLastRecreation():
consumer = OAuthEntity(self.domain, self.secret)
xoauth_string = GenerateXOauthString(consumer, self.email_address)
xoauth_b64 = base64.b64encode(xoauth_string)
line = self.prefix + " AUTHENTICATE XOAUTH " + xoauth_b64
Proxy.lineReceived(self,line)
Proxy.dataReceived(self,data)
else:
Proxy.dataReceived(self,data)
如您所见,在dataReceived
方法中,我尝试重新创建令牌并将其在数据发送到服务器之前发送。我知道这可能有点天真,但我没有任何其他想法,如何重新创建令牌并在我未来的请求中使用它。
不幸的是,它不起作用。你能给我一些建议如何创建代理或如何重新创建令牌以及如何将它与未来的请求联系起来吗?
有用的链接:
- IMAP 协议交换。
-用于桌面客户端的 Gmail IMAP OAuth。