1

我正在编写一系列脚本来自动执行网络托管控制台 ISPConfig 上的任务。实际上,您不需要知道,因为这个问题是关于形成 XML 的。出于……原因……我想用 Python 而不是 PHP 来完成这项任务。我的第一个脚本的目的是为给定域创建新邮箱,并且我有一些现有的 PHP 代码可以处理。

事情进展顺利。尽管文档有些简洁,但我已经达到了我的脚本与 API 通信并发送参数的地步,pysimplesoap 调用如下所示。

client = pysimplesoap.client.SoapClient(location=SOAP_LOCATION,
                                        namespace=SOAP_URI, trace=True)
response = client.login(username=console_login, password=console_pass)
session_id = str(response.children().children().children())
params = {
          'server_id': 1,
          'email': mailbox.mail_id,
          'login': mailbox.mail_id,
          'password': mailbox.mail_pass,
           # plus more params here ...
         }
response = client.mail_user_add(session=session_id,
                                client=client_id, params=params)
client.logout(session=session_id)

没有抛出任何错误,登录和注销工作正常,但是使用 ISPConfig 控制台检查,创建了一个完全空白的邮箱。同时,PHP 中的相同调用会产生填充邮箱。

在让两种语言都向屏幕发出各自的响应和请求后,问题出在哪里就变得很清楚了……

对服务器的 Python SOAP 请求(使用上面的代码)

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n
<soap:Header/>\n
<soap:Body>\n    
    <mail_user_add xmlns="https://localhost:8080/remote/">\n  
    <session>8a7d6bc047a299974385f7e988570bc4</session>
    <params>
        <server_id>1</server_id>
        <email>someone@domain.com</email>
        <login>someone@domain.com</login>
        <blah>the rest of the params...</blah>
    </params>
    <client>0</client>
    </mail_user_add>\n
</soap:Body>\n
</soap:Envelope>

对服务器的 PHP SOAP 请求

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://66.212.164.9:8080/remote/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>
<ns1:mail_user_add>
<param0 xsi:type="xsd:string">b0048bd548a3062a3dbcbc49bc74a39c</param0>
<param1 xsi:type="xsd:int">0</param1>
<param2 xsi:type="ns2:Map">
    <item>
        <key xsi:type="xsd:string">server_id</key>
        <value xsi:type="xsd:int">1</value>
    </item>
    <item>
        <key xsi:type="xsd:string">email</key>
        <value xsi:type="xsd:string">someone@domain.com</value>
    </item>
    <item>
        <key xsi:type="xsd:string">login</key>
        <value xsi:type="xsd:string">someone@domain.com</value>
    </item>
    <item> ... </item>
</param2>
</ns1:mail_user_add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

出色地。该死。我应该如何让 pysimplesoap 以上述格式创建请求,以便 API 可以正确使用它们?

(除非它出现这是一个绝望的情况,我正在使用来自https://github.com/pysimplesoap/pysimplesoap的更新的 pysimplesoap 1.16还有 python3)

PS 不幸的是,ISPConfig 似乎没有提供我刚刚开始阅读的神秘文档 WSDL。了解这一点可能很重要,并且排除了 suds-jurko 客户作为 B 计划,尽管它看起来也不错。引用没有 WSDL:http ://bugtracker.ispconfig.org/index.php?do=details&task_id=1273 引用不能使用 suds:https://lists.fedoraproject.org/pipermail/suds/2010-February/000702。 html

4

0 回答 0