我有Python脚本,通过IMAP创建GMail电子邮箱的代理。此代理将身份验证令牌添加到请求。最终用户运行此脚本,然后使用一些工具从电子邮箱中下载所有用户电子邮件。当然,这个与代理和代理连接的工具使所有认证变得神奇 我目前的解决方案仅适用于小型电子邮箱。当我们想从大邮箱下载所有电子邮件时,我们收到验证错误。身份验证错误与令牌过期相关联。身份验证令牌仅在一小时内有效。在该服务器返回错误并关闭连接之后 我没写这个剧本。我收到了某人的消息,我必须解决这个问题。在此脚本中,我使用Twisted engine(Twisted code examples)。
让我展示一些源代码。下面你可以看到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 protocol exchange
- Gmail IMAP OAuth for desktop clients。