【问题标题】:Using python to parse the getEmailActivityUserDetail report使用python解析getEmailActivityUserDetail报告
【发布时间】:2021-11-08 20:40:25
【问题描述】:

我正在使用 python 脚本从https://graph.microsoft.com 中提取数据。对于每个已解析的用户,传递的输出会重复 (10) 次。仅捕获请求的一次缺少哪个步骤?

    import requests
    import urllib
    import json
    import csv
    import os
    
    client_id = urllib.parse.quote_plus("#######################")
    client_secret = urllib.parse.quote_plus("######################")
    tenant = urllib.parse.quote_plus("#########################")
    
    auth_uri = "https://login.microsoftonline.com/" + tenant + "/oauth2/v2.0/token"
    auth_body = "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)"
    response = requests.get(graph_uri, data=auth_body, headers={'Content-Type': "application/json", 'Authorization': 'Bearer ' + token})
    
    print(response.text)
    
    temp_usr_list = [
    'User.One@domain.com',
    'User.Two@domain.com'
    ]
    
    report_user_list = []
    
    for line in response.iter_lines():
    
        line_fields = line.decode("utf-8").split(',')
    
        for entry in line_fields:
            if len(entry) < 1:
                continue
    
            if line_fields[1] in temp_usr_list:
                d = dict(
                    user_principle_name = line_fields[1],
                    send_count = line_fields[6],
                    recv_count = line_fields[7],
                    read_count = line_fields[8],
                    assigned_products = line_fields[9]
                )
    
                report_user_list.append(d)
    
    print(report_user_list)

输出:

{'user_principle_name': 'User.One@domain.com', 'send_count': '0', 'recv_count': '0', 'read_count': '0', 'assigned_products': 'MICROSOFT'} ,...

{'user_principle_name': 'User.Two@domain.com', 'send_count': '0', 'recv_count': '0', 'read_count': '0', 'assigned_products': 'MICROSOFT'} ,...

【问题讨论】:

    标签: python dictionary parsing


    【解决方案1】:

    尝试以这种格式运行一次,如果得到相同的输出,请告诉我。

    import requests
    import urllib
    import json
    import csv
    import os
    
    # Parms
    
    client_id = urllib.parse.quote_plus('#######################')
    client_secret = urllib.parse.quote_plus('######################')
    tenant = urllib.parse.quote_plus('#########################')
    
    auth_uri = 'https://login.microsoftonline.com/' + tenant \
        + '/oauth2/v2.0/token'
    auth_body = '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)'
    response = requests.get(graph_uri, data=auth_body,
                            headers={'Content-Type': 'application/json',
                            'Authorization': 'Bearer ' + token})
    
    print response.text
    
    temp_usr_list = ['User.One@domain.com', 'User.Two@domain.com']
    
    report_user_list = []
    
    for line in response.iter_lines():
    
        line_fields = line.decode('utf-8').split(',')
    
        for entry in line_fields:
            if len(entry) < 1:
                continue
    
        if line_fields[1] in temp_usr_list:
            d = dict(user_principle_name=line_fields[1],
                     send_count=line_fields[6],
                     recv_count=line_fields[7],
                     read_count=line_fields[8],
                     assigned_products=line_fields[9])
    
            report_user_list.append(d)
    
    print report_user_list
    

    【讨论】:

    • 我看到你唯一改变的是 temp_user_list FROM: temp_usr_list = [ 'User.One@domain.com', 'User.Two@domain.com', ] TO: temp_usr_list = [ 'User.One@domain.com', 'User.Two@domain.com'] 如果是这样,报告仍会产生 (10) 个重复的 User.One 和 User.Two 输出。
    • @Ottomate 最后,我注意到一个缩进问题,现在一切都在解析。
    • @Otto 我猜你的for entry in line_fields 循环是为了跳过任何空字段的line。有了这个假设,看起来你的下一个代码块仍然在那个循环下缩进。我的编辑将该块移到了第二个循环之外。
    • 删除 report_user_list.append(d) 的缩进确实会删除重复项,但也会删除任何其他用户输出。该脚本的目的是提取所有电子邮件数据,然后为 temp_user_list 用户创建一个包含选定列的字典。
    • @Ottomate 所以你错过了User.Three@domain.comUser.Four@domain.com,因为它们不在temp_usr_list 中。我错过了什么?没有重复,你得到的正是你想要的。要获得 3 和 4,请将它们包含在 temp_usr_list 中或取消选中以获取每个用户。破译您的输出非常困难,因为它在评论中,但看起来每个line 只有一个用户。您“丢失”的唯一行是您通过if line_fields[1] in temp_usr_list 检查明确排除的行。
    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2022-10-18
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多