Zapier 中的 JavaScript 使用分页循环 API 调用

Posted

技术标签:

【中文标题】Zapier 中的 JavaScript 使用分页循环 API 调用【英文标题】:JavaScript in Zapier to loop API calls using pagination 【发布时间】:2020-04-03 17:34:33 【问题描述】:

我在 Zapier 中有一个 GET 请求,使用此 API 从预订系统 MindBody 获取瑜伽课程列表; https://developers.mindbodyonline.com/PublicDocumentation/V6#get-classes

Zapier 确实具有自动获取“所有”结果的功能,即使最大限制为 200,Zap 也需要获取下一页结果。默认情况下,我可以获得 200 个结果的限制,偏移量为 0。

我需要 Zapier 获取前 200 个,将偏移量增加 200,得到 200-400 个结果,依此类推。最终结果可能是 650 个结果全部组合在 Zap 中,然后我可以在另一个任务中使用(计数、求和、查找等)

如何使用 Zapier Code 任务使用这些参数逐步循环/获取 JSON 列表中的所有项目:

响应正文中返回的分页信息示例:

https://developers.mindbodyonline.com/PublicDocumentation/V6#pagination

“分页响应”: “请求限制”:10, “RequestedOffset”:20, “页面大小”:10, “总成绩”:128 , “类”:[ . . . ]

今天在 Zapier 中的示例 GET 和响应;

输入样本数据(获取请求)

json_key:访问次数 展开:是的 标题: 内容类型:应用程序/json 站点编号:xxx API 密钥:xxx 姓名:xxx 网址:https://api.mindbodyonline.com/public/v6/client/clientvisits 数据: 限制:200 开始日期:2015-01-01T00:00:00 结束日期:2099-01-01T00:00:00 客户编号:xxx 偏移量:0 as_json:没有

返回的样本数据

访问: 1: 类 ID:xxx LastModifiedDateTime:0001-01-01T00:00:00Z 化妆:假 约会ID:0 服务名称: 预约性别偏好:无 结束日期时间:2019-12-11T08:15:00 客户编号:xxx 延迟取消:假 行动:无 服务编号: 站点编号:xxx 登录:真 开始日期时间:2019-12-11T07:15:00 员工编号:x 位置编号:x 网络注册:假 产品编号: 预约状态:无 编号:xxx 姓名:xxx 2: 类 ID:xxx LastModifiedDateTime:0001-01-01T00:00:00Z 化妆:假 约会ID:0 服务名称: 预约性别偏好:无 结束时间:2019-12-11T09:30:00 客户编号:xxx 延迟取消:假 行动:无 服务编号: 站点编号:xxx 登录:真 开始日期时间:2019-12-11T08:30:00 员工编号:xxx 位置编号:xx 网络注册:假 产品编号: 预约状态:无 编号:xxx 姓名:xxx

分页响应: 总结果:2 页面大小:2 请求偏移量:0 请求限制:

2019 年 12 月 19 日更新: 1) 呼叫端点; https://api.mindbodyonline.com/public/v6/client/clientvisits 带有查询参数; 开始日期:2015-01-01T00:00:00 结束日期:2099-01-01T00:00:00 偏移量:0 客户编号:XXX 限制:200 标头; 姓名:xxx 站点编号:xxx API 密钥:xxx 内容类型:application/json

Postman 中的示例响应: “分页响应”: “请求限制”:200, “请求偏移量”:0, “页面大小”:2, “总结果”:2 , “访问”:[ “约会ID”:0, "AppointmentGenderPreference": "无", “约会状态”:“无”, “ClassId”:xxx, “客户 ID”:“xxx”, "开始日期时间": "2019-04-27T09:45:00", "EndDateTime": "2019-04-27T10:45:00", “身份证”:xxx, "LastModifiedDateTime": "0001-01-01T00:00:00Z", “延迟取消”:假, “位置标识”:1, “化妆”:假, “名称”:“瑜伽巴雷”, “服务标识”:空, “登录”:是的, “员工编号”:xxx, “网络注册”:假, “行动”:“无” , “约会ID”:0, "AppointmentGenderPreference": "无", “约会状态”:“无”, “ClassId”:xxx, “客户 ID”:“xxx”, "开始日期时间": "2019-07-19T16:45:00", "EndDateTime": "2019-07-19T17:45:00", “身份证”:273726, "LastModifiedDateTime": "0001-01-01T00:00:00Z", “延迟取消”:假, “位置标识”:1, “化妆”:假, “名称”:“冥想”, “服务标识”:空, “登录”:是的, “员工编号”:xxx, “网络注册”:假, “行动”:“无” ]

如果 TotalResults = 201 或更多,则请求的偏移量应设置为 200 并再次循环,依此类推。我在响应中需要的唯一数据是“SignedIn”,如果所有 ClientVisits 都收集在一起,我可以在以后的步骤中计算或求和。希望这是有道理的!

【问题讨论】:

您是在 Developer 中执行此操作,还是通过 Zapier 的 Zap with Code 执行此操作? 代码。开发人员有分页,但根据 Zapier 支持,分页是用户必须手动调用的功能。听起来像代码,作为 Zap 中的一项任务,需要增加/循环分页请求。感谢您的帮助! 好的,所以我认为我们需要知道的内容如下。 1- 每个 Zap 步骤名称按顺序和其中的重要数据变量(图片可能更好)。 2 - 分页后数据的去向(第一个问题可能会回答这个问题)。即使您正确编码,某些 zaps 也不支持分页。 3 - 您目前拥有的 API 代码(使用虚拟名称作为令牌等私有信息)。 谢谢!这是 Zap 现在发生的事情并且有效。我将 'SignedIn:True' 算作最终结果。 我用示例 GET 和响应更新了问题。示例数据正在返回一个包含 2 个类及其属性的列表。您将在最后看到分页响应。如果 TOTALRESULTS 大于 200,则 GET 需要再次使用 OFFSET:200 来获得 200-400 的结果。 【参考方案1】:

我建议使用 Zapier 提供的 Python 代码模块来实现这一点。从您目前所描述的情况来看,您似乎正在使用 webhooks zap,这对于快速发出 HTTP 请求非常有用,但可能缺乏微调方面。

我不确定你想使用什么触发器来执行这个 zap 流,所以我假设你希望它在每天的特定时间发生一次。所以我们使用调度器 zap 作为触发器。操作步骤将由 Zapier 使用 Python 模块编写代码。请看下面的代码:

import requests

def send_request(url):

    headers = 
        "Api-Key" : "yourApiKey",
        "SiteId" : "yourSiteID",
        "Authorization" : "staffUserToken"
        

    result = requests.get(url, headers=headers)
    return result



def main():

    offset = 0
    limit = 50
    total_results = 0
    class_data = []

    while True:
        result = send_request(f"api.mindbodyonline.com/public/v6/ckass/classes?limit=limit&offset=offset")

        if not result.ok: # Bad request
            break

        result = result.json()

        if not total_results:
            total_results = result.get('PaginationResponse', ).get('TotalResults', 0)

        if offset >= total_results: # We have exceeded the total number of results available
            break

        temp_class_data = result.get('Classes')
        for data in temp_class_data:
            class_data.append(
                    "ClassScheduleID" : data.get("ClassScheduleID"),
                    "Clients" : data.get("Clients"),
                    "MaxCapacity" : data.get("MaxCapacity"),
                    "TotalBooked" : data.get("TotalBooked")
                    )

        offset += limit

    return class_data

return main()

使用 Python 的 requests 库,您可以制定自己的 HTTP 请求。我们可以使用 while 循环对结果进行分页以增加我们的偏移量变量。我不使用此服务,因此我选择了一些任意数据点来返回您下一步想要使用的任何步骤。使用上面的代码,我将返回一个字典对象列表。因此,任何后续操作步骤都将对每个唯一结果执行。因此,如果在运行上述代码后,我的 class_data 列表包含 3 个单独的结果,则以下操作步骤将分别在每个步骤上执行。

希望这会有所帮助。我对你想要达到的目标做了一些假设。如果有任何不清楚的地方或您有任何其他问题,请告诉我。

【讨论】:

1) 使用查询参数调用端点api.mindbodyonline.com/public/v6/client/clientvisits 我想我无法将屏幕截图放入这些 cmets,所以我更新了这个问题。请参阅“UPDATE 12/19/2019:”以及端点、参数和示例 Postman 响应。谢谢!

以上是关于Zapier 中的 JavaScript 使用分页循环 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

Zapier (JavaScript) 的代码中的 getHours() 和 getUTCHours

为空时替换一个值(ZAPIER - Javascript)

Zapier:E164 GB/UK 手机号码解析,可以使用 Python/Javascript 完成吗?

Zapier中的状态输出到用友的Java代码的代码

如何从“Zapier 代码”(Javascript)读取文件输入

Zapier 打开 exe / Zapier 代码打开打开 exe 的 javascript