Как обойти HttpError 403 Недостаточное разрешение? (gmail api, python)
Я продолжаю получать следующую ошибку при выполнении моего кода:
An error occurred: <HttpError 403 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Insufficient Permission">
Это мой код:
import httplib2
import os
from httplib2 import Http
from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools
try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None
#SCOPES = 'https://www.googleapis.com/'
SCOPES = 'https://www.googleapis.com/auth/gmail.compose'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Gmail API Quickstart'
def get_credentials():
"""Gets valid user credentials from storage.
If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.
Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir,
'gmail-quickstart.json')
store = oauth2client.file.Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatability with Python 2.6
credentials = tools.run(flow, store)
print 'Storing credentials to ' + credential_path
return credentials
def CreateMessage(sender, to, subject, message_text):
"""Create a message for an email.
Args:
sender: Email address of the sender.
to: Email address of the receiver.
subject: The subject of the email message.
message_text: The text of the email message.
Returns:
An object containing a base64 encoded email object.
"""
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
return {'raw': base64.b64encode(message.as_string())}
testMessage = CreateMessage('ENTER SENDERS EMAIL ADDRESS', 'ENTER RECEIVERRS EMAIL ADDRESS', 'ENTER SUBJECT', 'ENTER EMAIL BODY')
def SendMessage(service, user_id, message):
"""Send an email message.
Args:
service: Authorized Gmail API service instance.
user_id: User email address. The special value "me"
can be used to indicate the authenticated user.
message: Message to be sent.
Returns:
Sent Message.
"""
try:
message = (service.users().messages().send(userId=user_id, body=message)
.execute())
print 'Message Id: %s' % message['id']
return message
except errors.HttpError, error:
print 'An error occurred: %s' % error
testSend = SendMessage(service, 'me', testMessage)
Я продолжаю читать, что мне нужно отредактировать файл учетных данных, но я не могу найти его. У меня установлен Windows 7. Кто-нибудь знает, что мне нужно сделать, чтобы пройти эту ошибку? Я полный ноб в этом, поэтому, пожалуйста, извините меня, если я немного поразмыслил об этом. Благодарю!
Ответы
Ответ 1
Несмотря на то, что принятый ответ на 100% правильный. Я думаю, стоит отметить, почему это дело.
Когда вы разрешаете клиенту службы gmail, вы можете указать несколько разных областей: Все, составить, метки и т.д.
Все они перечислены здесь: https://developers.google.com/gmail/api/auth/scopes
Объем, указанный в ответе, обеспечивает полный доступ к Gmail.
Ответ 2
API Gmail имеет следующие области:
![gmail api scopes]()
Для отправки электронной почты требуется https://www.googleapis.com/auth/gmail.send или полный доступ https://mail.google.com/.
Области, взятые из здесь.
Ответ 3
Решил его, изменив строку SCOPES на:
SCOPES = 'https://mail.google.com/'
Отправка электронной почты отлично работает
Ответ 4
Если вы запустили официальный " gmail-python-quickstart", удалите файл "gmail-quickstart.json" в своей системе, Повторно запустите свою программу, чтобы вы могли установить привилегию по своему усмотрению.
Ответ 5
В дополнение к ответам от:
и в качестве дальнейшего ответа ccy...
Решение 1...
... исправление хака
Если вы используете оригинальный код gmail-python-quickstart
, обязательно обновите следующее:
- CLIENT_SECRET_FILE =
'/path/to/your/secret_client.json'
- Принудительно
get_credentials()
использовать логический путь неудачных учетных данных...
if True:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = tools.run(flow, store)
print('Storing credentials to ' + credential_path)
чтобы заставить True
так, чтобы логическая операция, безусловно, работала с операциями client.flow
:
if True:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = tools.run(flow, store)
print('Storing credentials to ' + credential_path)
Это взломанное исправление, но вы получите в кратчайшие сроки.
Проблема...
- Проблема с этим подходом заключается в том, что он заставляет код
flow
, который открывает браузер окна проверки подлинности и требует, чтобы конечный пользователь принял протокол безопасности перед отправкой электронной почты.
- Это, очевидно, нарушает концепцию автоматической генерации и отправки электронной почты.
Решение 2...
... стабильное, более автоматизированное решение
Я обнаружил, что выполнение следующих работ:
- Скопируйте загруженный файл
secret-client-####.html.json
в каталог, определенный в первом блоке кода, из метода get_credentials()
. В основном скопируйте его в каталог user/.credentials
- Удалить текущий
gmail-python-quickstart.json
- Переименуйте загруженный файл в
gmail-python-quickstart.json
Запустите свой код, а затем он должен работать нормально.
Преимущества...
- Страница аутентификации не отображается
- Письмо отправляется автоматически
Ответ 6
Если вы использовали официальный официальный пример Google, должна быть папка в каталоге ~/.credentials/
, которая является старой, удаляет все внутри этого каталога и повторно запускает ваш код. то вам нужно добавить новые разрешения, и тогда все будет в порядке!