Недостаточно прав для изменения ярлыков Gmail с помощью API - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь изменить почтовый ящик GMail через их API.

Но я получаю ошибку:

HttpError 403 при запросе https://www.googleapis.com/gmail/v1/users/me/labels/SOME_MESSAGE_ID вернул "Недостаточное разрешение"

Я использовал те же учетные данные OAuth для загрузки своих сообщений. Так что я знаю, что это работает.

Я проверяю, доступен ли ярлык.

enter image description here

Я не вижу ничего другого, что я делаю неправильно. Документ с ярлыком не помогает.

Может ли кто-нибудь пролить свет?

def archive(msg_id):
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', ArchiveScope)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)

    msg_labels = {'removeLabelIds': ['INBOX'], 'addLabelIds': ['MyLabel']}

    service.users().labels().update(userId='me', id=msg_id, body=msg_labels).execute()

    print('Message ID: %s' % msg_id)

1 Ответ

1 голос
/ 17 июня 2019

В вашем коде есть несколько ошибок. Во-первых, убедитесь, что ArchiveScope - это список, содержащий области, необходимые для приложения. Для обновления, создания или удаления меток GMail достаточно либо https://www.googleapis.com/auth/gmail.readonly или https://www.googleapis.com/auth/gmail.labels, либо , как указано здесь .

Ваш код предполагает, что вы пытаетесь удалить ярлык "INBOX" и добавить новый ярлык "MyLabel". Метод, описанный service.users().labels().update(), может использоваться только для изменения информации о существующих ярлыках, которые есть в учетной записи GMail, а не для создания или удаления. Кроме того, метка «Входящие» является зарезервированной меткой и не может быть удалена. Когда делается правильный запрос на удаление этой метки, сервер получает «Неверный запрос на удаление», как показано ниже.

DELETE https://www.googleapis.com/gmail/v1/users/me/labels/INBOX

{
  "error": {
    "code": 400, 
    "message": "Invalid delete request", 
    "errors": [
      {
        "domain": "global", 
        "message": "Invalid delete request", 
        "reason": "invalidArgument"
      }
    ]
  }
}

Однако для отдельных писем можно удалить тег «Входящие» с помощью service.users().messages().modify() и тело запроса {'removeLabelIds': ['INBOX'], 'addLabelIds': ['MyLabel']} , которое вы использовали до . Это только удалит метку из указанного сообщения, но не удалит метку полностью.

Полную документацию по изменению содержимого существующей метки можно найти здесь , но параметр id должен равняться уникальному идентификатору метки, которую вы хотите редактировать, а полезная нагрузка тела должна быть словарём. структура, содержащая новое имя, для которого вы хотите изменить метку:

lbl_id = "Label_XXXXXXXXXXXXXXX"
    msg_labels = {
      'name' : [‘newLabelName’]
    }
    service.users().labels().update(userId='me', id=lbl_id, body = msg_labels).execute() 
    print('Message ID: %s' % lbl_id)

Чтобы создать метку, вы можете использовать функцию service.users().labels().create(userId=’me’, body={‘name’ : ‘MyLabel’ }).execute() с теми же областями действия, что и update (). Поскольку ярлык еще не создан, идентификатор ярлыка не требуется.

Удаление метки - то же самое, хотя service.users().labels().delete(userId=’me’).execute() используется без тела. В отличие от create (), службе удаления требуется идентификатор метки , однако этот запрос не возвращает ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...