kutombawewe.net

Come ottengo l'autorizzazione insufficiente HttpError 403? (gmail api, python)

Continuo a ricevere il seguente errore quando eseguo il mio codice: 

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

Questo è il mio codice: 

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)

Continuo a leggere che ho bisogno di modificare un file di credenziali, ma non riesco a trovarlo. Ho Windows 7 installato. Qualcuno sa cosa devo fare per superare questo errore? Sono assolutamente un noob in questo modo, per favore scusami se sembro un po 'peggio di questo. Grazie! 

17
semiflex

Anche se la risposta accettata è corretta al 100%. Penso che valga la pena sottolineare questo perché è così.

Quando autorizzi un client del servizio Gmail, puoi specificare diversi ambiti: tutti, componi, etichette, ecc ...

Questi sono tutti elencati qui: https://developers.google.com/gmail/api/auth/scopes

L'ambito menzionato nella risposta fornisce l'accesso completo a Gmail.

12
Olshansk

Risolto cambiando la linea SCOPES a:

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

L'invio di email funziona perfettamente 

9
semiflex

L'API di Gmail ha questi scopi:  gmail api scopes

Per l'invio di e-mail, https://www.googleapis.com/auth/gmail.send è necessario o accesso completo https://mail.google.com/ .

Gli ambiti presi da qui .

9
apadana

Se esegui in precedenza " gmail-python-quickstart ", cancella il file "gmail-quickstart.json" nel tuo sistema. Riavvia nuovamente il programma in modo da poter impostare il privilegio come desideri. 

8
ccy

In aggiunta alle risposte di:

  1. cCY
  2. apadana
  3. ragnampiza

e come risposta alla risposta di ccy ...


Soluzione 1 ...

... una soluzione di hacking

Se stai utilizzando il codice gmail-python-quickstart originale, assicurati di aggiornare anche quanto segue:

  1. CLIENT_SECRET_FILE = '/path/to/your/secret_client.json'
  2. Forza get_credentials() per utilizzare il percorso logico delle credenziali non riuscite ...

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)

forzare True in modo che l'operazione logica esegua sicuramente le operazioni 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)

Questa è una correzione hacky, ma ti farà andare avanti e in breve tempo. 

Il problema...

  • Il problema con questo approccio è che impone il codice flow, che apre il browser della finestra di autenticazione e richiede che l'utente finale accetti il ​​protocollo di sicurezza prima di inviare l'e-mail.
  • Questo ovviamente rompe il concetto di generazione e invio di e-mail automatizzati.

Soluzione 2 ...

... una soluzione stabile e più automatizzata

Ho scoperto che facendo i seguenti lavori:

  1. Copia il file secret-client-####.html.json scaricato nella directory definita nel primo blocco di codice dal metodo get_credentials(). Fondamentalmente, copialo nella tua directory user/.credentials
  2. Elimina lo gmail-python-quickstart.json corrente
  3. Rinomina il file scaricato su gmail-python-quickstart.json

Esegui il tuo codice, quindi dovrebbe funzionare correttamente.

Benefici...

  • La pagina di autenticazione non viene visualizzata
  • L'email viene inviata automaticamente
1
Andrew

Se hai utilizzato l'esempio ufficiale di google, dovrebbe esserci una cartella nella directory ~/.credentials/ che è vecchia, rimuovere tutto all'interno di quella directory e rieseguire il tuo codice. quindi devi aggiungere nuove autorizzazioni e quindi tutto è OK!

1
Iman Mirzadeh