From 8fa49fedb9948aa5ca3895d0db48a2f5e45619d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=83=E6=A9=98=20=E9=9B=AB=E9=9C=9E?= Date: Fri, 18 Mar 2022 20:36:13 +0800 Subject: [PATCH] feat: support get group announcement (#258) * feat: support get group announcement * refactor: avoid importing new dependent package * refactor: prettify --- client/http_api.go | 86 ++++++++++++++++++++++++++++++++++++++++++++++ utils/http.go | 8 ++--- 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/client/http_api.go b/client/http_api.go index 118daf0d..3d37f998 100644 --- a/client/http_api.go +++ b/client/http_api.go @@ -165,6 +165,32 @@ func (c *QQClient) GetTts(text string) ([]byte, error) { /* -------- GroupNotice -------- */ +type groupNoticeRsp struct { + Feeds []*struct { + SenderId uint32 `json:"u"` + PublishTime uint64 `json:"pubt"` + Message struct { + Text string `json:"text"` + Images []noticeImage `json:"pics"` + } `json:"msg"` + } `json:"feeds"` +} + +type GroupNoticeMessage struct { + SenderId uint32 `json:"sender_id"` + PublishTime uint64 `json:"publish_time"` + Message struct { + Text string `json:"text"` + Images []GroupNoticeImage `json:"images"` + } `json:"message"` +} + +type GroupNoticeImage struct { + Height string `json:"height"` + Width string `json:"width"` + ID string `json:"id"` +} + type noticePicUpResponse struct { ErrorCode int `json:"ec"` ErrorMessage string `json:"em"` @@ -177,6 +203,66 @@ type noticeImage struct { ID string `json:"id"` } +func (c *QQClient) GetGroupNotice(groupCode int64) (l []*GroupNoticeMessage, err error) { + + v := url.Values{} + v.Set("bkn", strconv.Itoa(c.getCSRFToken())) + v.Set("qid", strconv.FormatInt(groupCode, 10)) + v.Set("ft", "23") + v.Set("ni", "1") + v.Set("n", "1") + v.Set("i", "1") + v.Set("log_read", "1") + v.Set("platform", "1") + v.Set("s", "-1") + v.Set("n", "20") + + req, _ := http.NewRequest(http.MethodGet, "https://web.qun.qq.com/cgi-bin/announce/get_t_list?"+v.Encode(), nil) + req.Header.Set("Cookie", c.getCookies()) + rsp, err := utils.Client.Do(req) + if err != nil { + return + } + defer rsp.Body.Close() + + r := groupNoticeRsp{} + err = json.NewDecoder(rsp.Body).Decode(&r) + if err != nil { + return + } + + return c.parseGroupNoticeJson(&r), nil +} + +func (c *QQClient) parseGroupNoticeJson(s *groupNoticeRsp) []*GroupNoticeMessage { + o := make([]*GroupNoticeMessage, 0, len(s.Feeds)) + for _, v := range s.Feeds { + + ims := make([]GroupNoticeImage, 0, len(v.Message.Images)) + for i := 0; i < len(v.Message.Images); i++ { + ims = append(ims, GroupNoticeImage{ + Height: v.Message.Images[i].Height, + Width: v.Message.Images[i].Width, + ID: v.Message.Images[i].ID, + }) + } + + o = append(o, &GroupNoticeMessage{ + SenderId: v.SenderId, + PublishTime: v.PublishTime, + Message: struct { + Text string `json:"text"` + Images []GroupNoticeImage `json:"images"` + }{ + Text: v.Message.Text, + Images: ims, + }, + }) + } + + return o +} + func (c *QQClient) uploadGroupNoticePic(img []byte) (*noticeImage, error) { buf := new(bytes.Buffer) w := multipart.NewWriter(buf) diff --git a/utils/http.go b/utils/http.go index ea594e84..df1caa6c 100644 --- a/utils/http.go +++ b/utils/http.go @@ -8,7 +8,7 @@ import ( "strings" ) -var client = &http.Client{ +var Client = &http.Client{ Transport: &http.Transport{ ForceAttemptHTTP2: true, MaxConnsPerHost: 0, @@ -34,7 +34,7 @@ func HttpPostBytes(url string, data []byte) ([]byte, error) { } req.Header["User-Agent"] = []string{"QQ/8.2.0.1296 CFNetwork/1126"} req.Header["Net-Type"] = []string{"Wifi"} - resp, err := client.Do(req) + resp, err := Client.Do(req) if err != nil { return nil, err } @@ -67,7 +67,7 @@ func HttpPostBytesWithCookie(url string, data []byte, cookie string, contentType if cookie != "" { req.Header["Cookie"] = []string{cookie} } - resp, err := client.Do(req) + resp, err := Client.Do(req) if err != nil { return nil, err } @@ -125,7 +125,7 @@ func HTTPGetReadCloser(url string, cookie string) (io.ReadCloser, error) { if cookie != "" { req.Header["Cookie"] = []string{cookie} } - resp, err := client.Do(req) + resp, err := Client.Do(req) if err != nil { return nil, err }