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 }