获取频道信息与当前人身份(FOR 机器人服务入口)
qq.getGuildInfo(Object object)
QQ mac版本:支持
QQ windows版本:支持
参数 Object object
属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 |
open_guild_id | string | | 是 | 频道id | 1.40.0 |
channel_id | string | | 否 | 子频道Id | 1.40.0 |
success | function | | 否 | 接口调用成功的回调函数 | 1.40.0 |
fail | function | | 否 | 接口调用失败的回调函数 | 1.40.0 |
complete | function | | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) | 1.40.0 |
Object.success 回调函数参数 Object res(加密之后)
res 得到的是加密之后的数据,需要开发者解密,解密方案参考: https://q.qq.com/wiki/develop/game/frame/open-ability/signature.html
属性 | 类型 | 说明 |
encryptedData | string | 加密之后的数据,需要解密 |
iv | string | 对称解密算法初始向量(base64) |
signature | string | 签名(base64) |
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/sha1"
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"strings"
"net/http"
)
type EncryptedInfo struct {
Iv string `json:"iv"`
Data []byte `json:"encryptedData"`
Signature string `json:"signature"`
}
func TestDncryptData(body []byte, sessionKey string) {
encryptedInfo := EncryptedInfo{}
_ = json.Unmarshal(body, &encryptedInfo)
fmt.Printf("encryptedInfo = %v", encryptedInfo)
iv, _ := base64.StdEncoding.DecodeString(encryptedInfo.Iv)
signature, _ := base64.StdEncoding.DecodeString(encryptedInfo.Signature)
data, err := dncrypt(encryptedInfo.Data, iv, sessionKey)
if err != nil {
fmt.Println(err)
}
fmt.Printf("data: %v\n", string(data))
s2 := getSignature([]byte(data), []byte(sessionKey))
fmt.Println(signature)
fmt.Println(s2)
}
func pKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
func dncrypt(encryptData, iv []byte, sessionKey string) ([]byte, error) {
key, _ := base64.StdEncoding.DecodeString(sessionKey)
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
mode := cipher.NewCBCDecrypter(block, iv)
origData := make([]byte, len(encryptData))
mode.CryptBlocks(origData, encryptData)
origData = pKCS7UnPadding(origData)
return origData, nil
}
func getSignature(data []byte, sessionKey []byte) []byte {
s := sha1.New()
tmp := append(data, sessionKey...)
_, _ = s.Write([]byte(tmp))
sum := s.Sum(nil)
return sum
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Object.success 回调函数参数 Object res(data 解密之后的数据)
属性 | 类型 | 说明 |
guild_name | string | 频道名称 |
member_role | number | 当前成员角色 0成员/1管理员/2频道主 |
channel_info | Object | 子频道信息,只在请求上有channel_id的时候才会返回 |
member_userid | string | 当前用户在机器人场景的 User id |
member_nick | string | 当前用户在频道内的昵称 |
open_guild_id | string | Guild id |
Object channel_info 子频道信息
属性 | 类型 | 说明 |
channel_name | string | 子频道名称 |
channel_type | number | 子频道类型 |
is_accessible | number | 是否可以访问该子频道,0不可访问、1可访问 |