首先要安装相关的库,pip install py3amf,注意,py3amf只支持32位python环境,用64位python无法使用py3amf
要注意的是,在构造amf数据格式的时候对应的代码逻辑,单独的数据默认会有下标,有名称对应值的一般没有下标,
messaging.RemotingMessage()声明的数据属于content并且可以有多个且如果有多个默认按顺序有下标
amf协议的十六进制数据如果保存在文件中,也可以直接把该数据解析,在代码中有体现
这是在charles中的请求包
下面是代码,我代码里构造的integer少了几个,其他的跟上面的一样
import uuid
import pyamf
import requests
from pyamf import remoting
from pyamf.flex import messaging
# 构造flex.messaging.messages.RemotingMessage消息
msg= messaging.RemotingMessage()
msg0= messaging.RemotingMessage()
msg1= messaging.RemotingMessage()
msg=12
msg0=1909911,1910261
msg1=1
# 按AMF协议编码
req = remoting.Request(target='api.stone.challenge', body=(msg,msg0,msg1))
env = remoting.Envelope(amfVersion=pyamf.AMF3)
env.bodies = [('/1',req)]
data = bytes(remoting.encode(env).read())
# 设置请求头和cookie
header={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
'Accept':'*/*',
'Accept-Language':'zh-CN',
'x-flash-version':'34,0,0,282',
'Content-Type':'application/x-amf',
'Accept-Encoding':'gzip, deflate',
'User-Agent':'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)',
'Host':'这里写域名',
'Pragma':'no-cache',
'Cookie':'这里填种子',
'Connection':'keep-alive'
}
# 发送请求并且接收响应
url = '这里写目标地址'
req = requests.post(url,data,headers=header)
#打印响应报文
resp = remoting.decode(req.content)
print("响应:")
print(resp)
#打印请求报文
resp0 = remoting.decode(data)
print("请求:")
print(resp0)
'''
#python读取十六进制文件后amf解码
words=open("9",'rb')
sss=words.read()
resp1 = remoting.decode(sss)
print("请求:")
print(resp1)
'''