Google API + Сервис Аккаунт для олицетворенного пользователя - PullRequest
0 голосов
/ 20 января 2019

Я собираюсь собрать всех членов одной группы, а затем загрузить все заголовки писем, которые они имеют в gmail.Чтобы сделать это, я начал с Google Gmail API и членов API, но я застрял.Я понимаю, что не могу этого сделать, даже если у меня есть роль администратора.

Я обнаружил, что правильный способ сделать это (я думаю ...) - использовать служебную учетную запись для олицетворения пользователя.Что я сделал:

  1. Создайте новый проект.
  2. Создайте учетные данные учетной записи службы.
  3. Добавьте делегирование всего домена в учетную запись службы.
  4. Включите области действия для этого проекта.

Код для создания службы:

from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from google.oauth2 import service_account
import requests
import json

class Service:

    SCOPES = ['https://mail.google.com/',
            'https://sites.google.com/feeds',
            'https://www.google.com/m8/feeds',
            'https://www.googleapis.com/auth/activity',
            'https://www.googleapis.com/auth/calendar',
            'https://www.googleapis.com/auth/drive',
            'https://www.googleapis.com/auth/gmail.settings.basic',
            'https://www.googleapis.com/auth/gmail.settings.sharing',
            'https://www.googleapis.com/auth/plus.login',
            'https://www.googleapis.com/auth/plus.me',
            'https://www.googleapis.com/auth/userinfo.email',
            'https://www.googleapis.com/auth/userinfo.profile',
            'https://www.googleapis.com/auth/admin.directory.group',
            'https://www.googleapis.com/auth/gmail.metadata'
            ]

    secret_file = 'client-secret.json'
    service = ''
    service_name = ''
    service_version = ''
    delegated_credentials = ''
    credentials = ''

    def __init__(self, servicename, serviceversion):
        self.service_name = servicename
        self.service_verion = serviceversion
        self.newService()

    def newService(self):
        self.credentials = service_account.Credentials.from_service_account_file(self.secret_file, scopes=self.SCOPES)
        self.credentials = self.credentials.with_subject('admin@domain.com')
        self.service = build(self.service_name, self.service_verion, credentials=self.credentials)
        return self.service

if __name__ == '__main__':
    main()

Члены класса:

from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from service import Service
import requests
import json

class Members:

    service = ''
    group_name = ''
    members = []

    def __init__(self, groupname):
        self.group_name = groupname
        self.service = Service('admin', 'directory_v1')

    def get_members(self):
        print('Buscando los miembros del grupo')
        results = self.service.service.members().list(groupKey=self.group_name).execute()
        for member in results['members']:
            print('Descargando datos de: ', member['email'])
            self.members.append(member['id'])

        return self.members


if __name__ == '__main__':
    main()

app.py:

from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from members import Members
from user import User
from service import Service
import requests


def main():

    member = Members("group@ldomain.com")
    members_list = member.get_members()

    for member in members_list:
        print(member)
        user = User(member)
        messages = user.get_user_inbox()
        user.get_message_info(messages)

if __name__ == '__main__':
    main()

У меня ошибка:

"Клиент не авторизован для получения маркеров доступа с использованием этого метода, или клиент не авторизован для какой-либо из запрошенных областей."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...