gpt4 book ai didi

python - 通过 Python 和 SUDS 访问 Kashoo API。身份验证 token 中的时间格式问题

转载 作者:行者123 更新时间:2023-11-28 19:27:29 24 4
gpt4 key购买 nike

我正在尝试访问此 API https://www.kashoo.com/api-docs在 Python 中使用 SUDS。

我使用的 Python 代码如下:

>>> from suds.client import Client
>>> client = Client('https://www.kashoo.com/api/v1?wsdl')
>>> token = client.service.doLogin('username', 'password', 'www.kashoo.com', 'en_US', 3000000)

authToken 的创建没有问题:

>>> print token
(authToken){
_authenticationCode = "crxQRveuVaDb6swKCJaQKKPiYaY="
_expiryDate = 2011-07-10 12:49:28.000702
_locale = "en_US"
_myUserId = 531772668
_site = "www.kashoo.com"

问题是当我尝试对 token 进行编码并制作编码的身份验证字符串时

>>>encodedtoken = client.service.encodeAuthToken(token)
Traceback (most recent call last):
File "<console>", line 0, in <module>
File "C:\Python27\lib\suds\client.py", line 542, in __call__
return client.invoke(args, kwargs)
File "C:\Python27\lib\suds\client.py", line 602, in invoke
result = self.send(soapenv)
File "C:\Python27\lib\suds\client.py", line 649, in send
result = self.failed(binding, e)
File "C:\Python27\lib\suds\client.py", line 702, in failed
r, p = binding.get_fault(reply)
File "C:\Python27\lib\suds\bindings\binding.py", line 265, in get_fault
raise WebFault(p, faultroot)
WebFault: Server raised fault: 'Token authentication code is incorrect'

问题似乎是 token 中的时间格式。调用 doLogin 函数收到的信封如下:

 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:doLoginResponse xmlns:ns2="https://www.kashoo.com/api/">
<token authenticationCode="0WM1DgdaAFrJ7Yz4Up2UWnbVsZk=" expiryDate="2011-07-11T03:33:24.046-07:00" locale="en_US" myUserId="531772668" site="www.kashoo.com"/>
</ns2:doLoginResponse>
</soap:Body>
</soap:Envelope>

如果我使用类似 soapUI 的工具在 Kashoo API 中传递该 token ,它没有问题。但是,当我使用 SUDS 从 Python 调用 encodeAuthToken 函数时,会生成以下 SOAP 信封:

<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://www.kashoo.com/api/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns0:Body>
<ns1:encodeAuthToken>
<token authenticationCode="0WM1DgdaAFrJ7Yz4Up2UWnbVsZk=" expiryDate="2011-07-11T11:33:24.000046+01:00" locale="en_US" myUserId="531772668" site="www.kashoo.com"/>
</ns1:encodeAuthToken>
</ns0:Body>
</SOAP-ENV:Envelope>

注意 expiryDate 属性的时间格式是如何改变的:

 <token authenticationCode="0WM1DgdaAFrJ7Yz4Up2UWnbVsZk=" expiryDate="2011-07-11T03:33:24.046-07:00" locale="en_US" myUserId="531772668" site="www.kashoo.com"/>
<token authenticationCode="0WM1DgdaAFrJ7Yz4Up2UWnbVsZk=" expiryDate="2011-07-11T11:33:24.000046+01:00" locale="en_US" myUserId="531772668" site="www.kashoo.com"/>

在收到的 token 中,时间以毫秒为单位指定,而在传递的 token 中,时间以微秒为单位指定。

问题解决了。

在SUDS库中,我修改了218行的suds.sax.date模块来替换

            return dt.time(hour, minute, second, ms)

            return dt.time(hour, minute, second, 1000 * ms)

现在当我获得 token 时,时间属性被正确解释并传递

>>> print token1
(authToken){
_locale = "en_US"
_authenticationCode = "JQyior8Qprg3+3wuZo8B5JnN3c8="
_myUserId = 531772668
_site = "www.kashoo.com"
_expiryDate = 2011-07-11 18:36:38.136000
}
>>> token2 = client.service.encodeAuthToken(token1)
>>> print token2
6454e3af-b09d-4484-90b3-ea2632ab9fe4

我是编程新手,解决方案远非优雅,但似乎可行。

感谢@dobesv 的反馈和指导。

最佳答案

如果您可以生成 HTTP 请求和响应“通过网络”进行的内容的日志,它可能有助于诊断问题。您看起来确实在做正确的事。

是否有其他调用有效? service.getMyBusinesses(token) 怎么样?

您还可以考虑使用 REST API 而不是 SOAP,看看是否有帮助。

关于python - 通过 Python 和 SUDS 访问 Kashoo API。身份验证 token 中的时间格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com