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