使用Python解析Microsoft Graph getEmailActivityUserDetail报告重复问题
故障原因
- 代码存在冗余循环逻辑:外层循环逐行读取CSV返回结果后,多余的
for entry in line_fields内层循环会遍历当前行的所有字段,每遍历一个字段就会向结果列表追加一次当前行的用户数据,行内有多少个字段就会生成多少条重复数据,和你反馈的重复10次的现象完全吻合。 - Microsoft Graph的
getEmailActivityUserDetail接口本身返回的是指定周期内的每日统计数据,拉取D30周期数据时,同一个用户会生成最多30条对应不同日期的统计记录,若未做去重处理也会出现多重复数据。
修复方案
- 移除冗余的内层循环,每行仅做一次数据匹配和插入
- 新增去重逻辑,使用用户主体名称作为唯一键,确保每个用户仅保留一条记录,若有聚合需求可在匹配时累加收发读的统计数值
修复后的可运行代码如下:
import requests import urllib import json client_id = urllib.parse.quote_plus("#######################") client_secret = urllib.parse.quote_plus("######################") tenant = urllib.parse.quote_plus("#########################") auth_uri = f"https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token" auth_body = f"grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default" authorization = requests.post(auth_uri, data=auth_body, headers={"Content-Type": "application/x-www-form-urlencoded"}) token = json.loads(authorization.content)['access_token'] graph_uri = "https://graph.microsoft.com/v1.0/reports/getEmailActivityUserDetail(period=%27D30%27)" # GET请求无需携带认证请求体 response = requests.get(graph_uri, headers={'Authorization': f'Bearer {token}'}) temp_usr_list = [ 'User.One@domain.com', 'User.Two@domain.com' ] # 用字典做去重,确保每个用户仅存一条数据 user_unique_map = {} for line in response.iter_lines(): # 跳过空行、表头、字段不足的异常行 if not line: continue line_fields = line.decode("utf-8").split(',') if len(line_fields) < 10 or line_fields[1] == 'User Principal Name': continue user_upn = line_fields[1] if user_upn in temp_usr_list: # 若需要聚合30天总数据,可在这里累加send_count/recv_count/read_count的数值 user_unique_map[user_upn] = { 'user_principle_name': user_upn, 'send_count': line_fields[6], 'recv_count': line_fields[7], 'read_count': line_fields[8], 'assigned_products': line_fields[9] } report_user_list = list(user_unique_map.values()) print(report_user_list)
内容的提问来源于stack exchange,提问作者Otto mate
相关产品推荐
相关产品推荐

