Я работаю над сценарием, который будет получать данные с веб-сайта (сайт исправлений Cisco), и на основе полученных данных мне нужно опубликовать его на другом сайте (управление событиями ServiceNow).POST должен быть REST / JSON с определенными ключами, чтобы это работало.
У меня достаточно кода для получения данных, и у меня есть код для работы POST.
У меня трудныйвремя с преобразованием данных, которые я получаю из GET, чтобы отобразить их в действительные пары значений ключей JSON в POST.
Я использую следующий код для получения списка новых исправлений с веб-сайта Cisco.Я получаю правильные данные, но формат, если данные не такие, как я могу использовать их для публикации в другом инструменте в формате JSON (используя разные ключи, но значения из возвращенной информации.
Это работает -
def getjson(ciscourl):
response = urllib.request.urlopen(ciscourl)
ciscodata = response.read().decode("utf-8")
return json.loads(ciscodata)
Данные, которые я получаю, выглядят так, как показано ниже (в результате этого запроса было получено 2 исправления):
[{"identifier":"cisco-sa-20180521-cpusidechannel","title":"CPU Side-Channel Information Disclosure Vulnerabilities: May 2018","version":"1.5","firstPublished":"2018-05-22T01:00:00.000+0000","lastPublished":"2018-05-31T20:44:16.123+0000","workflowStatus":null,"id":1,"name":"Cisco Security Advisory","url":"https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20180521-cpusidechannel","severity":"Medium","workarounds":"No","cwe":null,"cve":"CVE-2018-3639,CVE-2018-3640","ciscoBugId":"","status":"Updated","summary":"On May 21, 2018, researchers disclosed two vulnerabilities that take advantage of the implementation of speculative execution of instructions on many modern microprocessor architectures to perform side-channel information disclosure attacks. These vulnerabilities could allow an unprivileged, ","totalCount":6,"relatedResource":[]},{"identifier":"cisco-sa-20180516-firepwr-pb","title":"Cisco Firepower Threat Defense Software Policy Bypass Vulnerability","version":"1.0","firstPublished":"2018-05-16T16:00:00.000+0000","lastPublished":"2018-05-16T16:00:00.000+0000","workflowStatus":null,"id":1,"name":"Cisco Security Advisory","url":"https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20180516-firepwr-pb","severity":"Medium","workarounds":"No","cwe":"CWE-693","cve":"CVE-2018-0297","ciscoBugId":"CSCvg09316","status":"New","summary":"A vulnerability in the detection engine of Cisco Firepower Threat Defense software could allow an unauthenticated, remote attacker to bypass a configured Secure Sockets Layer (SSL) Access Control (AC) policy to block SSL traffic.The vulnerability is due to the incorrect handling ","totalCount":6,"relatedResource":[]}]
Я могу извлечь из этого значения, как таковые print(jarray.get('identifier'))
но мне трудно сопоставить эти значения с моей собственной картой JSON с ключами, которые я определяю. Поэтому значение из ключа identifier
, которое я получил, необходимо сопоставить ключу с именем "node"
в моей карте JSON.
Я пробовал json.loads
, json.load
, json.dump
, json.dumps
. Каждый раз, когда возникает ошибка Тип ошибки.
Это код, в котором яя в замешательстве:
def createJson(l):
#try:
jsonarray = l
o_source = "CiscoUpdatePatchChecker"
o_node = (jsonarray.get('identifier')) #this does not work
o_metric_name = ("Critical")
o_type = ("test")
o_resource = ("test_resource")
o_description = jsonarray #this works
o_event_class = ("test event class")
o_additional_info = jsonarray
print ("-" * 50)
print (o_source, o_node, o_metric_name, o_type, o_resource, o_description, o_event_class, o_additional_info)
print ("-" * 50)
data = {"source": o_source, "node": o_node, "metric_name": o_metric_name, "type": o_type, "resource": o_resource, "event_class": o_event_class, "description": o_description, "additional_info": o_additional_info}
return json.dumps(data)
# except:
#pass
Помимо этого, остальная часть кода просто отправляет данные в работающий ITSM -
def postjson(data):
# try:
url = posturl
auth = HTTPBasicAuth(username, password)
head = {'Content-type': 'application/json',
'Accept': 'application/json'}
payld = data
ret = requests.post(url, auth=auth , data=payld, headers=head)
# sys.stdout.write(ret.text)
returned_data = ret.json()
print(returned_data)
Поэтому моя проблема заключается в сопоставлении данныхЯ возвращаюсь к своим ключам: парам значений в карте JSON, и мне нужно будет зацикливать код столько раз, сколько nКоличество патчей получено.В настоящее время я планирую включить в свою основную функцию количество карт JSON, для которых требуется POST.
Сейчас я просто беру все полученные данные и сопоставляю все данные, которые получаю, с "description"
и "additional_info"
поле.Это работает, и я могу публиковать данные в порядке.
Это очень поможет мне, если кто-то может указать мне примеры того, как манипулировать данными, которые я получаю из моего запроса GET.