Skip to content

Commit

Permalink
feat: 支持拉取群相册详情内容,初步解决上传视频后无法取得URL的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
pk5ls20 committed Aug 30, 2024
1 parent b36a010 commit 7e9b76a
Show file tree
Hide file tree
Showing 5 changed files with 394 additions and 6 deletions.
99 changes: 93 additions & 6 deletions client/album.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/LagrangeDev/LagrangeGo/utils"
"github.com/LagrangeDev/LagrangeGo/utils/crypto"
"github.com/tidwall/gjson"
"io"
"mime/multipart"
"net/http"
"strconv"
"time"

"github.com/LagrangeDev/LagrangeGo/client/packets/album"
"github.com/LagrangeDev/LagrangeGo/utils"
"github.com/LagrangeDev/LagrangeGo/utils/crypto"
"github.com/tidwall/gjson"
)

const TimeLayout = "2006-01-02 15:04:05"
Expand Down Expand Up @@ -56,6 +58,7 @@ func (c *QQClient) GetGroupAlbum(groupUin uint32) ([]*GroupAlbum, error) {
fmt.Println(err)
}
grpAlbumList[i] = &GroupAlbum{
GroupUin: groupUin,
Name: v.Get("title").Str,
ID: v.Get("id").Str,
Description: v.Get("desc").Str,
Expand All @@ -68,6 +71,59 @@ func (c *QQClient) GetGroupAlbum(groupUin uint32) ([]*GroupAlbum, error) {
return grpAlbumList, nil
}

func (c *QQClient) GetGroupAlbumElem(ab *GroupAlbum) ([]*GroupAlbumElem, error) {
var elem []*GroupAlbumElem
pageInfo := ""
for {
pkt, err := album.BuildGetMediaListReq(c.Uin, ab.GroupUin, ab.ID, pageInfo)
if err != nil {
return nil, err
}
payload, err := c.sendUniPacketAndWait("QunAlbum.trpc.qzone.webapp_qun_media.QunMedia.GetMediaList", pkt)
if err != nil {
return nil, err
}
resp, err := album.ParseGetMediaListResp(payload)
if err != nil {
return nil, err
}
for _, v := range resp.Body.ElemInfo {
if v.ImgInfo != nil {
elem = append(elem, &GroupAlbumElem{
photo: &GroupPhoto{
ID: v.ImgInfo.ImageID,
Url: v.ImgInfo.ImgLinkInfo.ImageURL,
},
operatorUserInfo: &GroupAlbumElemUserInfo{
UserNickName: v.UploaderInfo.UserNickName,
UserUin: v.UploaderInfo.UserUin,
},
})
}
if v.VideoInfo != nil {
elem = append(elem, &GroupAlbumElem{
video: &GroupVideo{
ID: v.VideoInfo.VideoID,
Url: v.VideoInfo.VideoURL,
},
operatorUserInfo: &GroupAlbumElemUserInfo{
UserNickName: v.UploaderInfo.UserNickName,
UserUin: v.UploaderInfo.UserUin,
},
})
}
}
if resp.Body.PageInfo.IsNone() || gjson.Get(resp.Body.PageInfo.Unwrap(), "Loc.return_num").Int() == 0 {
break
}
if resp.Body.ElemInfo == nil && resp.Body.ElemMetaInfo == nil {
break
}
pageInfo = resp.Body.PageInfo.Unwrap()
}
return elem, nil
}

func (c *QQClient) buildUploadSessionReq(param *uploadSessionParam) (*groupAlbumUploadReq, int64, error) {
timeStamp := time.Now().Unix()
cookies, err := c.GetCookies("qzone.qq.com")
Expand Down Expand Up @@ -226,7 +282,9 @@ func (c *QQClient) uploadGroupAlbumBlock(typ uploadTypeParam, session string, se
_ = writer.WriteField("cmd", "FileUpload")
_ = writer.WriteField("slice_size", strconv.Itoa(chunkSize))
_ = writer.Close()
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("https://h5.qzone.qq.com/webapp/json/sliceUpload/%s?seq=%d&retry=0&offset=%d&end=%d&total=%d&type=form&g_tk=%d",
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, http.MethodPost, fmt.Sprintf("https://h5.qzone.qq.com/webapp/json/sliceUpload/%s?seq=%d&retry=0&offset=%d&end=%d&total=%d&type=form&g_tk=%d",
uploadUriCmd, seq, offset, offset+chunkSize, totalSize, gtk), body)
if err != nil {
return nil, err
Expand Down Expand Up @@ -388,9 +446,26 @@ func (c *QQClient) UploadGroupAlbumVideo(parms *GroupAlbumUploadParam) (*GroupVi
return nil, err
}
if utbRsp.SPhotoID == "" || utbRsp.SBURL == "" {
return nil, errors.New("upload group album failed because utbRsp missing fields")
return nil, errors.New("upload group album failed because missing video thumbnail fields")
}
return &GroupVideo{}, nil // TODO: where to get the video url?
// get video url
updList, err := c.GetGroupAlbumElem(&GroupAlbum{
GroupUin: parms.GroupUin,
ID: parms.AlbumId,
})
if err != nil {
return nil, err
}
// simple loop, enough
for _, elem := range updList {
if elem.video != nil && elem.video.ID == uvbRsp.VID {
return &GroupVideo{
ID: elem.video.ID,
Url: elem.video.Url,
}, nil
}
}
return &GroupVideo{}, errors.New("upload success but cannot get video url")
}

type ResourceType int
Expand Down Expand Up @@ -427,6 +502,7 @@ type (

type (
GroupAlbum struct {
GroupUin uint32
Name string
ID string
Description string
Expand All @@ -436,6 +512,12 @@ type (
CreateTime int64
}

GroupAlbumElem struct {
photo *GroupPhoto
video *GroupVideo
operatorUserInfo *GroupAlbumElemUserInfo
}

GroupPhoto struct {
ID string
Url string
Expand All @@ -446,6 +528,11 @@ type (
Url string
}

GroupAlbumElemUserInfo struct {
UserNickName string
UserUin string
}

ImageFile struct {
Image io.ReadSeeker
}
Expand Down
41 changes: 41 additions & 0 deletions client/packets/album/get_media_list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package album

import (
"errors"
"strconv"

"github.com/LagrangeDev/LagrangeGo/client/packets/pb/service/album"
"github.com/LagrangeDev/LagrangeGo/internal/proto"
"github.com/LagrangeDev/LagrangeGo/utils"
)

func BuildGetMediaListReq(selfUin uint32, groupUin uint32, albumId string, pageInfo string) ([]byte, error) {
return proto.Marshal(&album.QzoneGetMediaList{
Field1: 0,
Field2: "h5_test",
Field3: "h5_test",
Field4: &album.QzoneGetMediaList_F4{
GroupID: strconv.Itoa(int(groupUin)),
AlbumID: albumId,
Field3: 0,
Field4: "",
PageInfo: pageInfo,
},
UinTimeStamp: utils.GenerateUinTimestamp(selfUin),
Field10: &album.QzoneGetMediaList_F10{
AppIdFlag: "fc-appid",
AppIdValue: "100",
},
})
}

func ParseGetMediaListResp(data []byte) (resp *album.QzoneGetMediaList_Response, err error) {
resp = &album.QzoneGetMediaList_Response{}
if err = proto.Unmarshal(data, resp); err != nil {
return nil, err
}
if resp.ErrorCode.IsSome() && resp.ErrorMsg.IsSome() {
return nil, errors.New(resp.ErrorMsg.Unwrap())
}
return resp, nil
}
131 changes: 131 additions & 0 deletions client/packets/pb/service/album/QunMedia_GetMediaList.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 7e9b76a

Please sign in to comment.