Форум сайта python.su
Добрый день.
Столкнулся с такой проблемой. Надо работать с сервисом http://www.popfax.com через SOAP.
В доке есть только примеры на PHP. Искал на питоне подходящий клиент для SOAP который бы мог отправлять вложенные файлы. Нашел что можно использовать suds с дополнительной оберткой.
Но возникла проблема: Не могу понять как правильно подключится к сервису. Как сформировать заголовки. Как обращаться к методам.
В доке такой код:
$usernameToken = array(
'email' => $username,
'password' => $password
);
$wsse_ns = "http://schemas.xmlsoap.org/ws/2002/07/secext";
$SoapVarUser = new SoapVar($username, XSD_STRING, NULL, $wsse_ns, NULL, $wsse_ns);
$SoapVarPass = new SoapVar($password, XSD_STRING, NULL, $wsse_ns, NULL, $wsse_ns);
$wsse_auth = new SoapVar($usernameToken, SOAP_ENC_OBJECT, NULL, $wsse_ns, 'AuthenticationHeader', $wsse_ns);
$header=new SoapVar($wsse_auth, SOAP_ENC_OBJECT, NULL, $wsse_ns, 'Security', $wsse_ns);
$wsse_header = new SoapHeader($wsse_ns, 'AuthenticationHeader', $header, true);
$wsdl = "https://api3.popfax.com/?service=Popfax&wsdl";
$client = new SoapClient($wsdl);
$client->__setSoapHeaders(array($wsse_header));
$response = $client->__SoapCall('PopfaxService.getAccountInfo',array());
Офлайн
Примерно так:
from suds.client import Client from suds.transport.http import HttpAuthenticated wsdl = "https://api3.popfax.com/?service=Popfax&wsdl" t = HttpAuthenticated(username='elmer', password='fudd') c = Client( wsdl, transport=t ) print c result = getattr(c.service, "PopfaxService.getAccountInfo")() print result
Офлайн
Попробовал выполнить этот код:
url = 'https://api3.popfax.com/?service=Popfax&wsdl'
from suds.client import Client
from suds.transport.http import HttpAuthenticated
t = HttpAuthenticated(username='savao', password='savao')
c = Client( url, transport=t )
result = getattr(c.service, “PopfaxService.authenticate”)()
Traceback (most recent call last):
…
WebFault: Server raised fault: ‘No XML root element’
Тогда попробовал добавить еще и wsse авторизацию:
from suds.wsse import *
>>> security = Security()
>>> token = UsernameToken('savao', ‘savao’)
>>> security.tokens.append(token)
>>> c.set_options(wsse=security)
>>> result = getattr(c.service, “PopfaxService.authenticate”)()
Traceback (most recent call last):
…
WebFault: Server raised fault: ‘Error 107’
107 - это не авторизовало.
Логин и пароль вроде верные (в данном примере я их поменял, естественно, потому что это аккаунт заказчика).
Офлайн
Так сейчас попробовал с логином и паролем выполнить исходный код на php результат тот же, ошибка 107.
Так что видимо не в питоновском коде дело, а проблема на той стороне.
Офлайн