642 lines
24 KiB
Go
642 lines
24 KiB
Go
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>


</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, "上传朋友圈视频成功")
|
||
})
|
||
}
|