gpt4 book ai didi

python - 为什么我的 ZenDesk 宏正在更新,但实际上没有任何变化?

转载 作者:太空狗 更新时间:2023-10-30 02:17:51 25 4
gpt4 key购买 nike

我试图在 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 响应,但是 the response sent back向我展示了它们之前的宏,零变化。

我唯一想到的可能在某种程度上是错误的是我发送的数据的格式,或者类似的东西。但即便如此,我希望响应不会是 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')

(来源:https://github.com/kennethreitz/requests/blob/master/requests/models.py#L424)

由于值总是通过 json.dumps() 传递,如果您传递表示已编码 JSON 的字符串,它本身将被编码:

"{\'macro\': {\'actions\': [{\'field\': \'comment_value\', \'value\': [\'channel:all\', \'Spiffy New Sig that will Never Be Saved\']}]}}"

ZenDesk,在收到它不期望的 JSON 后,更新 updated_at 字段并且...不做任何其他事情。您可以通过传递一个空字符串来验证这一点 - 相同的结果。

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

response = requests.put(url, json={'macro': {'actions': updated_data}}, headers={"Content-Type": "application/json"}, auth=(user + "/token", pwd))

这应该符合您的预期。

关于python - 为什么我的 ZenDesk 宏正在更新,但实际上没有任何变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38923106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com