我正在尝试获取有关我在电子邮件中收到的所有新收件箱邮件的推送通知。我已经配置了pubsub doc中提到的pubsub客户端。以下是代码:
import httplib2
from apiclient import discovery
from oauth2client import client as oauth2client
from lib.common.models.main.users import User
from oauth2client.client import SignedJwtAssertionCredentials,\
AccessTokenRefreshError
PUBSUB_SCOPES = ['https://www.googleapis.com/auth/pubsub']
def create_pubsub_client(http=None):
credentials = oauth2client.GoogleCredentials.get_application_default()
if credentials.create_scoped_required():
credentials = credentials.create_scoped(PUBSUB_SCOPES)
if not http:
http = httplib2.Http()
credentials.authorize(http)
return discovery.build('pubsub', 'v1', http=http)
pubsub = create_pubsub_client()
topic = 'projects/<project-name>/topics/<Topic-name>'
policy = {
'policy': {
'bindings': [{
'role': 'roles/pubsub.publisher',
'members': ['serviceAccount:<my-service-account>'],
}],
}
}
resp = pubsub.projects().topics().setIamPolicy(resource=topic, body=policy).execute()
request = {
'labelIds': ['INBOX'],
'topicName': 'projects/<project-name>/topics/<Topic-name>'
}
f = file('link-to.p12', 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(
'service-account-email',
key,
scope='https://mail.google.com/',
)
user = User.query.filter(User.id == 143).first()
accesskey = user.get_access_key(True)
credentials.access_token = accesskey['key']
service = discovery.build('gmail','v1',credentials=credentials)
service.users().watch(userId='me', body=request).execute()
当我运行上述程序时,遇到以下错误:
追踪(最近一次通话): File&#34; /home/kmittal/workspace/engine/workers/newPubSubClient.py" ;,第82行,在 service.users()。watch(userId =&#39; me&#39;,body = request).execute() 在position_wrapper中的文件&#34; /usr/local/lib/python2.7/dist-packages/oauth2client/util.py" ;,第135行 返回包裹(* args,** kwargs) 文件&#34; /usr/local/lib/python2.7/dist-packages/googleapiclient/http.py" ;,第723行,执行中 引发HttpError(resp,content,uri = self.uri) googleapiclient.errors.HttpError:https://www.googleapis.com/gmail/v1/users/me/watch ?alt = json返回&#34;无效的topicName与项目/ SOME_ANOTHER_PROJECT / topics / *&#34; &GT;
答案 0 :(得分:1)
根据此other answer,您似乎只能为属于您自己项目的主题创建一个监视,而不是另一个项目。 documentation似乎支持这一点,因为它意味着您必须指定 myproject (您自己的项目ID):
主题名称可以是您在项目下选择的任何名称(即 匹配项目/ myproject / topics / *,其中myproject是项目 在Google Developers Console中为您的项目列出的ID。