You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python解析Microsoft Graph getEmailActivityUserDetail报告重复问题

故障原因
  1. 代码存在冗余循环逻辑:外层循环逐行读取CSV返回结果后,多余的for entry in line_fields内层循环会遍历当前行的所有字段,每遍历一个字段就会向结果列表追加一次当前行的用户数据,行内有多少个字段就会生成多少条重复数据,和你反馈的重复10次的现象完全吻合。
  2. Microsoft Graph的getEmailActivityUserDetail接口本身返回的是指定周期内的每日统计数据,拉取D30周期数据时,同一个用户会生成最多30条对应不同日期的统计记录,若未做去重处理也会出现多重复数据。
修复方案
  1. 移除冗余的内层循环,每行仅做一次数据匹配和插入
  2. 新增去重逻辑,使用用户主体名称作为唯一键,确保每个用户仅保留一条记录,若有聚合需求可在匹配时累加收发读的统计数值

修复后的可运行代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:48:00