Необходимо получить или преобразовать данные с сайта, чтобы быть действительным JSON - PullRequest
0 голосов
/ 01 июня 2018

Я работаю над сценарием, который будет получать данные с веб-сайта (сайт исправлений 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.

1 Ответ

0 голосов
/ 01 июня 2018

json.loads(ciscodata) возвращает массив словарей.

Оператор o_node = (jsonarray.get('identifier')) не выполняется, поскольку он пытается получить ключ словаря, когда jsonarray представляет собой список.

Попробуйте o_node = jsonarray[0].get('identifier')

Я не уверен, почему у вас есть парены вокруг jsonarray - их не должно быть.

В общем, вы можете сделать что-то вроде:

for elem in jsonarray:
    identifier = elem.get('identifier')
    title = elem.get('title')
    ... etc
    do_something(identifier, title, ...)

Это облегчает отладку, потому что вы можете проверить значения, которые вы получаете от вызова API.

Если вы всегда получаете одни и те же ключи в своем словаре, вы можете пропустить это назначение и просто выполнить

for elem in jsonarray:
    do_something(elem.get('key1'), elem.get('key2'), ...)`

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...