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标签: