You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python GET请求中结合认证与参数实现Repsly表单数据分页导出?

解决Repsly API表单导出的参数传递与循环获取问题

我来帮你搞定这个问题!从你的测试结果能明显看出来:Repsly的这个表单导出接口,要求last_form_id作为URL路径的一部分,而不是普通的HTTP查询参数(也就是?key=value这种形式)。这就是你用params传递参数返回404,直接拼到URL里就正常的核心原因。

正确的实现思路

根据Repsly的文档要求,我们需要:

  • 首次请求时,把last_form_id设为0,拼到URL路径末尾
  • 每次请求后,解析响应中的LastID和TotalCount字段
  • 如果TotalCount不为0,就用LastID作为新的last_form_id构造下一个URL,继续请求
  • 直到TotalCount为0,停止循环,此时已获取全部数据

完整代码示例

import requests
import time

# 你的认证信息
username = 'XXXXXXX'
password = 'XXXXXXX'
user_pass = (username, password)

# 初始化变量
all_form_data = []
last_form_id = 0

while True:
    # 构造正确的URL:把last_form_id作为路径参数
    url = f"https://api.repsly.com/v3/export/forms/{last_form_id}"
    
    try:
        # 发起GET请求
        response = requests.get(url, auth=user_pass)
        # 主动抛出HTTP错误(比如404、500等)
        response.raise_for_status()
        
        # 解析响应JSON
        response_data = response.json()
        
        # 收集本次请求的数据(假设数据在'data'字段,你需要根据实际响应调整)
        if 'data' in response_data:
            all_form_data.extend(response_data['data'])
        
        # 获取元数据
        total_count = response_data.get('TotalCount', 0)
        current_last_id = response_data.get('LastID', 0)
        
        print(f"本次获取{len(response_data.get('data', []))}条数据,剩余{total_count}条")
        
        # 判断是否继续循环
        if total_count == 0:
            print("已获取全部数据,停止请求")
            break
        
        # 更新last_form_id为本次的LastID
        last_form_id = current_last_id
        
        # 可选:添加请求间隔,避免触发API限流
        time.sleep(1)
        
    except requests.exceptions.RequestException as e:
        print(f"请求出错:{e}")
        break
    except ValueError:
        print("响应不是有效的JSON格式")
        break

# 处理最终收集到的所有数据
print(f"总共获取到{len(all_form_data)}条表单数据")
# 这里可以添加保存数据到文件等逻辑

关键细节说明

  • URL构造方式:用f-string把last_form_id直接拼到URL路径里,完全符合Repsly接口的要求,而不是用params传递(那会生成查询参数,接口不识别)
  • 循环终止条件:严格遵循文档要求,当响应的TotalCount为0时停止循环
  • 异常处理:加入了raise_for_status()捕获HTTP错误,还有JSON解析异常的处理,避免脚本意外崩溃
  • 限流保护:添加了time.sleep(1),如果API有频率限制,可以根据实际情况调整间隔时间

为什么之前的params方式不行?

当你用params={'last_form_id':'0'}时,requests会把参数转换成查询参数,最终请求的URL是:

https://api.repsly.com/v3/export/forms/?last_form_id=0

但Repsly的接口期望的是路径参数形式:

https://api.repsly.com/v3/export/forms/0

这两种URL结构完全不同,所以接口会返回404表示路径不存在。

内容的提问来源于stack exchange,提问作者Des

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:37:40