Как получить несколько учетных данных Google (API Gmail, Pub/Sub, Contacts) во время процесса регистрации

Я работаю над проектом на основе Python, который получит доступ к различным API Google, таким как API контактов Google, API Pub/Sub, Gmail API и т. Д.

Получение соответствующих токенов и учетных данных с помощью OAuth 2.0 для этих API-интерфейсов в настоящее время выполняется вручную с помощью консоли API Google. Я хотел бы автоматизировать это для нескольких пользователей, которые хотят позволить мне управлять своим почтовым ящиком Gmail через API, упомянутые выше (не только Gmail API).

Как я могу получить учетные данные для всех этих API во время процесса регистрации, чтобы я мог сохранить JDS-файл учетных данных в БД и затем управлять почтовыми ящиками? Функция "Зарегистрироваться в Google" позволяет получить только базовые учетные данные, и я не мог понять, как перенаправить пользователей на соответствующую страницу, на которой я спрашиваю его / ее разрешение на получение доступа к почтовому ящику с помощью API (Google Contacts, Gmail и API pub/sub). Затем я планирую использовать эти учетные данные (объект) в моем скрипте Python программно.

Вот сценарий, который я создаю учетные данные с помощью get_credentials(). Как видите, мне сначала нужно вручную получить файл-секретный файл клиента на консоли API, а затем сгенерировать учетные данные по областям с помощью следующего сценария (здесь мне нужно автоматизировать и получить несколько других учетных данных во время процесса регистрации).

SCOPES = 'https://www.googleapis.com/auth/gmail.modify'
CLIENT_SECRET_FILE = "client_secret_pubsub.json"
APPLICATION_NAME = "pub-sub-project-te"

def get_credentials():
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-python-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
    print('Storing credentials to ' + credential_path)
return credentials


def pull_emails_from_mailbox(credentials_obj):

credentials = get_credentials()

http = credentials.authorize(Http())

GMAIL=discovery.build('gmail', 'v1', http=http)

user_id =  'me'
label_id_one = 'INBOX'
label_id_two = 'UNREAD'

# Getting all the unread messages from Inbox
# labelIds can be changed accordingly
messages = GMAIL.users().messages().list(userId=user_id, maxResults=1000).execute()
#unread_msgs = GMAIL.users().messages().list(userId='me',labelIds=[label_id_one,label_id_two]).execute()

# We get a dictonary. Now reading values for the key 'messages'

mssg_list = messages['messages']

print ("Total messages in inbox: ", str(len(mssg_list)))

final_list = []

new_messages=[]
for mssg in mssg_list:
    m_id = mssg['id'] # get id of individual message
    new_messages.append(GMAIL.users().messages().get(userId=user_id, id=m_id).execute()) # fetch the message using API

return new_messages


def prepare_raw_db (raw_messages):

messageId=[]
historyId=[]
raw=[]

print ("Total number of emails to be parsed:", len(raw_messages))

for msg in raw_messages:
    messageId.append(msg["id"])
    historyId.append(msg['historyId'])
    raw.append(msg)

        #'addLabelIds': ['UNREAD']
    GMAIL.users().messages().modify(userId="me", id=msg["id"],body={ 'removeLabelIds': ['UNREAD'] }).execute() 

msg_dict={"messageId":messageId, "historyId":historyId, "raw":raw}

df=pd.DataFrame(msg_dict)

df.raw=df.raw.astype(str)

return df

Спасибо

1 ответ

Вы должны сделать веб-сервер, чтобы сделать то же самое. Поток будет следующий -

  1. Пользователь заходит в ваше веб-приложение.
  2. Пользователь нажимает на кнопку Войти через Google.
  3. Пользователь будет перенаправлен на URL-адрес Goole OAuth2 с необходимыми областями (в вашем случае это API контактов Google, API Pub / Sub, Gmail API и т. Д.)
  4. Пользователь предоставит доступ к вашему приложению, созданному на консоли разработчика Google.
  5. Он вернется с токеном / кодом для вашего приложения с необходимым доступом согласно запросу OAuth2.
  6. Вы можете хранить то же самое в некоторой базе данных и использовать его согласно OAuth2.

Выше процесс дан шаг за шагом здесь.

Составьте список областей действия, а затем добавьте их вот так, например

SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly', 'https://www.googleapis.com/auth/spreadsheets']

Это сработало для меня, поэтому я надеюсь, что это поможет