使用帮助中心API备份知识库亚博官方app
您可以使用Zendesk RES亚博T API为知识库中的所有文章创建备份副本。亚博官方app如果您需要检查或恢复到文章的以前版本,备份可能很有用。
仅用34行Python代码就可以备份帮助中心。然后,您可以使用第二个27行脚本恢复任意数量的文章。
免责声明: 亚博Zendesk提供本文仅用于教学目的。亚博Zendesk不支持或保证该代码。亚博Zendesk也不能提供对第三方技术的支持,比如Python。
你需要什么
你需要一个文本编辑器和一个命令行界面,就像Windows中的命令提示符或Mac上的Terminal一样。你还需要Python 3和一个特殊的库来发出HTTP请求。
要设置您的开发环境:
如果您还没有Python 3,请从上面下载并安装http://www.python.org/download/.Python是一种强大但初学者友好的脚本和编程语言,具有清晰易读的语法。参观Python网站了解更多。
如果您使用的是Python 3.3或更早版本,请下载并安装皮普,一个用于安装和管理Python包的简单工具。看到这些指令.
请注意:如果你有Python 3.4或更高版本,你已经有了pip。跳过。
在命令行界面中使用以下pip命令下载并安装请求图书馆,一个让Python中的HTTP请求变得简单的库:
Pip3安装请求
如果您使用的是Python 3.3或更早版本,请使用
皮普
而不是pip3
在命令行中。最后,在复制本教程中的示例时,请确保精确地按所示缩进行。在Python中缩进很重要。
如果您在完成本教程后有兴趣深入了解Python,请参阅以下免费资源:亚博电脑端
- 认为Python艾伦·b·唐尼著
- 深入了解Python 3作者:Mark Pilgrim
这个计划
目标是在知识库中用特定语言备份所有文章。亚博官方app您希望能够根据需要在不同时间备份知识库中的每种语言而运行脚本尽可能多的次数。亚博官方app
下面是脚本创建备份时必须执行的基本任务:
- 从知识库下载文章的HTML。亚博官方app
- 为每篇文章在硬盘上的一个文件夹中创建一个HTML文件。
- 创建备份日志,以便以后参考。
备份文章中的图像超出了本文的范围。这可能会在以后的教程中介绍。
创建Python文件
创建一个名为备份你想下载备份的地方。
在文本编辑器中,创建一个名为make_backup.py并保存在你的新备份文件夹中。
在编辑器中,将以下行添加到文件中。
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
亚博=“https://your_subdomain.亚博zendesk.com”
语言=“some_locale”
首先导入请求库,用于发出HTTP请求的第三方Python库。您应该早点安装它。看到你需要什么.
的凭证变量指定您的Zendesk支持登录电子邮件和密码亚博。在运行脚本之前,替换占位符your_亚博zendesk_email而且your_亚博zendesk_password用实际值。例子:
凭证='(电子邮件保护)',' 3 w00tfawn56 '
出于安全原因,仅在准备运行脚本时输入密码。完成后删除它。
的亚博变量标识Zendesk Support实例。亚博的语言变量指定要备份的文章的语言。将占位符值替换为您自己的。例子:
亚博=“https://obscura.亚博zendesk.com”
语言=“en - us”
看到支持的语言的语言代码的有效值语言.
此外,确保在Zendesk支持url中包含“https://'”。亚博
为备份创建文件夹
在本节中,您告诉脚本在您的目录中自动创建文件夹备份文件夹来存储备份。该文件夹将具有以下结构,以便轻松组织多种语言的多个备份:
/备份
/2015-01-24
/在-我们
导入本机操作系统而且datetime脚本顶部的库:
进口操作系统
进口datetime
在脚本的最后一行之后添加以下几行:
日期=datetime.日期.今天()
backup_path=操作系统.路径.加入(str(日期),语言)
如果不操作系统.路径.存在(backup_path):
操作系统.makedirs(backup_path)
脚本获取今天的日期并将其与您的日期一起使用语言变量构建新路径。当脚本运行时,backup_path可能是2015-01-24/en-US。
然后该脚本检查该目录是否已经存在(以防您在同一天早些时候运行该脚本)。如果没有,则创建该目录。
到目前为止,你的脚本应该是这样的:
进口操作系统
进口datetime
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
亚博=“https://your_subdomain.亚博zendesk.com”
语言=“some_locale”
日期=datetime.日期.今天()
backup_path=操作系统.路径.加入(str(日期),语言)
如果不操作系统.路径.存在(backup_path):
操作系统.makedirs(backup_path)
您可以测试这段代码。方法指定了区域设置语言变量(此时凭证不重要),导航到您的备份文件夹,然后从命令行运行脚本,如下所示:
python3 make_backup.py
目录中创建文件夹备份文件夹的当前日期和值语言变量。
获取一种语言的所有冠词
在本节中,您将向Help Center API发送请求,以获取指定语言的所有文章。你将在Articles API中使用以下端点:
GET / api / v2 / help_center /{地区}/ articles.json
中记录了端点本节的API参考。
重要的:请确保以下行缩进如下所示的文本。每个缩进使用四个空格。
在脚本中,通过在脚本的最后一行之后添加以下语句来创建最终端点url(不要使用任何换行符):
端点=亚博+' / api / v2 / help_center /{地区}/ articles.json '.格式(语言环境=语言.较低的())
在请求中使用端点之前,需要将Zendesk Support url预先添加到字符串中,并为亚博
{地区}
占位符。该语句从您指定的Zendesk Support url、文档中的端点路径和您指定的文章语亚博言构建最终url。你的价值语言变量被插入(或内插)在{地区}
字符串中的占位符。中列出的一些区域设置语言代码有大写字母,而API期望小写字母,语言为安全起见,变量转换为小写。
使用本教程中的示例,最终端点url如下所示:
“https://obscura.亚博zendesk.com/api/v2/help_center/en-us/articles.json”
使用端点url发出HTTP请求并保存来自API的响应。
响应=请求.得到(端点,身份验证=凭证)
该语句使用请求对象的
get ()
方法。端点变量向API发出GET请求。该方法包含一个名为身份验证它指定您的基本身份验证凭据。检查请求是否有错误,如果发现错误就退出:
如果响应.status_code! =200:
打印(“无法检索带有错误{}的文章”.格式(响应.status_code))
退出()
根据API文档,如果请求成功,API返回状态码200。换句话说,如果状态代码不是200(如果响应。Status_code != 200),然后出错了。该脚本打印错误消息并退出。
如果没有发现错误,解码并将响应赋值给一个变量(不缩进):
数据=响应.json()
Zend亚博esk REST API返回格式化为的数据JSON.的
json ()
方法。请求库将数据解码到Python字典中。字典只是一组格式几乎与JSON相同的键/值对。示例字典:{'id': 35436, 'author_id': 88887, 'draft': true}
请参考Zendesk A亚博PI文档,以找出如何数据字典是结构化的。例如,根据文章的API文档,API返回的JSON具有以下结构:
你可以从文件中推断出数据字典由一个名为文章.它的值是一个项目列表,如方括号所示。列表中的每一项都是一个文章属性字典,如花括号所示。
使用你对数据结构的新知识来检查到目前为止的结果:
为文章在数据[“文章”]:
打印(文章[“id”])
该代码段迭代遍历您的数据字典并打印每篇文章的id。这只是用于测试的临时代码。你可以用它来打印文章正文
文章(的身体)
,但在控制台中扫描这么多HTML可能会很麻烦。我们将在完成测试后删除打印语句。
到目前为止,你的脚本应该如下所示:
进口操作系统
进口datetime
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
亚博=“https://your_subdomain.亚博zendesk.com”
语言=“some_locale”
日期=datetime.日期.今天()
backup_path=操作系统.路径.加入(str(日期),语言)
如果不操作系统.路径.存在(backup_path):
操作系统.makedirs(backup_path)
端点=亚博+' / api / v2 / help_center /{地区}/ articles.json '.格式(语言环境=语言.较低的())
响应=请求.得到(端点,身份验证=凭证)
如果响应.status_code! =200:
打印(“无法检索带有错误{}的文章”.格式(响应.status_code))
退出()
数据=响应.json()
为文章在数据[“文章”]:
打印(文章[“id”])
将所有占位符替换为实际值,并从命令行再次运行脚本:
python3 make_backup.py
您应该得到一个包含最多30个文章id的列表,以确认文章已成功检索。即使您有更多的文章,也不会看到超过30篇,因为API限制了数量,以防止带宽和内存问题。在下一节中,更改脚本以对所有结果进行分页。
对结果进行分页
在本节中,通过对文章结果进行分页来查看所有文章。端点返回的JSON最多只包含30条记录,但它也包含一个next_page
属性使用结果下一页的端点URL(如果有的话)。例子:
“next_page”:“https://example.亚博zendesk.com/api/v2/en-US/articles.json?page=2”,
...
如果没有下一页,则值为null:
“next_page”:零,
...
您的代码将检查next_page
财产。如果不为空,它将使用指定的URL发起另一个请求。如果为null,它将停止。要了解更多信息,请参见在列表中分页.
在端点变量声明后插入以下一行(突出显示):
端点=亚博+' / api / v2 / help_center /{地区}/ articles.json '.格式(语言环境=语言.较低的())
而端点:
属性后面的所有行缩进
而
声明。而端点:
响应=请求.得到(端点,身份验证=凭证)
如果响应.status_code! =200:
打印(“无法检索带有错误{}的文章”.格式(响应.status_code))
退出()
数据=响应.json()
为文章在数据[“文章”]:
打印(文章[“id”])
添加下面的语句作为最后一行并缩进它:
端点=数据[“next_page”]
这将设置一个循环来对结果进行分页。而端点变量为true,换句话说,当它包含一个url时,就会发出一个请求。获取并显示一页结果之后,脚本将为
next_page
属性端点变量。如果值仍然是url,循环将再次运行。如果该值为空,例如当API返回结果的最后一页时,循环将停止。
修改后的代码应该如下所示:
而端点:
响应=请求.得到(端点,身份验证=凭证)
如果响应.status_code! =200:
打印(“无法检索带有错误{}的文章”.格式(响应.status_code))
退出()
数据=响应.json()
为文章在数据[“文章”]:
打印(文章[“id”])
端点=数据[“next_page”]
从命令行再次运行脚本:
python3 make_backup.py
您应该在知识库中获得该语言的所有文章的列表。亚博官方app
下一步是在你的电脑上复制文章。
把文章写进文件
在本节中,您将为知识库中的所有文章创建HTML文件。亚博官方app
这里的转折是身体
文章的属性,如其名称所示,只包含正文的HTML。文章的标题没有包括在内。标题由另一个名为标题
.您将在编写文件之前将标题添加到文章的HTML中。
更换以下测试线:
打印(文章[“id”])
用以下几行:
如果文章[“身体”]是没有一个:
继续
标题=“h1 > <”+文章[“标题”]+“< / h1 >”
文件名=“{id} . html”.格式(id=文章[“id”])
与开放(操作系统.路径.加入(backup_path,文件名),模式=' w ',编码=“utf - 8”)作为f:
f.写(标题+' \ n '+文章[“身体”])
打印(“{id}复制!”.格式(id=文章[“id”]))
确保它们的缩进与打印语句的缩进相同。这些行执行以下任务:
- 跳过任何空白的文章
- 创建带有文章标题的H1标记
- 根据项目ID创建文件名,以保证名称的唯一性
- 属性在先前脚本创建的文件夹中创建一个文件backup_path变量
- 将标题、换行符和文章主体组合为一个字符串
- 将字符串写入文件
- 将消息打印到控制台,以便您可以跟踪备份操作的进度。
修改后的代码应该如下所示:
为文章在数据[“文章”]:
如果文章[“身体”]是没有一个:
继续
标题=“h1 > <”+文章[“标题”]+“< / h1 >”
文件名=“{id} . html”.格式(id=文章[“id”])
与开放(操作系统.路径.加入(backup_path,文件名),模式=' w ',编码=“utf - 8”)作为f:
f.写(标题+' \ n '+文章[“身体”])
打印(“{id}复制!”.格式(id=文章[“id”]))
如果文章正文为空白,则继续
语句中的其余步骤将略过为
循环并移动到列表中的下一篇文章。该逻辑防止脚本在Help Center中打印任何空白草稿,这些草稿可能充当未来内容的占位符。它还可以防止脚本在代码片段的倒数第二行(标题+“\n”+文章[“正文”]
)。
从命令行再次运行脚本:
python3 make_backup.py
该脚本将您所了解的所有文章写到您的语言文件夹中。在文本编辑器中打开几个文件以检查HTML。
创建备份日志
在本节中,您将创建一个备份日志,以便稍后引用。日志将包含一个csv文件,其中包含file、Title和Author ID列,以及备份的每篇文章的一行。
导入本机csv库在脚本顶部:
进口csv
创建以下内容日志变量(高亮显示)就在第一个前面端点变量声明:
日志=[]
端点=亚博+'/api/v2/help_center/...
...
变量声明了一个空列表。在将每篇文章写入文件后,脚本将使用关于文章的信息更新列表。
添加以下内容
log.append ()
语句(高亮显示)紧跟在print语句之后,并且与print语句的缩进级别相同:打印(“{id}复制!”.格式(id=文章[“id”]))
日志.附加((文件名,文章[“标题”],文章[“author_id”]))
编写完项目后,脚本将数据项追加到日志列表。双括号是有意的。你在追加一个Python元组,一种使用圆括号的列表。csv库使用元组向电子表格中添加行。每行由文件名、标题和作者id组成。
在脚本的底部添加以下行。第一行应与页边距齐平(无缩进和无换行):
与开放(操作系统.路径.加入(backup_path,“_log.csv”),模式=“wt”,编码=“utf - 8”)作为f:
作家=csv.作家(f)
作家.writerow((“文件”,“标题”,“作者身份”))
为文章在日志:
作家.writerow(文章)
在编写完所有文章之后,脚本创建一个名为_log.csv.下划线确保文件首先出现在任何文件浏览器中。中的每篇文章,脚本分别添加一个标题行和一行日志列表。
代码完成
您完成的脚本应该如下所示。您也可以通过点击下载副本make_backup.py.
进口操作系统
进口datetime
进口csv
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
亚博=“https://your_subdomain.亚博zendesk.com”
语言=“some_locale”
日期=datetime.日期.今天()
backup_path=操作系统.路径.加入(str(日期),语言)
如果不操作系统.路径.存在(backup_path):
操作系统.makedirs(backup_path)
日志=[]
端点=亚博+' / api / v2 / help_center /{地区}/ articles.json '.格式(语言环境=语言.较低的())
而端点:
响应=请求.得到(端点,身份验证=凭证)
如果响应.status_code! =200:
打印(“无法检索带有错误{}的文章”.格式(响应.status_code))
退出()
数据=响应.json()
为文章在数据[“文章”]:
如果文章[“身体”]是没有一个:
继续
标题=“h1 > <”+文章[“标题”]+“< / h1 >”
文件名=“{id} . html”.格式(id=文章[“id”])
与开放(操作系统.路径.加入(backup_path,文件名),模式=' w ',编码=“utf - 8”)作为f:
f.写(标题+' \ n '+文章[“身体”])
打印(“{id}复制!”.格式(id=文章[“id”]))
日志.附加((文件名,文章[“标题”],文章[“author_id”]))
端点=数据[“next_page”]
与开放(操作系统.路径.加入(backup_path,“_log.csv”),模式=“wt”,编码=“utf - 8”)作为f:
作家=csv.作家(f)
作家.writerow((“文件”,“标题”,“作者身份”))
为文章在日志:
作家.writerow(文章)
使用命令行导航到您的备份文件夹并运行脚本:
python3 make_backup.py
该脚本将知识库备份到一个语言文件夹中。亚博官方app它还创建了一个可以在电子表格应用程序中使用的日志文件。
恢复的文章
您可以使用第二个脚本恢复任何备份的文章,该脚本读取每个文件的内容,将其解析为HTML树以提取Help Center的标题和正文,并使用API更新Help Center中的文章。
本节中的脚本更新现有的文章;它不会创造新的。要创建,需要修改它以使用不同的端点,并为文章指定节和作者。
免责声明:虽然鼓励根据自己的需要定制脚本,但Zendesk强烈建议不要修改脚本以从备份恢复整个帮助中心。亚博该脚本将覆盖所有现有内容,包括自上次备份以来对项目所做的任何更新。这些变化无法逆转。该脚本用于逐个恢复选定的文章。
的2.4.2或更高版本请求图书馆。要检查您的版本,请运行PIP显示请求
在命令行。要升级,请运行PIP安装请求——升级
.
如果你还没有Beautiful Soup,你需要安装它。美丽的汤是一个用于解析、导航、搜索和修改HTML树的Python库。安装Beautiful Soup:
在命令行输入:
PIP安装beautifulsoup4
该命令下载并安装Beautiful Soup的最新版本。
安装lxml,一个与Beautiful Soup一起工作的HTML解析器:
PIP安装LXML
美丽的汤与一个解析器的数量.lxml解析器是最快的解析器之一。
要恢复选定的文章:
复制下面的脚本在一个新的文本文件,命名它restore_articles.py,并保存在你的备份文件夹与make_backup.py文件。
进口操作系统
进口请求
从bs4进口BeautifulSoup
#设置
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
亚博=“https://your_instance.亚博zendesk.com”
backup_folder=“20 xx-xx-xx”
语言=“en - us”
restore_list=[100000001,100000002]
#验证备份路径是否正确
backup_path=操作系统.路径.加入(backup_folder,语言)
如果不操作系统.路径.存在(backup_path):
打印('指定的备份路径不存在。检查文件夹名称和区域设置。)
退出()
#恢复文章
为文章在restore_list:
file_path=操作系统.路径.加入(backup_path,str(文章)+“html”)
与开放(file_path,模式=“r”,编码=“utf - 8”)作为f:
html_source=f.读()
树=BeautifulSoup(html_source,lxml的)
标题=树.h1.字符串.带()
树.h1.分解()
有效载荷={“翻译”:{“标题”:标题,“身体”:str(树.身体)}}
端点=' / api / v2 / help_center /文章/ {id} /翻译/ {loc} . json的.格式(id=文章,疯狂的=语言.较低的())
url=亚博+端点
响应=请求.把(url,json=有效载荷,身份验证=凭证)
如果响应.status_code= =200:
打印(“恢复文章{}”.格式(文章))
其他的:
打印(“更新文章{}失败,错误为{},{}”.格式(文章,响应.status_code,响应.原因))
将设置部分的占位符值替换为您自己的:
- 凭证-您的Zend亚博esk支持登录电子邮件和密码。安全最佳实践是只在运行脚本之前输入这些信息,然后在运行脚本之后删除它们。例子:
Credentials = '(电子邮件保护)”、“pasSw0rd0325”
- 亚博-您的Zend亚博esk支持实例。确保包含“https:\”。例子:
亚博Zendesk = 'https://omniwear.zendesk.com'
- backup_folder—备份脚本创建的文件夹名称。例子:
Backup_folder = '2017-01-04'
- 语言-与备份文件夹中的子文件夹对应的语言环境。例子:
语言= 'en-us'
- restore_list—条目id数组。例子:
Restore_list = [200459576, 201995096]
.
- 凭证-您的Zend亚博esk支持登录电子邮件和密码。安全最佳实践是只在运行脚本之前输入这些信息,然后在运行脚本之后删除它们。例子:
使用命令行导航到您的备份文件夹并运行脚本:
python3 restore_articles.py