我试图在ZenDesk上批量编辑我个人宏的签名,唯一的方法就是通过API。所以我写了一个快速的Python脚本来尝试:
import sys
import time
import logging
import requests
import re
start_time = time.time()
# Set up logging
logger = logging.getLogger()
log_handler = logging.StreamHandler(sys.stdout)
log_handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(funcName)s - line %(lineno)d"))
log_handler.setLevel(logging.DEBUG)
logger.addHandler(log_handler)
logger.setLevel(logging.DEBUG)
def doTheGet(url, user, pwd):
response = requests.get(url, auth=(user + "/token", pwd))
if response.status_code != 200:
logger.error("Status: %s (%s) Problem with the request. Exiting. %f seconds elapsed" % (response.status_code, response.reason, time.time() - start_time))
exit()
data = response.json()
return data
def doThePut(url, updated_data, user, pwd):
response = requests.put(url, json="{'macro': {'actions': %r}}" % updated_data, headers={"Content-Type": "application/json"}, auth=(user + "/token", pwd))
if response.status_code != 200:
logger.error("Status: %s (%s) Problem with the request. Exiting. %f seconds elapsed" % (response.status_code, response.reason, time.time() - start_time))
exit()
data = response.json()
return data
def getMacros():
macros = {}
data = doTheGet("https://mydomain.zendesk.com/api/v2/macros.json", "me@mydomain.com", "111tokenZZZ")
def getMacros(macro_list, page, page_count):
if not page:
for macro in macro_list:
if macro["restriction"] and macro["active"]:
if macro["restriction"]["type"] == "User":
macros[macro["id"]] = macro["actions"]
else:
for macro in macro_list:
if macro["restriction"] and macro["active"]:
if macro["restriction"]["type"] == "User":
macros[macro["id"]] = macro["actions"]
page_count += 1
new_data = doTheGet(page, "me@mydomain.com", "111tokenZZZ")
new_macs = new_data["macros"]
new_next_page = new_data["next_page"]
getMacros(new_macs, new_next_page, page_count)
macs = data["macros"]
current_page = 1
next_page = data["next_page"]
getMacros(macs, next_page, current_page)
return macros
def updateMacros():
macros = getMacros()
regular = "RegEx to match signature to be replaced$" #since some macros already have the updated signature
for macro in macros:
for action in macros[macro]:
if action["field"] == "comment_value":
if re.search(regular, action["value"][1]):
ind = action["value"][1].rfind("\n")
action["value"][1] = action["value"][1][:ind] + "\nNew signature"
return macros
macs = updateMacros()
for mac in macs:
doThePut("https://mydomain.zendesk.com/api/v2/macros/%d.json" % (mac), macs[mac], "me@mydomain.com", "111tokenZZZ")
现在,一切都按预期运行,我没有出错。当我转到ZenDesk上的宏并按上次更新对它们进行排序时,我确实看到脚本做了些什么,因为它们显示为今天最后一次更新。但是,它们没有任何变化。我确保我发送到的数据是经过编辑的(updateMacros
正在执行其工作)。我确保这些请求都能得到回复。所以我发送了更新的数据,得到了200个响应,但是the response sent back显示的宏和以前一样,没有任何变化。在
在我看来,唯一可能在某些方面出错的是我发送的数据的格式,或者类似的东西。但即便如此,我还是希望得到的答复不会是200,然后。。。在
我错过了什么?在
看起来您在PUT请求中对JSON数据进行了双重编码:
json参数需要一个对象,然后将其尽职地编码为json并作为请求的主体发送;这只是一个方便;实现简单地说
^{pr2}$(来源:https://github.com/kennethreitz/requests/blob/master/requests/models.py#L424)
由于该值是alwayspassed through
^{3}$json.dumps()
,因此如果传递一个表示已编码JSON的字符串,则它本身将被编码:ZenDesk在得到它不期望的JSON时,更新
updated_at
字段并。。。什么都不做。您可以通过传递一个空字符串来验证这一点-相同的结果。在请注意,您还依赖Python的repr格式来填充JSON;这可能也是个坏主意。相反,我们只需重建宏对象并让请求对其进行编码:
这应该符合你的期望。在
相关问题 更多 >
编程相关推荐