一个简单的脚本,就像您可以在basic Python教程中编写的脚本一样向票务API发出请求可以从Zendesk产品中获取多达24条左右的记录。亚博然而,要检索几百或几千条记录,脚本必须执行以下任务:

本文向您展示了如何编写一个Python脚本,该脚本可以使用Zendesk API检索大型数据集。亚博要运行这些示例,您需要Python 3请求图书馆

从API获得大型数据集后,您可能希望将其移动到Microsoft Excel工作表中,以便更轻松地查看和分析数据。想知道怎么做,请看用Python和pandas编写大型数据集到Excel

对于可以从Zendesk产品检索到的所有可能的数据,请参阅亚博支持帮助中心API文档。大多数api都有一个“List”端点来获取多个记录。

免责声明Ze亚博ndesk提供本文仅用于指导目的。亚博Zendesk不支持或保证代码。亚博Zendesk也不能为Python等第三方技术提供支持。

提出基本要求

假设您想在帮助中心下载某个社区主题中的4000篇文章。从基本的请求开始。创建一个名为list_posts.py并粘贴以下代码:

             
进口请求凭证“your_亚博zendesk_email”“your_亚博zendesk_password”会话请求会话会话身份验证凭证亚博“your_亚博zendesk_url”topic_id123456urlf '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json '响应会话得到url如果响应status_code! =200打印状态码错误{响应status_code}'退出数据响应jsontopic_posts扩展数据“文章”]帖子topic_posts打印帖子“标题”]

中解释了脚本的一般逻辑从Zendesk产品获取数据亚博在Python基础教程中。

替换占位符your_亚博zendesk_emailyour_亚博zendesk_password,your_亚博zendesk_url用你自己的价值观。Zend亚博esk支持URL应该是这样的https:// obscura.亚博zendesk.com。也可以替换的值topic_id使用帮助中心的社区主题id。

保存文件。在命令行工具中,导航到脚本所在的文件夹,并运行以下命令:

             
python3 list_posts.py

响应应该返回您指定的社区主题中的前30个帖子。

对所有结果进行分页

由于带宽的原因,API不会一次返回大量的记录集。使用页面(大小)参数中指定每页要返回的项数。大多数端点将此限制为最多100个。

要捕获所有记录,请创建一个while循环,将页面数据增量地存储在一个变量中,并继续分页,直到has_more属性嵌套在JSON对象为false。这表明没有进一步的记录。将突出显示的行添加到脚本中,这样做:

             
进口请求凭证“your_亚博zendesk_email”“your_亚博zendesk_password”会话请求会话会话身份验证凭证亚博“your_亚博zendesk_url”topic_id123456topic_posts]urlf '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100'url响应会话得到url如果响应status_code! =200打印状态码错误{响应status_code}'退出数据响应jsontopic_posts扩展数据“文章”]如果数据“元”]“has_more”]url数据“链接”]“下一个”]其他的url没有一个帖子topic_posts打印帖子“标题”]

有关逻辑的解释,请参见使用游标分页对列表进行分页

谨防速率限制

如果您在短时间内发出大量API请求,例如在对大型数据集进行分页时,您可能会碰到Zendesk API速率限制。亚博API将停止处理任何请求,直到经过一定的时间。有关更多信息,请参见使用限制在API参考文档中。

当达到速率限制时,API将使用HTTP进行响应请求太多响应代码。响应有一个Retry-After头,它告诉您在重试之前需要等待多少秒。

使用突出显示的行更新脚本以检查429状态码并等待,如果检测到:

             
进口时间进口请求凭证“your_亚博zendesk_email”“your_亚博zendesk_password”会话请求会话会话身份验证凭证亚博“your_亚博zendesk_url”topic_id123456topic_posts]urlf '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100'url响应会话得到url如果响应status_code= =429打印“速度有限!请稍等。”时间睡眠int响应“retry-after”]继续如果响应status_code! =200打印状态码错误{响应status_code}'退出数据响应jsontopic_posts扩展数据“文章”]如果数据“元”]“has_more”]url数据“链接”]“下一个”]其他的url没有一个帖子topic_posts打印帖子“标题”]

有关更多信息,请参见避免速率限制的最佳实践

假设您希望显示每个社区帖子的作者。post API返回的记录仅通过Zendesk Support用户id来标识作者,而不是通过他们的实际姓名。亚博例子:“author_id”:21436587

您可以调用用户API来获取与每个用户id相关联的名称。但是,这意味着要为数据集中的每个帖子调用API,这可能会导致数千次API调用。

一个更有效的解决办法是拷贝的用户记录与发帖记录相同。旁路加载在单个请求中获取两个记录集。有关更多信息,请参见加载相关记录

按照如下方式更新脚本(突出显示新行),以加载撰写帖子的用户。请确保水平滚动以查看修改后的内容url变量。

             
进口时间进口请求凭证“your_亚博zendesk_email”“your_亚博zendesk_password”会话请求会话会话身份验证凭证亚博“your_亚博zendesk_url”topic_id123456topic_posts]user_list]urlf '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100&include=users'url响应会话得到url如果响应status_code= =429打印“速度有限!请稍等。”时间睡眠int响应“retry-after”]继续如果响应status_code! =200打印状态码错误{响应status_code}'退出数据响应jsontopic_posts扩展数据“文章”]user_list扩展数据“用户”]如果数据“元”]“has_more”]url数据“链接”]“下一个”]其他的url没有一个帖子topic_posts作者“匿名”用户user_list如果用户“id”]= =帖子“author_id”]作者用户“名字”]打破打印f \”{帖子“标题”]}\”,{作者}'

对于每个帖子,脚本循环遍历用户记录列表寻找匹配项author_id价值。找到匹配项后,脚本将关联的用户名分配给作者变量并跳出循环。然后将作者的姓名与帖子标题一起打印出来。

序列化数据以重用它

假设您正在开发脚本,并且需要发出重复的API请求来测试和调试它。当您处理需要数百甚至数千个请求来获取所有数据的大型数据集时,这是一种浪费。相反,你只需打一个电话,序列化结果,然后根据需要多次重用序列化的数据。

序列化数据结构意味着将其转换为可以存储的格式,然后在同一环境中进行重建。对于Zendesk API返回的数据,JSON是一个不错的选择。亚博它还有一个额外的好处,就是易于阅读。在Python中,您可以使用内置的json模块序列化和反序列化一个数据结构。

用突出显示的行更新脚本以序列化所有的post和user数据:

             
进口json进口时间进口请求凭证“your_亚博zendesk_email”“your_亚博zendesk_password”会话请求会话会话身份验证凭证亚博“your_亚博zendesk_url”topic_id123456topic_posts]user_list]urlf '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100&include=users'url响应会话得到url如果响应status_code= =429打印“速度有限!请稍等。”时间睡眠int响应“retry-after”]继续如果响应status_code! =200打印状态码错误{响应status_code}'退出数据响应jsontopic_posts扩展数据“文章”]user_list扩展数据“用户”]如果数据“元”]“has_more”]url数据“链接”]“下一个”]其他的url没有一个topic_data{“文章”topic_posts“用户”user_list}开放“my_serialized_data_file.json”模式' w '编码“utf - 8”作为fjson转储topic_datafsort_keys真正的缩进2

该脚本将用户和post数据分配给名为主题,然后将其序列化为一个名为my_serialized_data_file.json在当前文件夹中。

然后你可以注释掉剩下的代码,并根据你想要测试和格式化输出的次数对字典进行反序列化:

             
进口json#注释掉其他所有内容开放“my_serialized_data_file.json”模式“r”作为f主题json负载f帖子主题“文章”]作者“匿名”用户主题“用户”]如果用户“id”]= =帖子“author_id”]作者用户“名字”]打破打印f \”{帖子“标题”]}\”,{作者}'

您可以使用相同的代码片段来开发其他脚本,而无需调用API。

现在您有了更新Python脚本的工具,可以使用API检索大型数据集。如果要将数据移至Microsoft Excel以查看和分析,请参见使用游标分页对列表进行分页

代码完成

             
进口json进口时间进口请求凭证“your_亚博zendesk_email”“your_亚博zendesk_password”会话请求会话会话身份验证凭证亚博“your_亚博zendesk_url”topic_id123456topic_posts]user_list]urlf '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100&include=users'url响应会话得到url如果响应status_code= =429打印“速度有限!请稍等。”时间睡眠int响应“retry-after”]继续如果响应status_code! =200打印状态码错误{响应status_code}'退出数据响应jsontopic_posts扩展数据“文章”]user_list扩展数据“用户”]如果数据“元”]“has_more”]url数据“链接”]“下一个”]其他的url没有一个topic_data{“文章”topic_posts“用户”user_list}开放“my_serialized_data_file.json”模式' w '编码“utf - 8”作为fjson转储topic_datafsort_keys真正的缩进2开放“my_serialized_data_file.json”模式“r”作为f主题json负载f帖子主题“文章”]作者“匿名”用户主题“用户”]如果用户“id”]= =帖子“author_id”]作者用户“名字”]打破打印f \”{帖子“标题”]}\”,{作者}'