Python 为什么我的ZenDesk宏正在更新,但实际上没有发生任何更改?

Python 为什么我的ZenDesk宏正在更新,但实际上没有发生任何更改?,python,python-2.7,zendesk-api,Python,Python 2.7,Zendesk Api,我试图在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) lo

我试图在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
正在执行其任务)。我确保请求发送回一个OK响应。因此,我发送更新的数据,得到200个响应,但显示的宏与以前一样,没有任何更改

在某种程度上,我唯一觉得可能是错误的是我发送的数据的格式,或者类似的东西。但即使那样,我也希望反应不是200,然后


我在这里遗漏了什么?

看起来您正在对PUT请求中的JSON数据进行双重编码:

response = requests.put(url, json="{'macro': {'actions': %r}}" % updated_data, headers={"Content-Type": "application/json"}, auth=(user + "/token", pwd))
json参数需要一个对象,然后将该对象尽职尽责地编码为json并作为请求体发送;这只是一种方便;实施过程很简单,

    if not data and json is not None:
        # urllib3 requires a bytes-like body. Python 2's json.dumps
        # provides this natively, but Python 3 gives a Unicode string.
        content_type = 'application/json'
        body = complexjson.dumps(json)
        if not isinstance(body, bytes):
            body = body.encode('utf-8')
(来源:)

由于值始终通过
json.dumps()
传递,因此如果传递表示已编码json的字符串,则其本身将被编码:

"{\'macro\': {\'actions\': [{\'field\': \'comment_value\', \'value\': [\'channel:all\', \'Spiffy New Sig that will Never Be Saved\']}]}}"
ZenDesk在收到它不期望的JSON后,会更新位于字段的
updated\u,然后。。。除此之外什么都不做。您可以通过传递一个空字符串来验证这一点-相同的结果

注意,您还依赖Python的repr格式来填充JSON;这可能也是个坏主意。相反,让我们重建宏对象,并让请求对其进行编码:

response = requests.put(url, json={'macro': {'actions': updated_data}}, headers={"Content-Type": "application/json"}, auth=(user + "/token", pwd))
这应该符合你的期望