Files
miaosic/providers/qq/sign.go
aynakeya 971f5fc4e5 finish qq provider
fix session cmd: save session every in every command

add qq init

fix init sequence

update gitignore

fix miaosic cmd

add kugou album info in search

update qq music api.
2025-07-07 23:08:23 +08:00

61 lines
1.5 KiB
Go

package qq
import (
"crypto/md5"
"encoding/base64"
"encoding/hex"
"encoding/json"
"strings"
)
// 签名算法实现
func qqSignMap(request map[string]interface{}) string {
data, _ := json.Marshal(request)
return qqSignStr(string(data))
}
func qqSignStr(data string) string {
hash := md5.Sum([]byte(data))
md5Str := strings.ToUpper(hex.EncodeToString(hash[:]))
// 头部处理
headPos := []int{21, 4, 9, 26, 16, 20, 27, 30}
head := make([]byte, len(headPos))
for i, pos := range headPos {
head[i] = md5Str[pos]
}
// 尾部处理
tailPos := []int{18, 11, 3, 2, 1, 7, 6, 25}
tail := make([]byte, len(tailPos))
for i, pos := range tailPos {
tail[i] = md5Str[pos]
}
// 中间部分处理
ol := []byte{212, 45, 80, 68, 195, 163, 163, 203, 157, 220, 254, 91, 204, 79, 104, 6}
hexMap := map[byte]byte{
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4,
'5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15,
}
middle := make([]byte, 16)
for i := 0; i < 32; i += 2 {
idx := i / 2
one := hexMap[md5Str[i]]
two := hexMap[md5Str[i+1]]
r := one*16 ^ two
middle[idx] = r ^ ol[idx]
}
// 组合签名
middleBase64 := base64.StdEncoding.EncodeToString(middle)
signature := "zzb" + string(head) + middleBase64 + string(tail)
signature = strings.ToLower(signature)
signature = strings.ReplaceAll(signature, "/", "")
signature = strings.ReplaceAll(signature, "+", "")
signature = strings.ReplaceAll(signature, "=", "")
return signature
}