2012-12-08 61 views
2

我正在向python请求一个返回AMF的web服务。我不知道它是AMF0还是AMF3。Python解码AMF响应

r = requests.post(url, data=data) 
>>> r.text 
u'\x00\x03...' 

Full data here

我如何可以采取r.text并将其转换为一个Python对象或类似的?我发现amfast,但它的Decoder类返回一个3.131513074181806e-294假设为AMF3 AMF0和None。 (两者都不正确)

from amfast.decoder import Decoder 
decoder = Decoder(amf3=False) 
obj = decoder.decode(StringIO.StringIO(r.text)) 
+0

您可以发布amfast解码代码吗? –

+0

编辑的问题包含解码代码。 – Jake

+0

杰克,阅读文档表明,Decoder.decode需要一个字符串。你可以在没有StringIO调用的情况下尝试吗? –

回答

4

我看到你的代码有两个问题,第一个是用r.text返回二进制数据。改为使用r.content。第二个问题是使用decoder.decode方法,它解码一个对象而不是数据包。改为使用decoder.decode_packet

from amfast.decoder import Decoder 
decoder = Decoder(amf3=True) 
obj = decoder.decode_packet(r.content) 

使用Pyamf也适用,使用r.content

+1

您的示例使用'r.content'为我工作 – Jake

4

你试过PyAMF了。

from pyamf import remoting 
remoting.decode(data) 
+0

不幸的是我得到'pyamf.DecodeError:不支持的ActionScript类型' – Jake

+0

为我工作:remoting.decode(r.content)在这种情况下。不支持的ActionScript类型可能是因为您没有将正确的字节传递给它(r.content) –