API开放平台场景示例:cursor、offset、limit分页处理(邮件组、子账号)
时间:2025-09-09 16:22:01 作者:阿里邮箱服务中心-郑老师一、cursor游标分页数据
从前一次调用的返回值中获取“nextCursor”的值,作为下一次调用的请求参数。
以“批量获取组织下组信息”为例
Python示例代码
# -*- coding: utf-8 -*-import requests# 导入获取访问令牌的函数,路径根据实际情况进行修改,或直接给access_token赋值用于测试from api_demo.get_access_token import access_tokendef 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}')
运行结果
二、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_tokendef 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 = 0limit = 100department_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 += limitprint(f'合计:{total_members}个成员')print(f'成员信息汇总:{total_member_items}')
运行结果
TAG标签: