Push-уведомления Gmail API выдают ошибку 403

Я пытаюсь получать push-уведомления обо всех новых сообщениях, которые я получаю по электронной почте. Я настроил клиент pubsub, как указано в документе 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()

Когда я запускаю указанную выше программу, я обнаруживаю следующую ошибку:

Отслеживание (последний вызов последним): файл "/home/kmittal/workspace/engine/workers/newPubSubClient.py", строка 82, в service.users (). Watch (userId = 'me', body = request) .execute () Файл "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", строка 135, в positional_wrapper return wrapped (* args, ** kwargs) File "/ usr / local / lib / python2.7 / dist-packages / googleapiclient / http.py ", строка 723, при выполнении поднять HttpError (соответственно, content, uri = self.uri) googleapiclient.errors.HttpError: https://www.googleapis.com/gmail / v1 / users / me / watch? alt = json возвращено "Недействительное имя темы не соответствует проектам / SOME_ANOTHER_PROJECT / themes / *">


person Krishna Khowal    schedule 25.11.2015    source источник
comment
Я считаю, что <project-name>, <Topic-name> и /SOME_ANOTHER_PROJECT предназначены для того, чтобы вы изменили то, что вам нравится. Например. home_project, mail_from_mom_topic   -  person Tholle    schedule 25.11.2015
comment
Привет .. Я написал эти имена для ясности .. в моем коде я использую правильные значения .. Кроме того, SOME_ANOTHER_PROJECT выдает ошибку .. это означает, что это относится к другому проекту моей учетной записи.   -  person Krishna Khowal    schedule 25.11.2015


Ответы (1)


Согласно этому другому ответу, похоже, что вы можете создать часы только для тем, которые являются частью вашего собственного проекта, а не другого проекта. Документация , похоже, подтверждает это, поскольку подразумевает, что вы должны указать < em> myproject (идентификатор вашего проекта):

Имя темы может быть любым именем, которое вы выберете для своего проекта (т. Е. Соответствие projects / myproject / themes / *, где myproject - это идентификатор проекта, указанный для вашего проекта в Google Developers Console).

person Adam    schedule 02.12.2015
comment
Создаю тему в этом же проекте. Просто я не знаю, как это относится к какому-то другому проекту. - person Krishna Khowal; 03.12.2015
comment
В этом случае вы можете дважды проверить, что ключ .p12, который вы используете, взят из того же проекта, или попробовать использовать новый ключ. - person Adam; 04.12.2015
comment
Спасибо Адаму за вашу помощь. Оказывается, это была проблема не конфигурации, а данных. Я использовал токен доступа из базы данных, которая была создана с использованием другой учетной записи службы. - person Krishna Khowal; 04.12.2015