Files
wechat_ipad_pro/api/service/snsService.go
2026-02-17 13:06:23 +08:00

642 lines
24 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package service
import (
"encoding/base64"
"fmt"
"log"
"regexp"
"strconv"
"strings"
"sync"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/clientsdk/baseutils"
"xiawan/wx/clientsdk/xmltool"
"xiawan/wx/protobuf/proto_ref"
"xiawan/wx/srv/defines"
"xiawan/wx/srv/wxcore"
"xiawan/wx/srv/wxface"
"github.com/gin-gonic/gin"
"github.com/gogf/gf/container/garray"
_ "github.com/gogf/gf/container/garray"
)
// SendSnsTimeLineRequestService 获取朋友圈主页
func SendSnsTimeLineRequestService(queryKey string, m req.GetSnsInfoModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
//获取朋友圈主页
resp, err := reqInvoker.SendSnsTimeLineRequestResult(m.FirstPageMD5, m.MaxID)
if err != nil {
return vo.NewFail("SendSnsTimeLineRequestService" + err.Error())
}
ObjectList := resp.GetObjectList()
if ObjectList != nil && len(ObjectList) > 0 {
for _, v := range ObjectList {
objectDesc := v.GetObjectDesc()
if objectDesc == nil {
continue
}
if objectDesc.GetBuffer() != nil {
v.SetObjectDescStr(objectDesc.GetBuffer())
}
}
}
return vo.NewSuccessObj(resp, "")
})
}
// 通过id获朋友圈详情
func SendSnsObjectDetailByIdService(queryKey string, m req.GetIdDetailModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
//获取好友朋友圈主页
id, _ := strconv.ParseUint(m.Id, 0, 64)
resp, err := reqInvoker.SendSnsObjectDetailRequest(id)
if err != nil {
return vo.NewFail("SendSnsTimeLineRequestService" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// SendSnsUserPageRequestService 获取指定人朋友圈
func SendSnsUserPageRequestService(queryKey string, m req.GetSnsInfoModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
//获取好友朋友圈主页
resp, err := reqInvoker.SendSnsUserPageRequest(m.UserName, m.FirstPageMD5, m.MaxID, true)
if err != nil {
return vo.NewFail("SendSnsUserPageRequestService" + err.Error())
}
count := resp.GetObjectCount()
if count > 0 {
snsObjList := resp.ObjectList
for _, snsObject := range snsObjList {
objDesc := snsObject.ObjectDesc
tmpTimeLineObj := &proto_ref.TimelineObject{}
// 反序列化 TimeLineXML
err := xmltool.Unmarshal(objDesc.Buffer, &tmpTimeLineObj)
if err != nil {
log.Println("GetSnsSyncService Parse TimeLineXML - xml.Unmarshal err:", err)
}
snsObject.ObjectInfo = tmpTimeLineObj
//snsObject.ObjectDesc = nil
}
}
return vo.NewSuccessObj(resp, "")
})
}
// 转发收藏朋友圈
func SendFavItemCircleService(queryKey string, m req.SendFavItemCircle) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取指定的朋友圈
objIDString := baseutils.GetNumberString(m.SourceID)
snsObjID, _ := strconv.ParseUint(objIDString, 10, 64)
snsObject, err := reqInvoker.SendSnsObjectDetailRequest(snsObjID)
if err != nil {
baseutils.PrintLog("WXSnsTransTask.doFavTask - SendSnsObjectDetailRequest err: " + err.Error())
return vo.NewFail("操作失败!" + err.Error())
}
//放入消息队例
currentTaskMgr := iwxConnect.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentSnsTransTask := taskMgr.GetSnsTransTask()
// 转发朋友圈
err = currentSnsTransTask.DoSnsTransTask(snsObject, defines.MTaskTypeFavTrans, m.BlackList, m.Location, m.LocationVal)
if err == nil {
// 如果转发收藏成功则删除
reqInvoker.SendBatchDelFavItemRequest(m.FavItemID)
return vo.NewSuccessObj("ok", "操作成功!")
}
return vo.NewFail("操作失败!" + err.Error())
})
}
// 一键转发朋友圈
func SendOneIdCircleService(queryKey string, m req.GetIdDetailModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取指定的朋友圈
snsObjID, _ := strconv.ParseUint(m.Id, 10, 64)
snsObject, err := reqInvoker.SendSnsObjectDetailRequest(snsObjID)
if err != nil {
baseutils.PrintLog("WXSnsTransTask.doFavTask - SendSnsObjectDetailRequest err: " + err.Error())
return vo.NewFail("操作失败!" + err.Error())
}
//放入消息队例
currentTaskMgr := iwxConnect.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentSnsTransTask := taskMgr.GetSnsTransTask()
// 转发朋友圈
err = currentSnsTransTask.DoSnsTransTask(snsObject, defines.MTaskTypeFavTrans, m.BlackList, m.Location, m.LocationVal)
if err == nil {
// 如果转发收藏成功则删除
return vo.NewSuccessObj("ok", "转发成功!")
}
return vo.NewFail("操作失败!" + err.Error())
})
}
// 获取收藏朋友圈详情
func GetCollectCircleService(queryKey string, m req.SendFavItemCircle) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取指定的朋友圈
objIDString := baseutils.GetNumberString(m.SourceID)
snsObjID, _ := strconv.ParseUint(objIDString, 10, 64)
snsObject, err := reqInvoker.SendSnsObjectDetailRequest(snsObjID)
if err != nil {
baseutils.PrintLog("WXSnsTransTask.doFavTask - SendSnsObjectDetailRequest err: " + err.Error())
return vo.NewFail("操作失败!" + err.Error())
}
return vo.NewSuccessObj(snsObject, "操作成功!")
})
}
// SetBackgroundImageApi 设置朋友圈图片
func SetBackgroundImageService(queryKey string, m req.SetBackgroundImageModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//习近平
content := fmt.Sprintf("<TimelineObject><id><![CDATA[0]]></id><username><![CDATA[%s]]></username><createTime><![CDATA[0]]></createTime><contentDescShowType>0</contentDescShowType><contentDescScene>0</contentDescScene><private><![CDATA[0]]></private><contentDesc></contentDesc><contentattr><![CDATA[0]]></contentattr><sourceUserName></sourceUserName><sourceNickName></sourceNickName><statisticsData></statisticsData><weappInfo><appUserName></appUserName><pagePath></pagePath></weappInfo><canvasInfoXml></canvasInfoXml><location poiClickableStatus=\"0\" poiClassifyId=\"\" poiScale=\"0\" longitude=\"0.0\" city=\"\" poiName=\"\" latitude=\"0.0\" poiClassifyType=\"0\" poiAddress=\"\" ></location><ContentObject><contentStyle><![CDATA[7]]></contentStyle><contentSubStyle><![CDATA[0]]></contentSubStyle><title>&#x0A;&#x0A;&#x0A;</title><description></description><contentUrl></contentUrl><mediaList><media><id><![CDATA[0]]></id><type><![CDATA[2]]></type><title></title><description></description><private><![CDATA[0]]></private><url type=\"1\" ><![CDATA[%s]]></url><thumb type=\"1\" ><![CDATA[%s]]></thumb>", wxAccount.GetUserInfo().WxId, m.Url, m.Url)
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
snsPostItem := baseinfo.SnsPostItem{
Content: content,
Xml: true,
MediaList: make([]*baseinfo.SnsMediaItem, 0),
}
resp, err := reqInvoker.SendSnsPostRequestNew(&snsPostItem)
if err != nil {
return vo.NewFail("操作失败!" + err.Error())
}
return vo.NewSuccessObj(resp, "操作成功!")
})
}
// 下载视频
func DownloadMediaService(queryKey string, req req.DownloadMediaModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
tmpEncKey, _ := strconv.Atoi(req.Key)
videoData, err := reqInvoker.SendCdnSnsVideoDownloadReuqest(uint64(tmpEncKey), req.URL)
if err != nil {
return vo.NewFail("下载失败!" + err.Error())
}
return vo.NewSuccessObj(videoData, "下载成功!")
})
}
// 设置朋友圈可见天数
func SetFriendCircleDaysService(queryKey string, postItem req.SetFriendCircleDaysModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SetFriendCircleDays(&postItem)
if err != nil {
return vo.NewFail("设置朋友圈可见天数失败!" + err.Error())
}
return vo.NewSuccessObj("ok", "设置朋友圈可见天数成功!")
})
}
// SendFriendCircle发送朋友圈
func SendFriendCircleService(queryKey string, postItem req.SnsPostItemModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
snsPostItem := baseinfo.SnsPostItem{
MediaList: make([]*baseinfo.SnsMediaItem, 0),
}
//对结构体进行复制
StructCopy(&snsPostItem, &postItem)
if postItem.LocationInfo != nil {
snsPostItem.LocationInfo = (*baseinfo.SnsLocationInfo)(postItem.LocationInfo)
}
if len(postItem.MediaList) > 0 {
for _, item := range postItem.MediaList {
var snsMediaItem baseinfo.SnsMediaItem
StructCopy(&snsMediaItem, item)
snsPostItem.MediaList = append(snsPostItem.MediaList, &snsMediaItem)
}
}
resp, err := reqInvoker.SendSnsPostRequestNew(&snsPostItem)
if err != nil {
return vo.NewFail("发送朋友圈失败!" + err.Error())
}
return vo.NewSuccessObj(resp, "发送朋友圈成功!")
})
}
// SendFriendCircleByXMlService 根据XML发送朋友圈
func SendFriendCircleByXMlService(queryKey string, postItem baseinfo.TimelineObject) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendSnsPostRequestByXML(&postItem, []string{})
if err != nil {
return vo.NewFail("发送朋友圈失败!" + err.Error())
}
return vo.NewSuccessObj(nil, "发送朋友圈成功!")
})
}
// UploadFriendCircleImagesService 上传朋友圈图片
func UploadFriendCircleImageService(queryKey string, m req.UploadFriendCircleModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
uploadRespArray := garray.New(true)
wg := new(sync.WaitGroup)
if len(m.ImageDataList) <= 0 {
return vo.NewFail("没有要上传的图片!")
}
for _, imageData := range m.ImageDataList {
sImageBase := strings.Split(imageData, ",")
if len(sImageBase) > 1 {
imageData = sImageBase[1]
}
imageBuffer, _ := base64.StdEncoding.DecodeString(imageData)
//生成一个Md5
imageId := baseutils.Md5ValueByte(imageBuffer, false)
fmt.Println(imageId)
//查询数据库是否存在该Id
//上传图片
wg.Add(1)
go func(image []byte, id string) {
defer wg.Done()
upImageResp, err := reqInvoker.SendCdnSnsUploadImageReuqest(image)
if err != nil {
uploadRespArray.Append(gin.H{
"imageId": imageId,
"errMgs": err.Error(),
})
} else {
uploadRespArray.Append(gin.H{
"imageId": imageId,
"resp": upImageResp,
})
}
}(imageBuffer, imageId)
}
wg.Wait()
return vo.NewSuccessObj(uploadRespArray.Interfaces(), "")
})
}
// SendSnsObjectOpRequestService 朋友圈操作
func SendSnsObjectOpRequestService(queryKey string, m req.SendSnsObjectOpRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
if len(m.SnsObjectOpList) <= 0 {
return vo.NewFail("没有要操作的Id")
}
opItems := make([]*baseinfo.SnsObjectOpItem, 0)
for _, item := range m.SnsObjectOpList {
var opItem baseinfo.SnsObjectOpItem
StructCopy(&opItem, &item)
opItems = append(opItems, &opItem)
}
resp, err := reqInvoker.SendSnsObjectOpRequest(opItems)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// SendSnsCommentRequestService 点赞/评论
func SendSnsCommentRequestService(queryKey string, m req.SendSnsCommentRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
respArray := garray.New(true)
wg := new(sync.WaitGroup)
if len(m.SnsCommentList) <= 0 {
return vo.NewFail("没有数据!")
}
for _, item := range m.SnsCommentList {
commItem := &baseinfo.SnsCommentItem{}
if item.OpType == baseinfo.MMSnsCommentTypeLike { //点赞
id, _ := strconv.ParseUint(item.ItemID, 0, 64)
commItem = clientsdk.CreateSnsCommentLikeItem(id, item.ToUserName)
} else if item.OpType == baseinfo.MMSnsCommentTypeComment { // 评论
//oldDevieType:=wxAccount.GetUserInfo().DeviceInfo.OsType
//wxAccount.GetUserInfo().DeviceInfo.OsType="wechat"
//_=reqInvoker.SendAutoAuthRequest()
/*defer func() {
wxAccount.GetUserInfo().DeviceInfo.OsType=oldDevieType
_=reqInvoker.SendAutoAuthRequest()
}()*/
//评论能用
if m.Tx {
item.Content = item.Content + "\n\n~~~~~~~~~~\n每日一练习,\n大大有进步"
}
id, _ := strconv.ParseUint(item.ItemID, 0, 64)
commItem = clientsdk.CreateSnsCommentItem(id, item.ToUserName, item.Content, nil)
commItem.ReplyItem = &baseinfo.ReplyCommentItem{}
StructCopy(commItem.ReplyItem, &item.ReplyItem)
}
wg.Add(1)
go func(commentItem *baseinfo.SnsCommentItem) {
defer wg.Done()
err := reqInvoker.SendSnsCommentRequest(commentItem)
if err != nil {
respArray.Append(gin.H{
"data": commentItem,
"isCommentSuccess": false,
"errMsg": err.Error(),
})
} else {
respArray.Append(gin.H{
"data": commentItem,
"isCommentSuccess": true,
"errMsg": "",
})
}
}(commItem)
}
wg.Wait()
return vo.NewSuccessObj(respArray.Interfaces(), "")
})
}
// GetSnsSyncService 同步朋友圈
func GetSnsSyncService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
userInfo := wxAccount.GetUserInfo()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
snsSyncResp, err := reqInvoker.SendSnsSyncRequest(false)
if err != nil {
return vo.NewFail("GetSnsSyncService err:" + err.Error())
}
// 如果请求失败
retCode := snsSyncResp.GetBaseResponse().GetRet()
errMsg := snsSyncResp.GetBaseResponse().GetErrMsg().GetStr()
if retCode != baseinfo.MMOk {
return vo.NewFail("WXSnsSyncRouter err:" + strconv.Itoa(int(retCode)) + " msg = " + errMsg)
}
// 更新 key
userInfo.SnsSyncKey = snsSyncResp.GetKeyBuf().GetBuffer()
// 遍历同步到的朋友圈
tmpCmdList := snsSyncResp.GetCmdList()
tmpCount := tmpCmdList.GetCount()
// 定义正则表达式,用于匹配<TimelineObject>...</TimelineObject>之间的内容
re := regexp.MustCompile(`<TimelineObject>.*?</TimelineObject>`)
snsItems := make([]baseinfo.SnsSyncItem, 0)
if tmpCount > 0 {
itemList := snsSyncResp.GetCmdList().GetItemList()
for _, item := range itemList {
snsItem := baseinfo.SnsSyncItem{
CmdId: item.GetCmdId(),
}
tmpTimeLineObj := &baseinfo.TimelineObject{}
tmpTimeLineData := re.FindString(string(item.CmdBuf.Data))
// 反序列化 TimeLineXML
err := xmltool.Unmarshal([]byte(tmpTimeLineData), &tmpTimeLineObj)
if err != nil {
log.Println("GetSnsSyncService Parse TimeLineXML - xml.Unmarshal err:", err)
}
snsItem.TimelineInfo = *tmpTimeLineObj
snsItems = append(snsItems, snsItem)
}
}
resp := baseinfo.SnsSyncResp{
ContinueFlag: snsSyncResp.GetContinueFlag(),
SnsSyncKey: userInfo.SnsSyncKey,
SnsCount: tmpCount,
SnsItems: snsItems,
}
return vo.NewSuccessObj(resp, "")
})
}
// CdnSnsVideoUploadService 上传CDN朋友圈视频服务
func CdnSnsVideoUploadService(queryKey string, m req.CdnSnsVideoUploadModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 解码base64数据
videoData, err := base64.StdEncoding.DecodeString(m.VideoData)
if err != nil {
return vo.NewFail("视频数据解析失败!" + err.Error())
}
thumbData, err := base64.StdEncoding.DecodeString(m.ThumbData)
if err != nil {
return vo.NewFail("缩略图数据解析失败!" + err.Error())
}
//上传朋友圈视频
resp, err := reqInvoker.SendCdnSnsVideoUploadReuqest(videoData, thumbData)
if err != nil {
return vo.NewFail("上传朋友圈视频失败!" + err.Error())
}
return vo.NewSuccessObj(resp, "上传朋友圈视频成功")
})
}