# 获取频道信息与当前人身份(FOR 机器人服务入口)

# qq.getGuildInfo(Object object)

# 参数 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)
//go代码样例
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"`
}

//TestDncryptData 测试解密功能
//body:从http回包读取的数据
//sessionKey,从其他服务读取的base64字符串
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可访问