Gmail API: недопустимая метка при попытке установить метку сообщения на ту, которую я создал

Я создал ярлык «handler_gmail» в веб-интерфейсе Gmail, используя стандартный подход.

Когда я пытаюсь установить эту метку для сообщения через API Gmail (клиентская библиотека Python), я получаю ответ HttpError 400, возвращенный «Недопустимая метка: handler_gmail».

Я уверен, что ярлык существует (я проверял несколько раз - никаких опечаток).

Я пытаюсь установить это так:

gs.users().messages().modify(userId=username, id=m['id'], body={"addLabelIds": ['handler_gmail']}).execute()

Я попытался добавить в словарь пару ключ/значение "removeLabelIds": [] (думая, что это может быть необходимо), но получил ту же ошибку «Недопустимая метка».

Любая помощь в этом очень ценится! Так близко к тому, чтобы сделать то, что мне нужно, с этим проектом!


person Community    schedule 17.11.2014    source источник
comment
Вам нужно использовать id, а не имена.   -  person Eric D    schedule 17.11.2014


Ответы (3)


Как указывали другие, вы должны использовать идентификаторы меток, а не имена меток. Я решил эту проблему, используя пример кода API gmail и изменив его для печати out id в дополнение к именам:

results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])

if not labels:
    print('No labels found.')
else:
  print('Labels:')
  for label in labels:
    print(label['name']+ " "+label['id'])

Итак, как только вы получите соответствующий идентификатор, ваш код должен выглядеть примерно так:

gs.users().messages().modify(userId=username, id=m['id'], body={"addLabelIds":     
['Label_1']}).execute()
person AddieBundren    schedule 18.03.2016

Я смог перечислить системные и пользовательские метки через print(gs.users().labels().list(userId=username).execute())

Это показало, что идентификатор ярлыка для моего ярлыка был другим («Ярлык_1» — имя было «handler_gmail»). Поэтому я создам метод поддержки, который получает идентификатор метки по имени и добавляет метку к сообщению (через изменение), используя идентификатор.

Спасибо!

person Community    schedule 17.11.2014

Я реализовал синтаксический анализатор, чтобы изменить имена моих ярлыков на идентификаторы.

def ModifyMessage(service, user_id, msg_id, msg_labels):
    """Modify the Labels on the given Message.

    Args:
        service: Authorized Gmail API service instance.
        user_id: User's email address. The special value "me"
        can be used to indicate the authenticated user.
        msg_id: The id of the message required.
        msg_labels: The change in labels.

    Returns:
        Modified message, containing updated labelIds, id and threadId.
    """
    try:
        message = service.users().messages().modify(userId=user_id, id=msg_id,
                                            body=msg_labels).execute()

        label_ids = message['labelIds']

        print('Message ID: %s - With Label IDs %s' % (msg_id, label_ids))
        return message
    except errors.HttpError, error:
        print( 'An error occurred(modify): %s' % error)

def GetLabelIds(service, labels_in):
    result = []
    results = service.users().labels().list(userId='me').execute()
    labels = results.get('labels', [])

    for label_in in labels_in:
        for label in labels:
            if label['name'] == label_in:
                result.append(label['id'])
                break
    return result

Теперь я называю лейбл Creator следующим образом:

def CreateMsgLabels(service):
    """Create object to update labels.

    Returns:
        A label update object.
    """
    removeLabels = GetLabelIds(service, ['OLDLABEL'])
    addLabels = GetLabelIds(service, ['NEWLABEL'])
    return {'removeLabelIds': removeLabels, 'addLabelIds': addLabels}

Мой вызов в моем основном коде выглядит так

ModifyMessage(service, 'me', id, CreateMsgLabels(service))
person Juancho Buchanan    schedule 28.07.2017