Files
wechat_ipad_pro/clientsdk/cdnprotocol.go

1265 lines
47 KiB
Go
Raw Normal View History

2026-02-17 13:06:23 +08:00
package clientsdk
import (
"encoding/json"
"errors"
"fmt"
"strconv"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/clientsdk/baseutils"
"github.com/micro/go-micro/util/log"
)
// DecodeCdnData 解析Cdn加密的数据
func DecodeCdnData(data []byte) {
log.Info("DecodeCdnData ----------------------------------------- in")
headerLength := uint32(25)
// 解析头部
// 总长度
totalLength := baseutils.BytesToInt32(data[1:5])
log.Info("totalLength = ", totalLength)
// flag
flag := baseutils.BytesToInt32(data[5:7])
log.Info("flag = ", flag)
// weixinnum
winxinnum := baseutils.BytesToInt32SmallEndian(data[7:11])
log.Info("weixinnum = ", winxinnum)
// bodyLength
bodyLength := baseutils.BytesToInt32(data[21:25])
log.Info("bodyLength = ", bodyLength)
// 解析包体
body := data[headerLength:]
offset := uint32(0)
for offset < bodyLength {
fieldNameSize := baseutils.BytesToInt32(body[offset : offset+4])
fieldName := string(body[offset+4 : offset+4+fieldNameSize])
offset = offset + fieldNameSize + 4
valueSize := baseutils.BytesToInt32(body[offset : offset+4])
if offset+4 >= uint32(len(data)-25) {
log.Info(fieldName, " = ...(", valueSize, ")")
break
}
value := string(body[offset+4 : offset+4+valueSize])
offset = offset + valueSize + 4
if fieldName == "authkey" ||
fieldName == "sessionbuf" ||
fieldName == "thumbdata" ||
fieldName == "rsavalue" {
fmt.Println(fieldName, " = ", len(value))
// baseutils.PrintBytesHex([]byte(value), fieldName)
} else if fieldName == "filedata" {
log.Info("fileDataLen = ", len(value))
} else {
log.Info(fieldName, " = ", value)
}
// if fieldName == "sessionbuf" ||
// fieldName == "skeybuf" {
// userInfo := NewUserInfo()
// // userInfo.SessionKey = []byte{0x65, 0x2b, 0x79, 0x25, 0x68, 0x24, 0x2e, 0x40, 0x4c, 0x52, 0x57, 0x2a, 0x2a, 0x68, 0x6a, 0x53}
// userInfo.SessionKey = []byte{0x7b, 0x2e, 0x21, 0x2a, 0x68, 0x62, 0x3f, 0x63, 0x6b, 0x29, 0x61, 0x70, 0x6a, 0x77, 0x55, 0x4c}
// response := &wechat.CDNUploadMsgImgPrepareResponse{}
// ParseResponseData(userInfo, []byte(value), response)
// ShowObjectValue(response)
// }
}
log.Info("DecodeCdnData ----------------------------------------- out\n")
}
// GetErrStringByRetCode 获取错误信息
func GetErrStringByRetCode(retCode uint32) string {
if retCode == 4289864094 {
return "大小超过限制"
}
return strconv.Itoa(int(retCode))
}
// CreateID 加密生成ID
func CreateID(data []byte) uint32 {
length := len(data)
if length < 1 {
return 0
}
tmpTotalLength := uint32(length)
if length>>2 > 0 {
tmpLen := length>>2 + 1
index := 0
for tmpLen > 1 {
value0 := uint32(data[index])
value1 := uint32(data[index+1])
value2 := uint32(data[index+2])
value3 := uint32(data[index+3])
v5 := (value0 | (value1 << 8)) + tmpTotalLength
v6 := value2 | (value3 << 8)
tmpValue := (v5 ^ (v5 << 16) ^ (v6 << 11))
tmpTotalLength = tmpValue + (tmpValue >> 11)
index = index + 4
tmpLen = tmpLen - 1
}
}
caseValue := length & 3
if caseValue == 1 {
tmpValue0 := uint32(data[0])
tmpValue := tmpTotalLength + tmpValue0
tmpValue2 := tmpValue ^ (tmpValue << 10)
tmpTotalLength = tmpValue2 + (tmpValue2 >> 1)
}
if caseValue == 2 {
value0 := uint32(data[0])
value1 := uint32(data[1])
tmpValue0 := value0 | (value1 << 8)
tmpValue := tmpTotalLength + tmpValue0
tmpValue2 := tmpValue ^ (tmpValue << 11)
tmpTotalLength = tmpValue2 + (tmpValue2 >> 17)
}
if caseValue == 3 {
value0 := uint32(data[0])
value1 := uint32(data[1])
value2 := uint32(data[2])
tmpValue0 := (value0 | (value1 << 8)) + tmpTotalLength
tmpValue1 := tmpValue0 ^ (value2 << 18)
tmpValue2 := tmpValue1 ^ (tmpValue0 << 16)
tmpTotalLength = tmpValue2 + (tmpValue2 >> 11)
}
tmpValue0 := tmpTotalLength ^ (8 * tmpTotalLength)
tmpValue1 := tmpValue0 + (tmpValue0 >> 5)
tmpValue2 := tmpValue1 ^ (16 * tmpValue1)
tmpValue3 := tmpValue2 + (tmpValue2 >> 17)
tmpValue4 := tmpValue3 ^ (tmpValue3 << 25)
tmpValue5 := tmpValue4 + (tmpValue4 >> 6)
return tmpValue5
}
// ParseCdnResponseDataLength 解析cdn响应数据的总长度
func ParseCdnResponseDataLength(data []byte) uint32 {
totalLength := baseutils.BytesToInt32(data[1:5])
return totalLength
}
// PackCdnRequestElementUint32Pointer 请求字段*uint32元素
func PackCdnRequestElementUint32Pointer(fieldName string, value *uint32) []byte {
retData := make([]byte, 0)
// 写入字段名长度
fieldNameLength := uint32(len(fieldName))
fieldNameLengthData := baseutils.Int32ToBytes(fieldNameLength)
retData = append(retData, fieldNameLengthData[0:]...)
// 写入字段名称
retData = append(retData, ([]byte(fieldName))[0:]...)
// 字段值转成string
valueString := string("")
if value != nil {
valueString = strconv.Itoa(int(*value))
}
// 写入字段值字符串 长度
valueStringLength := uint32(len(valueString))
valueStringLengththData := baseutils.Int32ToBytes(valueStringLength)
retData = append(retData, valueStringLengththData[0:]...)
// 写入字段值字符串
retData = append(retData, ([]byte(valueString))[0:]...)
return retData
}
// PackCdnRequestElementUint32 请求字段uint32元素
func PackCdnRequestElementUint32(fieldName string, value uint32) []byte {
retData := make([]byte, 0)
// 写入字段名长度
fieldNameLength := uint32(len(fieldName))
fieldNameLengthData := baseutils.Int32ToBytes(fieldNameLength)
retData = append(retData, fieldNameLengthData[0:]...)
// 写入字段名称
retData = append(retData, ([]byte(fieldName))[0:]...)
// 字段值转成string
valueString := strconv.Itoa(int(value))
// 写入字段值字符串 长度
valueStringLength := uint32(len(valueString))
valueStringLengththData := baseutils.Int32ToBytes(valueStringLength)
retData = append(retData, valueStringLengththData[0:]...)
// 写入字段值字符串
retData = append(retData, ([]byte(valueString))[0:]...)
return retData
}
// PackCdnRequestElementData 请求字段[]byte元素
func PackCdnRequestElementData(fieldName string, value []byte) []byte {
retData := make([]byte, 0)
// 写入字段名长度
fieldNameLength := uint32(len(fieldName))
fieldNameLengthData := baseutils.Int32ToBytes(fieldNameLength)
retData = append(retData, fieldNameLengthData[0:]...)
// 写入字段名称
retData = append(retData, ([]byte(fieldName))[0:]...)
// 写入字段值字符串 长度
valueLength := uint32(len(value))
valueLengththData := baseutils.Int32ToBytes(valueLength)
retData = append(retData, valueLengththData[0:]...)
// 写入字段值字符串
retData = append(retData, value[0:]...)
return retData
}
// PackCdnImageDownloadRequest 对Cdn图片下载请求进行打包
func PackCdnImageDownloadRequest(request *baseinfo.CdnImageDownloadRequest) []byte {
// 打包请求包体
bodyData := make([]byte, 0)
bodyData = append(bodyData, PackCdnRequestElementUint32("ver", request.Ver)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("weixinnum", request.WeiXinNum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("seq", request.Seq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("clientversion", request.ClientVersion)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("clientostype", []byte(request.ClientOsType))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("authkey", request.AuthKey)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nettype", request.NetType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("acceptdupack", request.AcceptDupack)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rsaver", request.RsaVer)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rsavalue", request.RsaValue)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filetype", request.FileType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("wxchattype", request.WxChatType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("fileid", []byte(request.FileID))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("lastretcode", request.LastRetCode)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("ipseq", request.IPSeq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("cli-quic-flag", request.CliQuicFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32Pointer("wxmsgflag", request.WxMsgFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("wxautostart", request.WxAutoStart)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("downpicformat", request.DownPicFormat)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("offset", request.Offset)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("largesvideo", request.LargesVideo)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("sourceflag", request.SourceFlag)[0:]...)
retData := make([]byte, 0)
// 包头
retData = append(retData, 0xab)
// 总长度
totalLength := uint32(25 + len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(totalLength)[0:]...)
// Flag标志
flag := uint16(20000)
retData = append(retData, baseutils.Int16ToBytesBigEndian(flag)[0:]...)
// weixinnum
retData = append(retData, baseutils.Int32ToBytesLittleEndian(request.WeiXinNum)[0:]...)
// 固定为空的数据
zeroBytes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
retData = append(retData, zeroBytes[0:]...)
// bodyLength
bodyLength := uint32(len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(bodyLength)[0:]...)
// BodyData
retData = append(retData, bodyData[0:]...)
return retData
}
// DecodeImageDownloadResponse 解析下载图片响应数据
func DecodeImageDownloadResponse(data []byte) (*baseinfo.CdnDownloadResponse, error) {
if len(data) < 25 {
return nil, errors.New("DecodeImageDownloadResponse err: len(data) < 25")
}
response := &baseinfo.CdnDownloadResponse{}
// 头的总长度 固定为25个字节
headerLength := uint32(25)
// 解析头部
// bodyLength
bodyLength := baseutils.BytesToInt32(data[21:25])
// 解析包体
body := data[headerLength:]
offset := uint32(0)
for offset < bodyLength {
fieldNameSize := baseutils.BytesToInt32(body[offset : offset+4])
fieldName := string(body[offset+4 : offset+4+fieldNameSize])
offset = offset + fieldNameSize + 4
valueSize := baseutils.BytesToInt32(body[offset : offset+4])
value := string(body[offset+4 : offset+4+valueSize])
offset = offset + valueSize + 4
// Ver
if fieldName == "ver" {
ver, _ := strconv.Atoi(value)
response.Ver = uint32(ver)
}
// Seq
if fieldName == "seq" {
seq, _ := strconv.Atoi(value)
response.Seq = uint32(seq)
}
// VideoFormat
if fieldName == "videoformat" {
videoformat, _ := strconv.Atoi(value)
response.VideoFormat = uint32(videoformat)
}
// RspPicFormat
if fieldName == "rsppicformat" {
rsppicformat, _ := strconv.Atoi(value)
response.RspPicFormat = uint32(rsppicformat)
}
// RangeStart
if fieldName == "rangestart" {
rangestart, _ := strconv.Atoi(value)
response.RangeStart = uint32(rangestart)
}
// RangeEnd
if fieldName == "rangeend" {
rangeend, _ := strconv.Atoi(value)
response.RangeEnd = uint32(rangeend)
}
// TotalSize
if fieldName == "totalsize" {
totalsize, _ := strconv.Atoi(value)
response.TotalSize = uint32(totalsize)
}
// SrcSize
if fieldName == "srcsize" {
srcsize, _ := strconv.Atoi(value)
response.SrcSize = uint32(srcsize)
}
// RetCode
if fieldName == "retcode" {
retcode, _ := strconv.Atoi(value)
response.RetCode = uint32(retcode)
}
// SubStituteFType
if fieldName == "substituteftype" {
substituteftype, _ := strconv.Atoi(value)
response.SubStituteFType = uint32(substituteftype)
}
// RetrySec
if fieldName == "retrysec" {
retrysec, _ := strconv.Atoi(value)
response.RetrySec = uint32(retrysec)
}
// IsRetry
if fieldName == "isretry" {
isretry, _ := strconv.Atoi(value)
response.IsRetry = uint32(isretry)
}
// IsOverLoad
if fieldName == "isoverload" {
isoverload, _ := strconv.Atoi(value)
response.IsOverLoad = uint32(isoverload)
}
// IsGetCdn
if fieldName == "isgetcdn" {
isgetcdn, _ := strconv.Atoi(value)
response.IsGetCdn = uint32(isgetcdn)
}
// XClientIP
if fieldName == "x-ClientIp" {
response.XClientIP = value
}
// FileData
if fieldName == "filedata" {
response.FileData = []byte(value)
}
}
return response, nil
}
// PackCdnImageUploadRequest 打包上传图片数据
func PackCdnImageUploadRequest(request *baseinfo.CdnImageUploadRequest) []byte {
bodyData := make([]byte, 0)
bodyData = append(bodyData, PackCdnRequestElementUint32("ver", request.Ver)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("weixinnum", request.WeiXinNum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("seq", request.Seq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("clientversion", request.ClientVersion)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("clientostype", []byte(request.ClientOsType))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("authkey", request.AuthKey[0:])...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nettype", request.NetType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("acceptdupack", request.AcceptDupack)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("safeproto", request.SafeProto)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filetype", request.FileType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("wxchattype", request.WxChatType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("lastretcode", request.LastRetCode)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("ipseq", request.IPSeq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("cli-quic-flag", request.CliQuicFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("hasthumb", request.HasThumb)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("touser", []byte(request.ToUser))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("compresstype", request.CompressType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nocheckaeskey", request.NoCheckAesKey)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("enablehit", request.EnableHit)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("existancecheck", request.ExistAnceCheck)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("apptype", request.AppType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filekey", []byte(request.FileKey))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("totalsize", request.TotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rawtotalsize", request.RawTotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("localname", []byte(request.LocalName))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("sessionbuf", request.SessionBuf)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("offset", request.Offset)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("thumbtotalsize", request.ThumbTotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rawthumbsize", request.RawThumbSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rawthumbmd5", []byte(request.RawThumbMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("encthumbcrc", request.EncThumbCRC)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("thumbdata", request.ThumbData)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("largesvideo", request.LargesVideo)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("sourceflag", request.SourceFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("advideoflag", request.AdVideoFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filemd5", []byte(request.FileMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rawfilemd5", []byte(request.RawFileMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("datachecksum", request.DataCheckSum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filecrc", request.FileCRC)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("setofpicformat", []byte(request.SetOfPicFormat))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filedata", request.FileData)[0:]...)
retData := make([]byte, 0)
// 包头
retData = append(retData, 0xab)
// 总长度
totalLength := uint32(25 + len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(totalLength)[0:]...)
// Flag标志
flag := uint16(10000)
retData = append(retData, baseutils.Int16ToBytesBigEndian(flag)[0:]...)
// weixinnum
retData = append(retData, baseutils.Int32ToBytesLittleEndian(request.WeiXinNum)[0:]...)
// 固定为空的数据
zeroBytes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
retData = append(retData, zeroBytes[0:]...)
// bodyLength
bodyLength := uint32(len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(bodyLength)[0:]...)
// BodyData
retData = append(retData, bodyData[0:]...)
return retData
}
// PackCdnVideoUploadRequest 视频上传请求
func PackCdnVideoUploadRequest(request *baseinfo.CdnVideoUploadRequest) []byte {
bodyData := make([]byte, 0)
bodyData = append(bodyData, PackCdnRequestElementUint32("ver", request.Ver)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("weixinnum", request.WeiXinNum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("seq", request.Seq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("clientversion", request.ClientVersion)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("clientostype", []byte(request.ClientOSType))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("authkey", request.AutoKey[0:])...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nettype", request.NetType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("acceptdupack", request.AcceptDuPack)[0:]...)
/* bodyData = append(bodyData, PackCdnRequestElementUint32("rsaver", request.ClientRsaVer)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rsavalue", request.ClientRsaVal)[0:]...)*/
bodyData = append(bodyData, PackCdnRequestElementUint32("safeproto", request.SafeProto)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filetype", request.FileType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("wxchattype", request.WeChatType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("lastretcode", request.LastRetCode)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("ipseq", request.IpSeq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("hasthumb", request.HastHumb)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("touser", []byte(request.ToUSerName))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("compresstype", request.CompressType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nocheckaeskey", request.NoCheckAesKey)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("enablehit", request.EnaBleHit)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("existancecheck", request.ExistAnceCheck)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("apptype", request.AppType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filekey", []byte(request.FileKey))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("totalsize", request.TotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rawtotalsize", request.RawTotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("localname", []byte(request.LocalName))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("offset", request.Offset)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("thumbtotalsize", request.ThumbTotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rawthumbsize", request.RawThumbSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rawthumbmd5", []byte(request.RawThumbMd5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("encthumbcrc", request.EncThumbCrc)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("thumbdata", request.ThumbData)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("largesvideo", request.LargesVideo)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("sourceflag", request.SourceFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("advideoflag", request.AdVideoFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("mp4identify", []byte(request.Mp4identify))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("droprateflag", request.DropRateFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("clientrsaver", request.ClientRsaVer)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("clientrsaval", request.ClientRsaVal)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filemd5", []byte(request.FileMd5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rawfilemd5", []byte(request.RawFileMd5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("datachecksum", request.DataCheckSum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filecrc", request.FileCrc)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filedata", request.FileData)[0:]...)
retData := make([]byte, 0)
// 包头
retData = append(retData, 0xab)
// 总长度
totalLength := uint32(25 + len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(totalLength)[0:]...)
/*retData = append(retData, []byte{0x75, 0x30, 0x10, 0xa4, 0x65, 0x9a,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}...)*/
// Flag标志
flag := uint16(30000)
retData = append(retData, baseutils.Int16ToBytesBigEndian(flag)[0:]...)
// weixinnum
retData = append(retData, baseutils.Int32ToBytesLittleEndian(request.WeiXinNum)[0:]...)
// 固定为空的数据
zeroBytes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
retData = append(retData, zeroBytes[0:]...)
// bodyLength
bodyLength := uint32(len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(bodyLength)[0:]...)
// fmt.Println(hex.EncodeToString(retData))
// BodyData
retData = append(retData, bodyData[0:]...)
return retData
}
// DecodeImageUploadResponse 解析上传图片响应
func DecodeImageUploadResponse(data []byte) (*baseinfo.CdnImageUploadResponse, error) {
if len(data) < 25 {
return nil, errors.New("DecodeImageUploadResponse err: len(data) < 25")
}
response := &baseinfo.CdnImageUploadResponse{}
// 头的总长度 固定为25个字节
headerLength := uint32(25)
// 解析头部
// bodyLength
bodyLength := baseutils.BytesToInt32(data[21:25])
// 解析包体
body := data[headerLength:]
offset := uint32(0)
for offset < bodyLength {
fieldNameSize := baseutils.BytesToInt32(body[offset : offset+4])
fieldName := string(body[offset+4 : offset+4+fieldNameSize])
offset = offset + fieldNameSize + 4
valueSize := baseutils.BytesToInt32(body[offset : offset+4])
value := string(body[offset+4 : offset+4+valueSize])
offset = offset + valueSize + 4
// Ver
if fieldName == "ver" {
ver, _ := strconv.Atoi(value)
response.Ver = uint32(ver)
}
// Seq
if fieldName == "seq" {
seq, _ := strconv.Atoi(value)
response.Seq = uint32(seq)
}
// RetCode
if fieldName == "retcode" {
retcode, _ := strconv.Atoi(value)
response.RetCode = uint32(retcode)
}
// FileKey
if fieldName == "filekey" {
response.FileKey = value
}
// RecvLen
if fieldName == "recvlen" {
recvlen, _ := strconv.Atoi(value)
response.RecvLen = uint32(recvlen)
}
// SKeyResp
if fieldName == "skeyresp" {
skeyresp, _ := strconv.Atoi(value)
response.SKeyResp = uint32(skeyresp)
}
// SKeyBuf
if fieldName == "skeybuf" {
response.SKeyBuf = []byte(value)
}
// FileID
if fieldName == "fileid" {
response.FileID = value
}
// ExistFlag
if fieldName == "existflag" {
existflag, _ := strconv.Atoi(value)
response.ExistFlag = uint32(existflag)
}
// hittype
if fieldName == "hittype" {
hittype, _ := strconv.Atoi(value)
response.HitType = uint32(hittype)
}
// RetrySec
if fieldName == "retrysec" {
retrysec, _ := strconv.Atoi(value)
response.RetrySec = uint32(retrysec)
}
// IsRetry
if fieldName == "isretry" {
isretry, _ := strconv.Atoi(value)
response.IsRetry = uint32(isretry)
}
// IsOverLoad
if fieldName == "isoverload" {
isoverload, _ := strconv.Atoi(value)
response.IsOverLoad = uint32(isoverload)
}
// IsGetCdn
if fieldName == "isgetcdn" {
isgetcdn, _ := strconv.Atoi(value)
response.IsGetCDN = uint32(isgetcdn)
}
// XClientIP
if fieldName == "x-ClientIp" {
response.XClientIP = value
}
}
return response, nil
}
// PackCdnSnsImageUploadRequest 打包上传朋友圈图片数据
func PackCdnSnsImageUploadRequest(request *baseinfo.CdnSnsImageUploadRequest) []byte {
bodyData := make([]byte, 0)
bodyData = append(bodyData, PackCdnRequestElementUint32("ver", request.Ver)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("weixinnum", request.WeiXinNum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("seq", request.Seq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("clientversion", request.ClientVersion)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("clientostype", []byte(request.ClientOsType))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("authkey", request.AuthKey[0:])...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nettype", request.NetType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("acceptdupack", request.AcceptDupack)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rsaver", request.RsaVer)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rsavalue", request.RsaValue)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filetype", request.FileType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("wxchattype", request.WxChatType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("lastretcode", request.LastRetCode)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("ipseq", request.IPSeq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("cli-quic-flag", request.CliQuicFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("hasthumb", request.HasThumb)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("touser", []byte(request.ToUser))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("compresstype", request.CompressType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nocheckaeskey", request.NoCheckAesKey)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("enablehit", request.EnableHit)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("existancecheck", request.ExistAnceCheck)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("apptype", request.AppType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filekey", []byte(request.FileKey))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("totalsize", request.TotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rawtotalsize", request.RawTotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("localname", []byte(request.LocalName))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("offset", request.Offset)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("thumbtotalsize", request.ThumbTotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rawthumbsize", request.RawThumbSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rawthumbmd5", []byte(request.RawThumbMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("thumbcrc", request.ThumbCRC)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("largesvideo", request.LargesVideo)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("sourceflag", request.SourceFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("advideoflag", request.AdVideoFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filemd5", []byte(request.FileMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rawfilemd5", []byte(request.RawFileMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("datachecksum", request.DataCheckSum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filecrc", request.FileCRC)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filedata", request.FileData)[0:]...)
retData := make([]byte, 0)
// 包头
retData = append(retData, 0xab)
// 总长度
totalLength := uint32(25 + len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(totalLength)[0:]...)
// Flag标志
flag := uint16(10002)
retData = append(retData, baseutils.Int16ToBytesBigEndian(flag)[0:]...)
// weixinnum
retData = append(retData, baseutils.Int32ToBytesLittleEndian(request.WeiXinNum)[0:]...)
// 固定为空的数据
zeroBytes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
retData = append(retData, zeroBytes[0:]...)
// bodyLength
bodyLength := uint32(len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(bodyLength)[0:]...)
// BodyData
retData = append(retData, bodyData[0:]...)
return retData
}
// PackCdnSnsVideoUploadRequest 打包上传朋友圈视频请求
func PackCdnSnsVideoUploadRequest(request *baseinfo.CdnSnsVideoUploadRequest) []byte {
bodyData := make([]byte, 0)
bodyData = append(bodyData, PackCdnRequestElementUint32("ver", request.Ver)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("weixinnum", request.WeiXinNum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("seq", request.Seq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("clientversion", request.ClientVersion)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("clientostype", []byte(request.ClientOsType))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("authkey", request.AuthKey[0:])...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nettype", request.NetType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("acceptdupack", request.AcceptDupack)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rsaver", request.RsaVer)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rsavalue", request.RsaValue)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filetype", request.FileType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("wxchattype", request.WxChatType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("lastretcode", request.LastRetCode)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("ipseq", request.IPSeq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("cli-quic-flag", request.CliQuicFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("isstorevideo", request.IsStoreVideo)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("hasthumb", request.HasThumb)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nocheckaeskey", request.NoCheckAesKey)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("enablehit", request.EnableHit)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("existancecheck", request.ExistAnceCheck)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("apptype", request.AppType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filekey", []byte(request.FileKey))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("totalsize", request.TotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rawtotalsize", request.RawTotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("localname", []byte(request.LocalName))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("offset", request.Offset)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("thumbtotalsize", request.ThumbTotalSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rawthumbsize", request.RawThumbSize)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rawthumbmd5", []byte(request.RawThumbMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("thumbcrc", request.ThumbCRC)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("thumbdata", request.ThumbData)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("largesvideo", request.LargesVideo)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("sourceflag", request.SourceFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("advideoflag", request.AdVideoFlag)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("mp4identify", []byte(request.Mp4Identify))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filemd5", []byte(request.FileMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("rawfilemd5", []byte(request.RawFileMD5))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("datachecksum", request.DataCheckSum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("filecrc", request.FileCRC)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("filedata", request.FileData)[0:]...)
retData := make([]byte, 0)
// 包头
retData = append(retData, 0xab)
// 总长度
totalLength := uint32(25 + len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(totalLength)[0:]...)
// Flag标志
flag := uint16(10002)
retData = append(retData, baseutils.Int16ToBytesBigEndian(flag)[0:]...)
// weixinnum
retData = append(retData, baseutils.Int32ToBytesLittleEndian(request.WeiXinNum)[0:]...)
// 固定为空的数据
zeroBytes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
retData = append(retData, zeroBytes[0:]...)
// bodyLength
bodyLength := uint32(len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(bodyLength)[0:]...)
// BodyData
retData = append(retData, bodyData[0:]...)
return retData
}
// DecodeSnsVideoUploadResponse 解析上传朋友圈视频响应
func DecodeSnsVideoUploadResponse(data []byte) (*baseinfo.CdnSnsVideoUploadResponse, error) {
if len(data) < 25 {
return nil, errors.New("DecodeSnsVideoUploadResponse err: len(data) < 25")
}
response := &baseinfo.CdnSnsVideoUploadResponse{}
// 头的总长度 固定为25个字节
headerLength := uint32(25)
// 解析头部
// bodyLength
bodyLength := baseutils.BytesToInt32(data[21:25])
// 解析包体
body := data[headerLength:]
offset := uint32(0)
for offset < bodyLength {
fieldNameSize := baseutils.BytesToInt32(body[offset : offset+4])
fieldName := string(body[offset+4 : offset+4+fieldNameSize])
offset = offset + fieldNameSize + 4
valueSize := baseutils.BytesToInt32(body[offset : offset+4])
value := string(body[offset+4 : offset+4+valueSize])
offset = offset + valueSize + 4
// Ver
if fieldName == "ver" {
ver, _ := strconv.Atoi(value)
response.Ver = uint32(ver)
}
// Seq
if fieldName == "seq" {
seq, _ := strconv.Atoi(value)
response.Seq = uint32(seq)
}
// RetCode
if fieldName == "retcode" {
retcode, _ := strconv.Atoi(value)
// fmt.Println(retcode)
response.RetCode = uint32(retcode)
}
// FileKey
if fieldName == "filekey" {
response.FileKey = value
}
// FileURL
if fieldName == "fileurl" {
response.FileURL = value
}
// ThumbURL
if fieldName == "thumburl" {
response.ThumbURL = value
}
// FileID
if fieldName == "fileid" {
response.FileID = value
}
// RecvLen
if fieldName == "recvlen" {
recvlen, _ := strconv.Atoi(value)
response.RecvLen = uint32(recvlen)
}
// RetrySec
if fieldName == "retrysec" {
retrysec, _ := strconv.Atoi(value)
response.RetrySec = uint32(retrysec)
}
// IsRetry
if fieldName == "isretry" {
isretry, _ := strconv.Atoi(value)
response.IsRetry = uint32(isretry)
}
// IsOverLoad
if fieldName == "isoverload" {
isoverload, _ := strconv.Atoi(value)
response.IsOverLoad = uint32(isoverload)
}
// IsGetCdn
if fieldName == "isgetcdn" {
isgetcdn, _ := strconv.Atoi(value)
response.IsGetCDN = uint32(isgetcdn)
}
// XClientIP
if fieldName == "x-ClientIp" {
response.XClientIP = value
}
}
dataJson, _ := json.Marshal(response)
log.Info(string(dataJson))
return response, nil
}
// DecodeSnsImageUploadResponse 解析朋友圈上传图片响应
func DecodeSnsImageUploadResponse(data []byte) (*baseinfo.CdnSnsImageUploadResponse, error) {
if len(data) < 25 {
return nil, errors.New("DecodeSnsImageUploadResponse err: len(data) < 25")
}
response := &baseinfo.CdnSnsImageUploadResponse{}
// 头的总长度 固定为25个字节
headerLength := uint32(25)
// 解析头部
// bodyLength
bodyLength := baseutils.BytesToInt32(data[21:25])
// 解析包体
body := data[headerLength:]
offset := uint32(0)
for offset < bodyLength {
fieldNameSize := baseutils.BytesToInt32(body[offset : offset+4])
fieldName := string(body[offset+4 : offset+4+fieldNameSize])
offset = offset + fieldNameSize + 4
valueSize := baseutils.BytesToInt32(body[offset : offset+4])
value := string(body[offset+4 : offset+4+valueSize])
offset = offset + valueSize + 4
// Ver
if fieldName == "ver" {
ver, _ := strconv.Atoi(value)
response.Ver = uint32(ver)
}
// Seq
if fieldName == "seq" {
seq, _ := strconv.Atoi(value)
response.Seq = uint32(seq)
}
// RetCode
if fieldName == "retcode" {
retcode, _ := strconv.Atoi(value)
response.RetCode = uint32(retcode)
}
// FileKey
if fieldName == "filekey" {
response.FileKey = value
}
// RecvLen
if fieldName == "recvlen" {
recvlen, _ := strconv.Atoi(value)
response.RecvLen = uint32(recvlen)
}
// FileURL
if fieldName == "fileurl" {
response.FileURL = value
}
// ThumbURL
if fieldName == "thumburl" {
response.ThumbURL = value
}
// EnableQuic
if fieldName == "enablequic" {
enablequic, _ := strconv.Atoi(value)
response.EnableQuic = uint32(enablequic)
}
// RetrySec
if fieldName == "retrysec" {
retrysec, _ := strconv.Atoi(value)
response.RetrySec = uint32(retrysec)
}
// IsRetry
if fieldName == "isretry" {
isretry, _ := strconv.Atoi(value)
response.IsRetry = uint32(isretry)
}
// IsOverLoad
if fieldName == "isoverload" {
isoverload, _ := strconv.Atoi(value)
response.IsOverLoad = uint32(isoverload)
}
// IsGetCdn
if fieldName == "isgetcdn" {
isgetcdn, _ := strconv.Atoi(value)
response.IsGetCDN = uint32(isgetcdn)
}
// XClientIP
if fieldName == "x-ClientIp" {
response.XClientIP = value
}
}
return response, nil
}
// PackCdnSnsVideoDownloadRequest 对Cdn朋友圈视频下载请求打包
func PackCdnSnsVideoDownloadRequest(request *baseinfo.CdnSnsVideoDownloadRequest) []byte {
// 打包请求包体
bodyData := make([]byte, 0)
bodyData = append(bodyData, PackCdnRequestElementUint32("ver", request.Ver)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("weixinnum", request.WeiXinNum)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("seq", request.Seq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("clientversion", request.ClientVersion)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("clientostype", []byte(request.ClientOsType))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("authkey", request.AuthKey)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("nettype", request.NetType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("acceptdupack", request.AcceptDupack)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("signal", []byte(request.Signal))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("scene", []byte(request.Scene))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("url", []byte(request.URL))[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rangestart", request.RangeStart)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("rangeend", request.RangeEnd)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("lastretcode", request.LastRetCode)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("ipseq", request.IPSeq)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("redirect_type", request.RedirectType)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("lastvideoformat", request.LastVideoFormat)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementUint32("videoformat", request.VideoFormat)[0:]...)
bodyData = append(bodyData, PackCdnRequestElementData("X-snsvideoflag", []byte(request.XSnsVideoFlag))[0:]...)
retData := make([]byte, 0)
// 包头
retData = append(retData, 0xab)
// 总长度
totalLength := uint32(25 + len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(totalLength)[0:]...)
// Flag标志
flag := uint16(10005)
retData = append(retData, baseutils.Int16ToBytesBigEndian(flag)[0:]...)
// weixinnum
retData = append(retData, baseutils.Int32ToBytesLittleEndian(request.WeiXinNum)[0:]...)
// 固定为空的数据
zeroBytes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
retData = append(retData, zeroBytes[0:]...)
// bodyLength
bodyLength := uint32(len(bodyData))
retData = append(retData, baseutils.Int32ToBytes(bodyLength)[0:]...)
// BodyData
retData = append(retData, bodyData[0:]...)
return retData
}
// DecodeSnsVideoDownloadResponse 解析朋友圈视频下载响应
func DecodeSnsVideoDownloadResponse(data []byte) (*baseinfo.CdnSnsVideoDownloadResponse, error) {
if len(data) < 25 {
return nil, errors.New("DecodeSnsVideoDownloadResponse err: len(data) < 25")
}
response := &baseinfo.CdnSnsVideoDownloadResponse{}
// 头的总长度 固定为25个字节
headerLength := uint32(25)
// 解析头部
// bodyLength
bodyLength := baseutils.BytesToInt32(data[21:25])
// 解析包体
body := data[headerLength:]
offset := uint32(0)
for offset < bodyLength {
fieldNameSize := baseutils.BytesToInt32(body[offset : offset+4])
fieldName := string(body[offset+4 : offset+4+fieldNameSize])
offset = offset + fieldNameSize + 4
valueSize := baseutils.BytesToInt32(body[offset : offset+4])
value := string(body[offset+4 : offset+4+valueSize])
offset = offset + valueSize + 4
// Ver
if fieldName == "ver" {
ver, _ := strconv.Atoi(value)
response.Ver = uint32(ver)
}
// Seq
if fieldName == "seq" {
seq, _ := strconv.Atoi(value)
response.Seq = uint32(seq)
}
// RetCode
if fieldName == "retcode" {
retcode, _ := strconv.Atoi(value)
response.RetCode = uint32(retcode)
}
// RangeStart
if fieldName == "rangestart" {
rangeStart, _ := strconv.Atoi(value)
response.RangeStart = uint32(rangeStart)
}
// RangeEnd
if fieldName == "rangeend" {
rangeEnd, _ := strconv.Atoi(value)
response.RangeEnd = uint32(rangeEnd)
}
// TotalSize
if fieldName == "totalsize" {
totalSize, _ := strconv.Atoi(value)
response.TotalSize = uint32(totalSize)
}
// EnableQuic
if fieldName == "enablequic" {
enablequic, _ := strconv.Atoi(value)
response.EnableQuic = uint32(enablequic)
}
// IsRetry
if fieldName == "isretry" {
isretry, _ := strconv.Atoi(value)
response.IsRetry = uint32(isretry)
}
// IsOverLoad
if fieldName == "isoverload" {
isoverload, _ := strconv.Atoi(value)
response.IsOverLoad = uint32(isoverload)
}
// IsGetCdn
if fieldName == "isgetcdn" {
isgetcdn, _ := strconv.Atoi(value)
response.IsGetCdn = uint32(isgetcdn)
}
// XClientIP
if fieldName == "x-ClientIp" {
response.XClientIP = value
}
// XEncFlag
if fieldName == "X-encflag" {
encFlag, _ := strconv.Atoi(value)
response.XEncFlag = uint32(encFlag)
}
// XEncLen
if fieldName == "X-enclen" {
encLen, _ := strconv.Atoi(value)
response.XEncLen = uint32(encLen)
}
// XSnsVideoFlag
if fieldName == "X-snsvideoflag" {
response.XSnsVideoFlag = value
}
// XSnsVideoTicket
if fieldName == "X-snsvideoticket" {
response.XSnsVideoTicket = value
}
// FileData
if fieldName == "filedata" {
response.FileData = []byte(value)
}
}
return response, nil
}
// DecodeVideoUploadResponse 解析上传视频响应
func DecodeVideoUploadResponse(data []byte) (*baseinfo.CdnMsgVideoUploadResponse, error) {
if len(data) < 25 {
return nil, errors.New("DecodeSnsVideoUploadResponse err: len(data) < 25")
}
response := &baseinfo.CdnMsgVideoUploadResponse{}
// 头的总长度 固定为25个字节
headerLength := uint32(25)
// 解析头部
// bodyLength
bodyLength := baseutils.BytesToInt32(data[21:25])
// 解析包体
body := data[headerLength:]
offset := uint32(0)
for offset < bodyLength {
fieldNameSize := baseutils.BytesToInt32(body[offset : offset+4])
fieldName := string(body[offset+4 : offset+4+fieldNameSize])
offset = offset + fieldNameSize + 4
valueSize := baseutils.BytesToInt32(body[offset : offset+4])
value := string(body[offset+4 : offset+4+valueSize])
offset = offset + valueSize + 4
// Ver
if fieldName == "ver" {
ver, _ := strconv.Atoi(value)
response.Ver = uint32(ver)
}
// Seq
if fieldName == "seq" {
seq, _ := strconv.Atoi(value)
response.Seq = uint32(seq)
}
// RetCode
if fieldName == "retcode" {
retcode, _ := strconv.Atoi(value)
// fmt.Println(retcode)
response.RetCode = uint32(retcode)
}
// FileKey
if fieldName == "filekey" {
response.FileKey = value
}
// FileURL
if fieldName == "fileurl" {
response.FileURL = value
}
// ThumbURL
if fieldName == "thumburl" {
response.ThumbURL = value
}
// FileID
if fieldName == "fileid" {
response.FileID = value
}
// RecvLen
if fieldName == "recvlen" {
recvlen, _ := strconv.Atoi(value)
response.RecvLen = uint32(recvlen)
}
// RetrySec
if fieldName == "retrysec" {
retrysec, _ := strconv.Atoi(value)
response.RetrySec = uint32(retrysec)
}
// IsRetry
if fieldName == "isretry" {
isretry, _ := strconv.Atoi(value)
response.IsRetry = uint32(isretry)
}
// IsOverLoad
if fieldName == "isoverload" {
isoverload, _ := strconv.Atoi(value)
response.IsOverLoad = uint32(isoverload)
}
// IsGetCdn
if fieldName == "isgetcdn" {
isgetcdn, _ := strconv.Atoi(value)
response.IsGetCDN = uint32(isgetcdn)
}
// XClientIP
if fieldName == "x-ClientIp" {
response.XClientIP = value
}
}
// dataJson, _ := json.Marshal(response)
// log.Info(string(dataJson))
return response, nil
}