Python循环调用Zendesk用户API时第二页出现认证失败问题
问题分析与解决
核心原因
循环请求时重复传递分页参数,导致Zendesk API解析异常,返回了误导性的"认证失败"错误。
Zendesk返回的next链接已经包含了完整的分页参数(比如page[size]和分页游标page[after]),但你的循环代码每次请求都重复传递params={'page[size]':100},这会让最终请求的URL出现重复参数(比如...?page[size]=100&page[after]=xxx&page[size]=100),触发API的异常处理,返回认证失败的错误提示。而手动请求时没有重复传参,所以可以正常运行。
解决方案
修改循环逻辑,仅在第一次请求时传递分页参数,后续请求直接使用返回的next链接,不再传递params。
修改后的代码示例
# 替换成你的Zendesk API基础地址 base_url = "https://your-zendesk-domain/api/v2/users.json" params = {'page[size]': 100} url = base_url while url: # 第一次请求传参数,后续请求直接用完整的next链接 if url == base_url: response = requests.get(url, auth=(user, pwd), params=params) else: response = requests.get(url, auth=(user, pwd)) # 先检查响应状态,避免直接取字段报错 if response.status_code != 200: print(f"请求失败,状态码:{response.status_code},错误信息:{response.json()}") break data = response.json() for user in data['users']: sql_statement = "insert into ..." cursor.execute(sql_statement) if data['meta']['has_more']: url = data['links']['next'] else: url = None
更简洁的写法
直接把分页参数拼到初始URL中,后续请求完全依赖返回的next链接:
base_url = "https://your-zendesk-domain/api/v2/users.json?page[size]=100" url = base_url while url: response = requests.get(url, auth=(user, pwd)) if response.status_code != 200: print(f"请求失败:{response.json()}") break data = response.json() for user in data['users']: sql_statement = "insert into ..." cursor.execute(sql_statement) if data['meta']['has_more']: url = data['links']['next'] else: url = None
额外建议
- 每次请求后先检查响应状态码,避免因错误响应(比如认证失败、请求超限)直接访问
data['users']导致KeyError。 - 可以打印循环中每次请求的完整URL,确认参数是否重复,方便排查问题。
内容的提问来源于stack exchange,提问作者WhoYouExpect
相关产品推荐
相关产品推荐

