API开放平台场景示例:分页数据处理(邮件组、子账号)

重要

风险提示:下述代码在Python 3.11.9进行的测试,用于生产环境之前请务必先做好测试。

API开放平台代码示例:获取访问凭证

一、cursor游标分页数据

从前一次调用的返回值中获取“nextCursor”的值,作为下一次调用的请求参数。

以“批量获取组织下组信息”为例

Python示例代码

# -*- coding: utf-8 -*-
import requests
# 导入获取访问令牌的函数,路径根据实际情况进行修改,或直接给access_token赋值用于测试
from api_demo.get_access_token import access_token


def list_mail_group(cursor):
    """
    接口名称:批量获取组织下组信息,一次最多获取 30 条数据
    文档:https://mailhelp.aliyun.com/openapi/index.html#/operations/alimailpb_ud_GroupService_ListGroups

    参数:
    cursor (str): 用于分页的游标

    返回:
    返回包含组信息的JSON响应
    """
    url = "https://alimail-cn.aliyuncs.com/v2/groups"

    querystring = {"cursor": cursor, "size": "100", "orderby": "DES"}

    headers = {'Content-Type': 'application/json', 'Authorization': 'bearer ' + access_token}

    response = requests.request("GET", url, headers=headers, params=querystring)

    print('##########################################################################')
    print('请求参数:', querystring)
    print('返回参数:', response.status_code, response.text)
    print('##########################################################################')
    return response.json()


def get_all_mail_group():
    """
    获取邮件组的基本信息

    返回:
    邮件组基本信息列表
    """
    records = []
    cursor = ""
    # 定义类型映射
    type_mapping = {
        "STATIC": "静态组",
        "DEPARTMENT": "部门组",
        "DYNAMIC": "动态组",
        "USERGROUP": "群组",
        "DING": "钉钉组"
    }
    # 定义状态映射
    status_mapping = {
        "NORMAL": "正常",
        "FREEZE": "冻结"
    }
    while True:
        # 获取数据
        parsed_data = list_mail_group(cursor)
        print(f'hasMore={parsed_data["hasMore"]}')

        # 提取所需字段
        for group in parsed_data['groups']:
            record = {
                '邮件组名称': group['name'],
                '邮件组地址': group['email'],
                '邮件组类型': type_mapping.get(group['type'], group['type']),  # 如果没有映射,则保留原值
                '状态': status_mapping.get(group['status'], group['status'])
            }
            records.append(record)
        # 更新游标
        cursor = parsed_data["nextCursor"]
        print(f'nextCursor={cursor}')
        if not parsed_data["hasMore"]:
            print(f'没有更多数据')
            break
    return records


all_data = get_all_mail_group()
print(f'邮件组基本信息:{all_data}')

运行结果

image

二、offset、limit偏移量分页数据

第一次调用初始偏移量offset为0,limit数值为步长,下一次请求将从offset+limit的值作为新的起始值。

以“根据ID或email获取用户信息”为例

Python示例代码

# -*- coding: utf-8 -*-
import requests

# 导入获取访问令牌的函数,路径根据实际情况进行修改,或直接给access_token赋值用于测试
from api_demo.get_access_token import access_token


def get_department_members(offset, limit, v_depart_id):
    """
    根据部门ID获取部门成员
    https://mailhelp.aliyun.com/openapi/index.html?spm=a2c4g.11186623.0.0.1fdf1742qtp0cA#/operations/alimailpb_ud_UserService_GetUser
    :param offset: 分页查询的起始位置
    :param limit: 每页查询的成员数量
    :param v_depart_id: 部门ID
    :return: 成员列表和总成员数
    """
    url = "https://alimail-cn.aliyuncs.com/v2/departments/" + v_depart_id + "/users"

    querystring = {"offset": offset, "limit": limit}

    headers = {'Content-Type': 'application/json', 'Authorization': 'bearer ' + access_token}

    response = requests.request("GET", url, headers=headers, params=querystring)

    v_members = response.json()
    v_total_member = v_members["total"]
    v_member_items = v_members["users"]
    return v_member_items, v_total_member


offset = 0
limit = 100
department_id = '-----J----.LgfiSm:2:----.MNjFBE'
total_member_items = []
print('##########################################################################')
print(f'开始查询:{department_id}')
while True:
    member_items, total_members = get_department_members(offset, limit, department_id)
    print(f'成员:第{(offset // limit) + 1}页:{member_items}')

    # 将当前页的成员列表添加到总列表中
    total_member_items.extend(member_items)
    if len(total_member_items) >= total_members:
        break
    # 更新分页查询的起始位置
    offset += limit

print(f'合计:{total_members}个成员')
print(f'成员信息汇总:{total_member_items}')

运行结果

image