Как получить несколько учетных данных 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 ответ
Вы должны сделать веб-сервер, чтобы сделать то же самое. Поток будет следующий -
- Пользователь заходит в ваше веб-приложение.
- Пользователь нажимает на кнопку Войти через Google.
- Пользователь будет перенаправлен на URL-адрес Goole OAuth2 с необходимыми областями (в вашем случае это API контактов Google, API Pub / Sub, Gmail API и т. Д.)
- Пользователь предоставит доступ к вашему приложению, созданному на консоли разработчика Google.
- Он вернется с токеном / кодом для вашего приложения с необходимым доступом согласно запросу OAuth2.
- Вы можете хранить то же самое в некоторой базе данных и использовать его согласно OAuth2.
Выше процесс дан шаг за шагом здесь.
Составьте список областей действия, а затем добавьте их вот так, например
SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly', 'https://www.googleapis.com/auth/spreadsheets']
Это сработало для меня, поэтому я надеюсь, что это поможет