web-dev-qa-db-fra.com

Comment me déplacer avec l'autorisation HttpError 403 insuffisante? (api gmail, python)

Je continue à recevoir l'erreur suivante lorsque j'exécute mon code: 

An error occurred: <HttpError 403 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Insufficient Permission">

Ceci est mon code: 

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's 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)

Je continue à lire que je dois modifier un fichier d'informations d'identification, mais je n'arrive pas à le trouver. J'ai Windows 7 installé. Est-ce que quelqu'un sait ce que je dois faire pour surmonter cette erreur? Je suis un noob total à ce sujet alors veuillez m'excuser si je semble un peu nooby à ce sujet Merci! 

17
semiflex

Même si la réponse acceptée est correcte à 100%. Je pense que cela vaut la peine de souligner que c'est la raison.

Lorsque vous autorisez un client du service Gmail, vous pouvez spécifier plusieurs portées différentes: Toutes, composer, étiquettes, etc.

Ceux-ci sont tous énumérés ici: https://developers.google.com/gmail/api/auth/scopes

La portée mentionnée dans la réponse fournit un accès complet à Gmail.

12
Olshansk

Résolu en modifiant la ligne SCOPES en:

SCOPES = 'https://mail.google.com/'

L'envoi d'email fonctionne parfaitement 

9
semiflex

L'API Gmail a les portées suivantes:  gmail api scopes

https://www.googleapis.com/auth/gmail.send est nécessaire ou vous devez disposer d'un accès complet - https://mail.google.com/ .

Les portées prises de ici .

9
apadana

Si vous exécutez le " gmail-python-quickstart " officiel auparavant, veuillez supprimer le fichier "gmail-quickstart.json" sur votre système. Relancez votre programme pour que vous puissiez définir le privilège comme vous le souhaitez. 

8
ccy

En plus des réponses de:

  1. ccy
  2. apadana
  3. ragnampiza

et en guise d'avancement de la réponse de ccy ...


Solution 1 ...

... un correctif

Si vous utilisez le code gmail-python-quickstart d'origine, veillez également à mettre à jour les éléments suivants:

  1. CLIENT_SECRET_FILE = '/path/to/your/secret_client.json'
  2. Forcer get_credentials() à utiliser le chemin logique des informations d'identification ayant échoué ...

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)

pour forcer True de sorte que l'opération logique fonctionne définitivement avec les opérations 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)

Ceci est une solution de hacky, mais vous permettra de vous lever et aller dans peu de temps. 

Le problème...

  • Le problème avec cette approche est qu’elle force le code flow, qui ouvre le navigateur de la fenêtre d’authentification et nécessite que l’utilisateur final accepte le protocole de sécurité avant d’envoyer le courrier électronique.
  • Cela rompt évidemment le concept de génération et d’envoi automatisés de courrier électronique.

Solution 2 ...

... une solution stable et plus automatisée

J'ai trouvé que faire les travaux suivants:

  1. Copiez le fichier téléchargé secret-client-####.html.json dans le répertoire défini dans le premier bloc de code à partir de la méthode get_credentials(). Fondamentalement, copiez-le dans votre répertoire user/.credentials
  2. Supprimer le gmail-python-quickstart.json actuel
  3. Renommez votre fichier téléchargé en gmail-python-quickstart.json

Exécutez votre code, puis cela devrait fonctionner correctement.

Avantages...

  • La page d'authentification ne s'affiche pas
  • L'email est envoyé automatiquement
1
Andrew

Si vous avez utilisé l'exemple officiel de Google, il devrait y avoir un dossier dans le répertoire ~/.credentials/ qui est ancien, supprimez tout ce qui se trouve dans ce répertoire et réexécutez votre code. alors vous devez ajouter de nouvelles autorisations et tout est OK!

1
Iman Mirzadeh