python - SDK,尝试从群组 Gmail 中调用成员并更新
问题描述
我正在尝试创建一个获取所有群组 Gmail 电子邮件的呼叫,以便我可以更新那些不存在的邮件并删除那些不应该存在的邮件。我目前正在尝试以下代码,但出现范围错误。
# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/admin.directory.group.members', 'https://www.googleapis.com/auth/admin.directory.group']
def main():
"""Shows basic usage of the Admin SDK Directory API.
Prints the emails and names of the first 10 users in the domain.
"""
creds = None
# The file token.json stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.json', 'w') as token:
token.write(creds.to_json())
service = build('admin', 'directory_v1', credentials=creds)
# Call the Admin SDK Directory API
print('Getting the members of Hospitality Team')
response_group = service.groups().list(customer='my_customer').execute()
for group in response_group['groups']:
print(group['email'])
解决方案
解决方案:
您可以执行以下操作:
- 通过Groups 列出所有组: list。
- 对于每个组,检查它是否有成员。
- 如果组有成员,请通过Members: list检索其成员。
- 对于来自其他 API 的每个所需成员,检查它是否已存在于组中。如果它不存在,请通过Members: insert将其添加到您的组中。
- 对于组中的每个当前成员,检查它是否是所需成员之一。如果不是,请通过Members: delete将其删除。
- 如果群组没有成员,请通过 将所有需要的成员添加到群组中
Members: insert
。
代码片段:
def updateGroupMembers(service):
ideal_member_emails = ["member_1@example.com", "member_2@example.com", "member_3@example.com"]
response_group = service.groups().list(customer='my_customer').execute()
for group in response_group['groups']:
group_email = group['email']
response_members = service.members().list(groupKey=group_email).execute()
if "members" in response_members:
current_member_emails = list(map((lambda member : member["email"]), response_members["members"]))
for ideal_member_email in ideal_member_emails:
if ideal_member_email not in current_member_emails:
payload = {
"email": ideal_member_email
}
service.members().insert(groupKey=group_email, body=payload).execute()
for current_member_email in current_member_emails:
if current_member_email not in ideal_member_emails:
service.members().delete(groupKey=group_email, memberKey=current_member_email).execute()
else:
for ideal_member_email in ideal_member_emails:
payload = {
"email": ideal_member_email
}
service.members().insert(groupKey=group_email, body=payload).execute()
笔记:
- 您提供的范围应该足以满足这些调用。如果您在上次身份验证后编辑了这些范围,请删除旧的
token.json
并再次进行身份验证。 - 确保经过身份验证的用户对这些组具有编辑权限。
- 在这里,我假设所需的成员列表对于所有组都是相同的。我还假设您有这些电子邮件的列表(目前
ideal_member_emails
)。如果不是这种情况,请根据您的喜好编辑提供的脚本。 - 如果您的组和成员列表足够大,您应该迭代地为您的
list
请求获取不同的页面结果。有关如何执行此操作的更多信息,请参阅此相关答案(关于,但过程相同)。Users: list
参考:
推荐阅读
- assembly - EMU8086 将 32 位数除以 16 位数给出意外的 0 余数
- html - 如何在 Power BI 中显示 HTML 页面
- javascript - 在 highcharts 上绘制数据和时区反应
- awk - 当条件为真时从另一个文件添加行
- c# - 如何将 url 重定向到特定端点
- c++ - 如何获取比例因子以获得真实的屏幕分辨率?
- python - Python,用户选择一个词,计算机猜测它
- sql - CASE 语句 SQL 处理数据问题
- laravel - 如何使用联合连接具有不同列名的多个表
- javascript - 使用 cookie 和 Flask 实现简单的登录页面