Python - zeep - соединение WSDL / как это сделать?

Я только неделю изучаю python, мне нужно подключиться к сервису WSDL, для этого я выбрал Python3. Само подключение - т.е. простое заполнение полей входа кажется простым. У меня проблема с заполнением большой формы. Как вы это делаете? Как не переписывать целые имена структур?

Я получаю учетные данные таким образом:

import zeep
import requests
import urllib3

requests.packages.urllib3.disable_warnings()
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'HIGH:!DH:!aNULL'
ewus_login2 = "https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/Auth?wsdl"
ewus_service2 = "https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/ServiceBroker?wsdl"
transport = zeep.Transport()

login = "XXXXXXXXXX"
nfz = "XX"
kod_personelu = "XXXXXXXX"
haslo = "AAAAAAAAAAAA"
param = {"item": [{"name": "domain", 'value': {"stringValue": '01'}},{"name": "idntLek", 'value': {"stringValue": kod_personelu}},{"name": "login", 'value': {"stringValue": login}},{"name": "type", 'value': {"stringValue": 'LEK'}}]}



client = zeep.Client(wsdl=ewus_login2,transport=transport)

odp=client.service.login(credentials=param, password=haslo)
print(odp.body)
print("SESSION_ID:",odp.header.session.id)
print("TOKEN:",odp.header.token.id)

хорошо, и теперь мне нужно получить некоторые данные:

client2 = zeep.Client(wsdl=ewus_service, transport=transport)
client2.wsdl.dump()

я стал:

Prefixes:
     xsd: http://www.w3.org/2001/XMLSchema
     ns0: http://xml.kamsoft.pl/ws/broker
     ns1: http://www.w3.org/2005/05/xmlmime
     ns2: http://xml.kamsoft.pl/ws/common
     ns3: http://wsdl.kamsoft.pl/common

Global elements:

     ns0:executeService(ns0:ServiceRequest)
     ns0:executeServiceReturn(ns0:ServiceResponse)
     ns2:authToken(id: xsd:string)
     ns2:authTokenError(ns2:AuthTokenException)
     ns2:authenticationError(ns2:AuthenticationException)
     ns2:authorizationError(ns2:AuthorizationException)
     ns2:inputError(ns2:InputException)
     ns2:location(ns2:ServiceLocation)
     ns2:passExpiredError(ns2:PassExpiredException)
     ns2:serverError(ns2:ServerException)
     ns2:serviceError(ns2:ServiceException)
     ns2:session(id: xsd:string)
     ns2:sessionError(ns2:SessionException)

Global types:
     xsd:anyType
     xsd:ENTITIES
     xsd:ENTITY
     xsd:ID
     xsd:IDREF
     xsd:IDREFS
     xsd:NCName
     xsd:NMTOKEN
     xsd:NMTOKENS
     xsd:NOTATION
     xsd:Name
     xsd:QName
     xsd:anySimpleType
     xsd:anyURI
     xsd:base64Binary
     xsd:boolean
     xsd:byte
     xsd:date
     xsd:dateTime
     xsd:decimal
     xsd:double
     xsd:duration
     xsd:float
     xsd:gDay
     xsd:gMonth
     xsd:gMonthDay
     xsd:gYear
     xsd:gYearMonth
     xsd:hexBinary
     xsd:int
     xsd:integer
     xsd:language
     xsd:long
     xsd:negativeInteger
     xsd:nonNegativeInteger
     xsd:nonPositiveInteger
     xsd:normalizedString
     xsd:positiveInteger
     xsd:short
     xsd:string
     xsd:time
     xsd:token
     xsd:unsignedByte
     xsd:unsignedInt
     xsd:unsignedLong
     xsd:unsignedShort
     ns1:base64Binary(xsd:base64Binary, contentType: ns1:contentType)
     ns1:hexBinary(xsd:hexBinary, contentType: ns1:contentType)
     ns0:ArrayOfParam(item: ns0:Param[])
     ns0:Param(name: xsd:string, value: xsd:string)
     ns0:Payload(textload: {_value_1: ANY}, streamload: {stream: ns1:base64Binary, name: xsd:string})
     ns0:Service(location: ns2:ServiceLocation, date: xsd:dateTime, params: ns0:ArrayOfParam, payload: ns0:Payload)
     ns0:ServiceRequest(location: ns2:ServiceLocation, date: xsd:dateTime, params: ns0:ArrayOfParam, payload: ns0:Payload)
     ns0:ServiceResponse(location: ns2:ServiceLocation, date: xsd:dateTime, params: ns0:ArrayOfParam, payload: ns0:Payload)
     ns2:ArrayOfMessage(Message: xsd:string[])
     ns2:AuthTokenException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
     ns2:AuthenticationException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
     ns2:AuthorizationException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
     ns2:BaseException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
     ns2:InputException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
     ns2:PassExpiredException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
     ns2:ServerException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
     ns2:ServiceException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
     ns2:ServiceLocation(namespace: xsd:string, localname: xsd:string, version: xsd:string, id: xsd:string)
     ns2:SessionException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)

Bindings:
     Soap11Binding: {http://xml.kamsoft.pl/ws/broker}ServiceBrokerSoapBinding

Service: ServiceBroker
     Port: ServiceBroker (Soap11Binding: {http://xml.kamsoft.pl/ws/broker}ServiceBrokerSoapBinding)
         Operations:
            executeService(id: xsd:string) -> location: ns2:ServiceLocation, date: xsd:dateTime, params: ns0:ArrayOfParam, payload: ns0:Payload

теперь я должен сгенерировать что-то вроде этого:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://xml.kamsoft.pl/ws/common" xmlns:brok="http://xml.kamsoft.pl/ws/broker">
   <soapenv:Header>
      <com:session id="${SessionIDAuthToken#SessionID}" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/>
      <com:authToken id="${SessionIDAuthToken#AuthToken}" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/>
   </soapenv:Header>
   <soapenv:Body>
      <brok:executeService>
         <com:location>
            <com:namespace>nfz.gov.pl/ws/broker/cwu</com:namespace>
            <com:localname>checkCWU</com:localname>
            <com:version>3.0</com:version>
         </com:location>
         <brok:date>2008-09-12T09:37:36.406+01:00</brok:date>
         <brok:payload>
            <brok:textload>
               <ewus:status_cwu_pyt xmlns:ewus="https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3">
                  <ewus:numer_pesel>ASKED_PESEL</ewus:numer_pesel>
                  <ewus:system_swiad nazwa="client-eWUŚ" wersja="1.0.0"/>
               </ewus:status_cwu_pyt>
            </brok:textload>
         </brok:payload>
      </brok:executeService>
   </soapenv:Body>
</soapenv:Envelope>

Я мог бы просто сохранить этот XML в файл, поместить его в нужные места, например. #%, а затем динамически вставьте значения в нужные места, а затем отправьте их на сервер в виде RAW. Я хочу сделать это элегантно. Как с помощью zeep сгенерировать такой файл как выше, как заполнить данные: Auth Token, ASKED PESEL, дату генерации?

на данный момент у меня так много:

header = zeep.xsd.ComplexType([
    zeep.xsd.Element('session', zeep.xsd.String()),
    zeep.xsd.Element('authToken', zeep.xsd.String())
])
header_v = header('my session ID ',"my token ID")
print(header_v)

пока не знаю что делать! пожалуйста помоги! я нашел что-то вроде

config = client.type_factory('ns3').loginParams()
print(config)

обновлено 13 сентября 2019 г.

до сих пор у меня есть это:

'''
location
'''
location = client2.get_type('ns1:ServiceLocation')
location_ = location(namespace='nfz.gov.pl/ws/broker',
                     localname='checkCWU', version='3.0')
'''
date
'''
dt = datetime.datetime.now()  # strftime('%Y-%m-%dT%H:%M:%S.000Z',gmtime())

'''
payload
'''
payLoad = client2.get_type('ns2:Payload')
payLoadH = zeep.xsd.Element(
    '{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}status_cwu_pyt', zeep.xsd.ComplexType([
        zeep.xsd.Element('numer_pesel', zeep.xsd.String()),
        zeep.xsd.Element('system_swiad',zeep.xsd.ComplexType([
            zeep.xsd.Attribute('nazwa', zeep.xsd.String()),
            zeep.xsd.Attribute('wersja',zeep.xsd.String())
            ])
            )
        ])
        )
payloadH_=payLoadH('PESEL',{'AFYA_Python3','1.0.0'})
payLoad_ = payLoad(textload=payloadH_)

#authToken = client2.get_type('ns1:authToken')
authToken_={'id':'ID AUTH TOKENA'}

#sessionId = client2.get_type('ns1:session')
sessionId_={'id':'ID SESJI'}

soapheaders={'session':sessionId_,'token':authToken_}

sR = client2.service.executeService(
    location=location_, date=dt, payload=payLoad_,_soapheaders=soapheaders)

и я не знаю, что я делаю неправильно

Traceback (most recent call last):
  File "/home/marcin/.vscode/extensions/ms-python.python-2019.9.34911/pythonFiles/ptvsd_launcher.py", line 43, in <module>
    main(ptvsdArgs)
  File "/home/marcin/.vscode/extensions/ms-python.python-2019.9.34911/pythonFiles/lib/python/ptvsd/__main__.py", line 432, in main
    run()
  File "/home/marcin/.vscode/extensions/ms-python.python-2019.9.34911/pythonFiles/lib/python/ptvsd/__main__.py", line 316, in run_file
    runpy.run_path(target, run_name='__main__')
  File "/usr/lib/python3.7/runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "/usr/lib/python3.7/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/marcin/SynologyDrive/Serwery/html/recepta.py", line 111, in <module>
    location=location_, date=dt, payload=payLoad_)#, _soapheaders=soapheaders)
  File "/usr/local/lib/python3.7/dist-packages/zeep/proxy.py", line 42, in __call__
    self._op_name, args, kwargs)
  File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 132, in send
    return self.process_reply(client, operation_obj, response)
  File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 194, in process_reply
    return self.process_error(doc, operation)
  File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 299, in process_error
    detail=fault_node.find('detail'))
zeep.exceptions.Fault: org.apache.axis2.databinding.ADBException: Unexpected subelement system_swiad

но я думаю, что что-то не так с моей полезной нагрузкойH, потому что: если я это сделаю:

node = client2.create_message(
    client2.service, 'executeService', location=location_,date=dt,payload=payLoad_,_soapheaders=soapheaders)
print("NODE:>>",lxml.etree.tostring(node))

я стал:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"><soap-env:Header><ns0:session xmlns:ns0="http://xml.kamsoft.pl/ws/common" id="ID SESJI"/><ns1:authToken xmlns:ns1="http://xml.kamsoft.pl/ws/common" id="ID AUTH TOKENA"/></soap-env:Header><soap-env:Body><ns0:executeService xmlns:ns0="http://xml.kamsoft.pl/ws/broker"><ns1:location xmlns:ns1="http://xml.kamsoft.pl/ws/common"><ns1:namespace>nfz.gov.pl/ws/broker</ns1:namespace><ns1:localname>checkCWU</ns1:localname><ns1:version>3.0</ns1:version></ns1:location><ns0:date>2019-09-13T09:35:49.210468</ns0:date><ns0:payload><ns0:textload><numer_pesel>PESEL</numer_pesel><system_swiad/></ns0:textload></ns0:payload></ns0:executeService></soap-env:Body></soap-env:Envelope>

и как Вы видите: я должен стать:


            <brok:textload>
               <ewus:status_cwu_pyt xmlns:ewus="https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3">
                  <ewus:numer_pesel>ASKED_PESEL</ewus:numer_pesel>
                  <ewus:system_swiad nazwa="client-eWUŚ" wersja="1.0.0"/>
               </ewus:status_cwu_pyt>
            </brok:textload>

и я имею

<ns0:textload>
<numer_pesel>PESEL</numer_pesel>
<system_swiad/>
</ns0:textload>
</ns0:payload>

person blackmoon    schedule 12.09.2019    source источник


Ответы (1)


Я решил это:

payLoadH = zeep.xsd.Element('{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}none',  zeep.xsd.ComplexType([
    zeep.xsd.Element(
        '{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}status_cwu_pyt', zeep.xsd.ComplexType([
            zeep.xsd.Element(
                '{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}numer_pesel', zeep.xsd.String()),
            zeep.xsd.Element('{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}system_swiad', zeep.xsd.ComplexType([
            zeep.xsd.Attribute('nazwa', zeep.xsd.String()),
            zeep.xsd.Attribute('wersja',zeep.xsd.String())
            ])
            )
        ])
    )
])
)

payLoadH_=payLoadH({'numer_pesel':login,'system_swiad':{'nazwa':'AFYA_Python3','wersja':'1.0.0'}})
person blackmoon    schedule 13.09.2019