github.com/Mrs4s/MiraiGo@v0.0.0-20240226124653-54bdd873e3fe/client/security.go (about)

     1  package client
     2  
     3  import (
     4  	"github.com/pkg/errors"
     5  
     6  	"github.com/Mrs4s/MiraiGo/client/internal/network"
     7  	"github.com/Mrs4s/MiraiGo/client/pb/oidb"
     8  	"github.com/Mrs4s/MiraiGo/internal/proto"
     9  )
    10  
    11  func init() {
    12  	decoders["OidbSvc.0xbcb_0"] = decodeUrlCheckResponse
    13  }
    14  
    15  type UrlSecurityLevel int
    16  
    17  const (
    18  	Safe UrlSecurityLevel = iota + 1
    19  	Unknown
    20  	Danger
    21  )
    22  
    23  // CheckUrlSafely 通过TX服务器检查URL安全性
    24  func (c *QQClient) CheckUrlSafely(url string) UrlSecurityLevel {
    25  	i, err := c.sendAndWait(c.buildUrlCheckRequest(url))
    26  	if err != nil {
    27  		return Unknown
    28  	}
    29  	return i.(UrlSecurityLevel)
    30  }
    31  
    32  func (c *QQClient) buildUrlCheckRequest(url string) (uint16, []byte) {
    33  	payload := c.packOIDBPackageProto(3019, 0, &oidb.DBCBReqBody{
    34  		CheckUrlReq: &oidb.CheckUrlReq{
    35  			Url:         []string{url},
    36  			QqPfTo:      proto.String("mqq.group"),
    37  			Type:        proto.Uint32(2),
    38  			SendUin:     proto.Uint64(uint64(c.Uin)),
    39  			ReqType:     proto.String("webview"),
    40  			OriginalUrl: proto.Some(url),
    41  			IsArk:       proto.Bool(false),
    42  			IsFinish:    proto.Bool(false),
    43  			SrcUrls:     []string{url},
    44  			SrcPlatform: proto.Uint32(1),
    45  			Qua:         proto.String("AQQ_2013 4.6/2013 8.4.184945&NA_0/000000&ADR&null18&linux&2017&C2293D02BEE31158&7.1.2&V3"),
    46  		},
    47  	})
    48  	return c.uniPacket("OidbSvc.0xbcb_0", payload)
    49  }
    50  
    51  func decodeUrlCheckResponse(_ *QQClient, pkt *network.Packet) (any, error) {
    52  	rsp := oidb.DBCBRspBody{}
    53  	err := unpackOIDBPackage(pkt.Payload, &rsp)
    54  	if err != nil {
    55  		return nil, err
    56  	}
    57  	if rsp.CheckUrlRsp == nil || len(rsp.CheckUrlRsp.Results) == 0 {
    58  		return nil, errors.New("response is empty")
    59  	}
    60  	if rsp.CheckUrlRsp.Results[0].JumpUrl.IsSome() {
    61  		return Danger, nil
    62  	}
    63  	if rsp.CheckUrlRsp.Results[0].Umrtype.Unwrap() == 2 {
    64  		return Safe, nil
    65  	}
    66  	return Unknown, nil
    67  }