Python 3 Zeep Войти и готовить ie проблемы? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь использовать Zeep для использования ресурса списка рассылки Sympa SOAP. У меня есть код ниже:

    from zeep import Client, Settings
    from zeep.transports import Transport
    from requests import Session

    session = Session()
    settings = Settings(strict=False)

    client = Client('https://lists.mycompany.com/lists/wsdl',
                    transport=Transport(session=session), settings=settings)

    response = client.service.login(email='me',
                                    password='memememememe.')

    response = client.service.lists(topic="", subtopic="")
    print(response)

Я не уверен, что должен содержать ответ от метода login, но в отладчике PyCharm это None. Я предполагаю, что шаг login должен установить куки, но я не вижу доказательств этого.

Когда я тогда вызываю метод lists, я получаю исключение, которое говорит, что пользователь не авторизован.

Есть ли какое-то соглашение о вызовах, которое я пропускаю?

Я нашел более старую, python2, SYMPA speci c библиотеку, которая работает, но я потратил так много времени на поиск в Zeep, что просто хочу чтобы понять, что я делаю неправильно.

Приветствия

Редактировать Я пропустил модуль Settings в примере кода.

Edit 2

(venv) C:\Users\ME\PycharmProjects\SoapTest>python -mzeep https://lists.mycompany.com/lists/wsdl
C:\Users\ME\PycharmProjects\SoapTest\venv\lib\site-packages\zeep\wsdl\wsdl.py:338: UserWarning: The wsdl:message for '{https://lists.mycompany.com/lists/wsdl}whichResponse' contains an invalid part ('return'): invalid xsd type or elements
  warnings.warn(str(exc))
C:\Users\ME\PycharmProjects\SoapTest\venv\lib\site-packages\zeep\wsdl\definitions.py:137: UserWarning: The wsdl:operation 'which' was not found in the wsdl:portType '{https://lists.mycompany.com/lists/wsdl}SympaPort'
  warnings.warn(str(exc))

Prefixes:
     xsd: http://www.w3.org/2001/XMLSchema
     ns0: https://lists.mycompany.com/lists/wsdl
     ns1: http://schemas.xmlsoap.org/soap/encoding/

Global elements:
     ns1:Array(ns1:Array)
     ns1:ENTITIES(ns1:ENTITIES)
     ns1:ENTITY(ns1:ENTITY)
     ns1:ID(ns1:ID)
     ns1:IDREF(ns1:IDREF)
     ns1:IDREFS(ns1:IDREFS)
     ns1:NCName(ns1:NCName)
     ns1:NMTOKEN(ns1:NMTOKEN)
     ns1:NMTOKENS(ns1:NMTOKENS)
     ns1:NOTATION(ns1:NOTATION)
     ns1:Name(ns1:Name)
     ns1:QName(ns1:QName)
     ns1:Struct(ns1:Struct)
     ns1:anyType(xsd:anyType)
     ns1:anyURI(ns1:anyURI)
     ns1:base64Binary(ns1:base64Binary)
     ns1:boolean(ns1:boolean)
     ns1:byte(ns1:byte)
     ns1:date(ns1:date)
     ns1:dateTime(ns1:dateTime)
     ns1:decimal(ns1:decimal)
     ns1:double(ns1:double)
     ns1:duration(ns1:duration)
     ns1:float(ns1:float)
     ns1:gDay(ns1:gDay)
     ns1:gMonth(ns1:gMonth)
     ns1:gMonthDay(ns1:gMonthDay)
     ns1:gYear(ns1:gYear)
     ns1:gYearMonth(ns1:gYearMonth)
     ns1:hexBinary(ns1:hexBinary)
     ns1:int(ns1:int)
     ns1:integer(ns1:integer)
     ns1:language(ns1:language)
     ns1:long(ns1:long)
     ns1:negativeInteger(ns1:negativeInteger)
     ns1:nonNegativeInteger(ns1:nonNegativeInteger)
     ns1:nonPositiveInteger(ns1:nonPositiveInteger)
     ns1:normalizedString(ns1:normalizedString)
     ns1:positiveInteger(ns1:positiveInteger)
     ns1:short(ns1:short)
     ns1:string(ns1:string)
     ns1:time(ns1:time)
     ns1:token(ns1:token)
     ns1:unsignedByte(ns1:unsignedByte)
     ns1:unsignedInt(ns1:unsignedInt)
     ns1:unsignedLong(ns1:unsignedLong)
     ns1:unsignedShort(ns1:unsignedShort)


Global types:
     xsd:anyType
     ns1:Array(_value_1: ANY[], arrayType: xsd:string, offset: ns1:arrayCoordinate, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:ENTITIES(xsd:ENTITIES, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:ENTITY(xsd:ENTITY, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:ID(xsd:ID, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:IDREF(xsd:IDREF, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:IDREFS(xsd:IDREFS, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:NCName(xsd:NCName, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:NMTOKEN(xsd:NMTOKEN, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:NMTOKENS(xsd:NMTOKENS, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:NOTATION(xsd:QName, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:Name(xsd:Name, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:QName(xsd:QName, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:Struct(_value_1: ANY[], id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:anyURI(xsd:anyURI, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:arrayCoordinate
     ns1:base64
     ns1:base64Binary(xsd:base64Binary, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:boolean(xsd:boolean, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:byte(xsd:byte, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:date(xsd:date, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:dateTime(xsd:dateTime, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:decimal(xsd:decimal, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:double(xsd:double, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:duration(xsd:duration, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:float(xsd:float, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:gDay(xsd:gDay, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:gMonth(xsd:gMonth, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:gMonthDay(xsd:gMonthDay, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:gYear(xsd:gYear, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:gYearMonth(xsd:gYearMonth, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:hexBinary(xsd:hexBinary, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:int(xsd:int, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:integer(xsd:integer, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:language(xsd:language, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:long(xsd:long, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:negativeInteger(xsd:negativeInteger, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:nonNegativeInteger(xsd:nonNegativeInteger, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:nonPositiveInteger(xsd:nonPositiveInteger, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:normalizedString(xsd:normalizedString, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:positiveInteger(xsd:positiveInteger, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:short(xsd:short, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:string(xsd:string, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:time(xsd:time, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:token(xsd:token, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:unsignedByte(xsd:unsignedByte, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:unsignedInt(xsd:unsignedInt, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:unsignedLong(xsd:unsignedLong, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns1:unsignedShort(xsd:unsignedShort, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     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
     ns0:ArrayOfLists(_value_1: listType[], arrayType: xsd:string, offset: ns1:arrayCoordinate, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns0:ArrayOfString(_value_1: string[], arrayType: xsd:string, offset: ns1:arrayCoordinate, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
     ns0:bounce(firstBounceDate: xsd:int, lastBounceDate: xsd:int, bounceCount: xsd:int, bounceScore: xsd:int)
     ns0:listType(listAddress: xsd:string, homepage: xsd:string, isSubscriber: xsd:boolean, isOwner: xsd:boolean, isEditor: xsd:boolean, subject: xsd:string, firstBo
unceDate: xsd:int, lastBounceDate: xsd:int, bounceCount: xsd:int, bounceCode: xsd:int)

Bindings:
     Soap11Binding: {https://lists.mycompany.com/lists/wsdl}SOAP

Service: SympaSOAP
     Port: SympaPort (Soap11Binding: {https://lists.mycompany.com/lists/wsdl}SOAP)
         Operations:
            add(list: xsd:string, email: xsd:string, gecos: xsd:string, quiet: xsd:boolean) -> return: xsd:boolean
            amI(list: xsd:string, function: xsd:string, user: xsd:string) -> return: xsd:boolean
            authenticateAndRun(email: xsd:string, cookie: xsd:string, service: xsd:string, parameters: ns0:ArrayOfString) -> return: ns0:ArrayOfString
            authenticateRemoteAppAndRun(appname: xsd:string, apppassword: xsd:string, vars: xsd:string, service: xsd:string, parameters: ns0:ArrayOfString) -> return
: ns0:ArrayOfString
            casLogin(proxyTicket: xsd:string) -> return: xsd:string
            checkCookie() -> email: xsd:string
            closeList(list: xsd:string) -> return: xsd:boolean
            complexLists() -> return: ns0:ArrayOfLists
            complexWhich() -> return: ns0:ArrayOfLists
            createList(list: xsd:string, subject: xsd:string, template: xsd:string, description: xsd:string, topics: xsd:string) -> return: xsd:boolean
            del(list: xsd:string, email: xsd:string, quiet: xsd:boolean) -> return: xsd:boolean
            getUserEmailByCookie(cookie: xsd:string) -> return: xsd:string
            info(listName: xsd:string) -> return: ns0:listType
            lists(topic: xsd:string, subtopic: xsd:string) -> listInfo: xsd:string
            login(email: xsd:string, password: xsd:string) -> return: xsd:string
            review(list: xsd:string) -> return: ns0:ArrayOfString
            signoff(list: xsd:string, email: xsd:string) -> return: xsd:boolean
            subscribe(list: xsd:string, gecos: xsd:string) -> return: xsd:boolean

Edit 3

Похоже, что I am аутентифицируется в методе login. Я прошел весь процесс. Запрос возвращает ответ статуса 200, но дальнейшая обработка возвращает значение None. Ответ SOAP:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <loginResponse xmlns="urn:sympasoap">
            <result xsi:type="xsd:string">9ff202249b103c67f6aa8a0612ed14a54c</result>
        </loginResponse>
    </soap:Body>
</soap:Envelope>

Затем я переключаю свое внимание на метод lists. Я перехожу через это, и запрос возвращает 500 ответов. Ответ SOAP:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>User not authentified</faultstring>
            <detail xsi:type="xsd:string">You should login first</detail>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

1 Ответ

0 голосов
/ 06 мая 2020

Правки 2 и 3 выше были дикими goose погонями.

Я думаю, что у меня есть ответ на мой собственный вопрос. Это неудовлетворительно, и я пока не знаю, как ее решить.

Проблема в том, что сервер SOAP, к которому я пытаюсь связаться, устарел. Моя компания, вероятно, не будет обновлять его в ближайшее время. Эта старая версия устанавливает значение Sympa SESSION-ID, сгенерированное на сервере, в устаревшем заголовке http-cookie2.

Похоже, что Zeep использует объект requests.Session.cookies, который является объектом RequestsCookies. Кажется, что используются стандартные политики повара ie, и мне нужно изменить политику fc2965 на True. Я еще не понял, как это сделать, и это будет мой следующий вопрос.

...