first commit
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXAddContactLabelRouter 心跳包响应路由
|
||||
type WXAddContactLabelRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXAddContactLabelRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentReqInvoker := currentWXConn.GetWXReqInvoker()
|
||||
|
||||
// 解析退出登陆响应包
|
||||
var addLabelResp wechat.AddContactLabelResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &addLabelResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,应该关闭链接
|
||||
currentWXConn.Stop()
|
||||
return err
|
||||
}
|
||||
|
||||
// 跟新标签列表
|
||||
_, _ = currentReqInvoker.SendGetContactLabelListRequest(false)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/db"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXAutoAuthRouter token登陆响应路由
|
||||
type WXAutoAuthRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (glqr *WXAutoAuthRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("(glqr *WXAutoAuthRouter) Handle(wxResp wxface.IWXResponse)")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
//currentInvoker := currentWXConn.GetWXReqInvoker()
|
||||
|
||||
// 解析 token 登陆响应
|
||||
var manualResponse wechat.ManualAuthResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &manualResponse)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
retCode := manualResponse.GetBaseResponse().GetRet()
|
||||
currentUserInfo.UpdateLastAuthTime() // 更新上次自动登录的二次登录时间
|
||||
// Mysql 提交登录日志
|
||||
db.SetLoginLog("AutoAuth", currentWXAccount, manualResponse.GetBaseResponse().GetErrMsg().GetStr(), retCode)
|
||||
|
||||
switch retCode {
|
||||
case baseinfo.MMOk: //success
|
||||
WXAutoAuthSuccess(&manualResponse, currentWXConn)
|
||||
//redis 发布消息 发布登录状态
|
||||
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
|
||||
currentWXAccount.SetLoginState(baseinfo.MMLoginStateOnLine)
|
||||
return nil
|
||||
case baseinfo.MMErrDropped: //出现用户主动退出获取被T下线在线状态不存在需要调用Push
|
||||
// -2023 登录出现错误可重新登录
|
||||
/*if strings.Contains(manualResponse.GetBaseResponse().GetErrMsg().GetStr(), "登录出现错误") {
|
||||
currentWXConn.SendAutoAuthWaitingMinutes(5)
|
||||
return nil
|
||||
}*/
|
||||
//fmt.Println(hex.EncodeToString(currentUserInfo.AutoAuthKey))
|
||||
// 登录状态改为登录后退出
|
||||
currentWXAccount.SetLoginState(baseinfo.MMLoginStateLogout)
|
||||
// 保存登录状态到数据库
|
||||
db.UpdateLoginStatus(currentUserInfo.WxId, int32(currentWXAccount.GetLoginState()), "你已退出微信")
|
||||
// 关闭重新启动,再次发送登陆请求
|
||||
currentWXConn.Stop()
|
||||
//redis 发布消息 发布登录状态
|
||||
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
|
||||
return errors.New("WXAutoAuthRouter retCode = - 2023,err: " + manualResponse.GetBaseResponse().GetErrMsg().GetStr())
|
||||
case -100:
|
||||
// 关闭重新启动,再次发送登陆请求
|
||||
currentWXConn.Stop()
|
||||
// 登录状态改为未登录
|
||||
currentWXAccount.SetLoginState(baseinfo.MMLoginStateNoLogin)
|
||||
errMsg := manualResponse.GetBaseResponse().GetErrMsg().GetStr()
|
||||
// 保存登录状态到数据库
|
||||
db.UpdateLoginStatus(currentUserInfo.GetUserName(), int32(currentUserInfo.GetLoginState()), errMsg)
|
||||
//redis 发布消息 发布登录状态
|
||||
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
|
||||
return errors.New("WXAutoAuthRouter retCode = - 100,err: " + manualResponse.GetBaseResponse().GetErrMsg().GetStr())
|
||||
case -6:
|
||||
// 登录状态改为未登录
|
||||
currentWXAccount.SetLoginState(baseinfo.MMLoginStateNoLogin)
|
||||
// 关闭重新启动,再次发送登陆请求
|
||||
currentWXConn.Stop()
|
||||
// 保存登录状态到数据库
|
||||
errMsg := manualResponse.GetBaseResponse().GetErrMsg().GetStr()
|
||||
db.UpdateLoginStatus(currentUserInfo.WxId, int32(currentUserInfo.GetLoginState()), errMsg)
|
||||
//redis 发布消息 发布登录状态
|
||||
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
|
||||
return errors.New("WXAutoAuthRouter err: " + errMsg)
|
||||
default:
|
||||
currentWXAccount.SetLoginState(baseinfo.MMLoginStateNoLogin)
|
||||
// 关闭重新启动,再次发送登陆请求
|
||||
currentWXConn.Stop()
|
||||
// 保存登录状态到数据库
|
||||
errMsg := manualResponse.GetBaseResponse().GetErrMsg().GetStr()
|
||||
db.UpdateLoginStatus(currentUserInfo.WxId, int32(currentUserInfo.GetLoginState()), errMsg)
|
||||
//redis 发布消息 发布登录状态
|
||||
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
|
||||
return errors.New("WXAutoAuthRouter err: " + errMsg)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func WXAutoAuthSuccess(manualResponse *wechat.ManualAuthResponse, connect wxface.IWXConnect) {
|
||||
account := connect.GetWXAccount()
|
||||
userInfo := account.GetUserInfo()
|
||||
reqInvoker := connect.GetWXReqInvoker()
|
||||
// 获取aesKey
|
||||
userInfo.ConsultSessionKey(manualResponse.AuthParam.EcdhKey.Key.GetBuffer(), manualResponse.AuthParam.SessionKey.Key)
|
||||
// SetAutoKey
|
||||
userInfo.SetAutoKey(manualResponse.AuthParam.AutoAuthKey.Buffer)
|
||||
// SetNetworkSect
|
||||
userInfo.SetNetworkSect(manualResponse.DnsInfo)
|
||||
|
||||
// 登录成功可与服务器重新建立长链接
|
||||
isConnected := connect.IsConnected()
|
||||
if !isConnected {
|
||||
connect.Start()
|
||||
}
|
||||
|
||||
// 是否需要初始化cdn信息
|
||||
if userInfo.CheckCdn() {
|
||||
// 获取CDNDns信息
|
||||
_ = reqInvoker.SendGetCDNDnsRequest()
|
||||
}
|
||||
// 获取账号的wxProfile
|
||||
_ = reqInvoker.SendGetProfileRequest()
|
||||
// 登录状态改为在线
|
||||
account.SetLoginState(baseinfo.MMLoginStateOnLine)
|
||||
// 发送心跳
|
||||
GetHeartBeatTime := connect.GetHeartBeatTime()
|
||||
nowTime := time.Now().Unix()
|
||||
HeartBeatWaiting := 175
|
||||
if GetHeartBeatTime == 0 {
|
||||
HeartBeatWaiting = 1
|
||||
} else if nowTime-GetHeartBeatTime >= 60 {
|
||||
HeartBeatWaiting = 1
|
||||
} else {
|
||||
HeartBeatWaiting = 175 - int(nowTime-GetHeartBeatTime)
|
||||
}
|
||||
connect.SendHeartBeatWaitingSeconds(uint32(HeartBeatWaiting))
|
||||
// 等待发送二次登录30分钟
|
||||
connect.SendAutoAuthWaitingMinutes(60)
|
||||
|
||||
// 保存UserInfo
|
||||
db.UpdateUserInfo(userInfo)
|
||||
// 更新状态到数据库
|
||||
db.UpdateLoginStatus(userInfo.GetUserName(), int32(account.GetLoginState()), "登录成功!")
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/db"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXBatchGetContactBriefInfoReqRouter 批量获取联系人信息
|
||||
type WXBatchGetContactBriefInfoReqRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (wxbgcbirr *WXBatchGetContactBriefInfoReqRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentWXCache := currentWXConn.GetWXCache()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentReqInvoker := currentWXConn.GetWXReqInvoker()
|
||||
uuid := currentWXAccount.GetUserInfo().UUID
|
||||
// 解析批量获取联系人信息响应包
|
||||
var briefInfoResp wechat.BatchGetContactBriefInfoResp
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &briefInfoResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
// fmt.Println("批量获取联系人信息响应包:")
|
||||
|
||||
tmpContactList := briefInfoResp.GetContactList()
|
||||
tmpCount := len(tmpContactList)
|
||||
for index := 0; index < tmpCount; index++ {
|
||||
tmpContactBriefInfo := tmpContactList[index]
|
||||
userName := tmpContactBriefInfo.GetUsername()
|
||||
tmpModContact := tmpContactBriefInfo.GetContact()
|
||||
nickName := tmpModContact.GetNickName().GetStr()
|
||||
// 公众号
|
||||
hasExternalInfo := false
|
||||
if len(tmpModContact.GetCustomizedInfo().GetExternalInfo()) > 0 {
|
||||
hasExternalInfo = true
|
||||
}
|
||||
if strings.HasPrefix(userName, "gh_") || hasExternalInfo {
|
||||
if len(nickName) <= 0 {
|
||||
continue
|
||||
}
|
||||
// currentWXAccount.AddWXGhContact(tmpModContact)
|
||||
continue
|
||||
}
|
||||
|
||||
// 群
|
||||
if strings.HasSuffix(userName, "@chatroom") {
|
||||
// currentWXAccount.AddWXGroup(tmpModContact)
|
||||
db.SaveOrUpdateContact(tmpModContact, uuid)
|
||||
continue
|
||||
}
|
||||
|
||||
// 好友
|
||||
// currentWXAccount.AddWXFriendContact(tmpModContact)
|
||||
if !isSystemWXID(userName) {
|
||||
db.SaveOrUpdateContact(tmpModContact, uuid)
|
||||
}
|
||||
}
|
||||
|
||||
// 获取剩余20个微信ID列表
|
||||
nextWxidList := currentWXCache.GetNextInitContactWxidList(20)
|
||||
if len(nextWxidList) > 0 {
|
||||
currentReqInvoker.SendBatchGetContactBriefInfoReq(nextWxidList)
|
||||
} else {
|
||||
// 初始化完成
|
||||
db.UpdateInitContactStatus(uuid, 1)
|
||||
// if !currentWXCache.IsInitContactFinished() {
|
||||
// currentWXCache.SetInitContactFinished(true)
|
||||
// }
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func isSystemWXID(userName string) bool {
|
||||
if userName == "qqmail" ||
|
||||
userName == "qmessage" ||
|
||||
userName == "mphelper" ||
|
||||
userName == "filehelper" ||
|
||||
userName == "weixin" ||
|
||||
userName == "floatbottle" ||
|
||||
userName == "fmessage" ||
|
||||
userName == "medianote" {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"encoding/xml"
|
||||
"time"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/db"
|
||||
|
||||
"github.com/lunny/log"
|
||||
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXBatchGetFavItemRouter 获取单条收藏详情响应路由
|
||||
type WXBatchGetFavItemRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXBatchGetFavItemRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentTaskMgr := currentWXConn.GetWXTaskMgr()
|
||||
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
|
||||
currentSnsTransTask := taskMgr.GetSnsTransTask()
|
||||
|
||||
// 解析 获取单条收藏响应包
|
||||
var batchGetFavItemResp wechat.BatchGetFavItemResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &batchGetFavItemResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
// 解析单条收藏响应详情
|
||||
count := batchGetFavItemResp.GetCount()
|
||||
objectList := batchGetFavItemResp.GetObjectList()
|
||||
for index := uint32(0); index < count; index++ {
|
||||
tmpFavObject := objectList[index]
|
||||
// 反序列化
|
||||
objStr := tmpFavObject.GetObject()
|
||||
if len(objStr) <= 0 {
|
||||
continue
|
||||
}
|
||||
favItem := &baseinfo.FavItem{}
|
||||
err := xml.Unmarshal([]byte(objStr), favItem)
|
||||
if err != nil {
|
||||
log.Error("xml 解析error!")
|
||||
continue
|
||||
}
|
||||
if tmpFavObject == nil {
|
||||
continue
|
||||
}
|
||||
// 自动转发
|
||||
favItem.FavItemID = tmpFavObject.GetFavId()
|
||||
currentSnsTransTask.AddFavItem(favItem)
|
||||
//收藏发送mq
|
||||
if favItem != nil {
|
||||
log.Info("----收藏id=", favItem.FavItemID)
|
||||
go db.PublishFavItem(currentWXAccount, favItem)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/clientsdk/baseutils"
|
||||
"xiawan/wx/db"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
)
|
||||
|
||||
// WXCheckQrcodeRouter 检测二维码状态响应路由
|
||||
type WXCheckQrcodeRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (cqr *WXCheckQrcodeRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXCheckQrcodeRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentAccount := currentWXConn.GetWXAccount()
|
||||
currentInvoker := currentWXConn.GetWXReqInvoker()
|
||||
currentCache := currentWXConn.GetWXCache()
|
||||
currentUserInfo := currentAccount.GetUserInfo()
|
||||
|
||||
// 解析检测二维码响应
|
||||
var checkResp wechat.CheckLoginQRCodeResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &checkResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
currentWXConn.Stop()
|
||||
return err
|
||||
}
|
||||
|
||||
// 解密出现问题,说明协议出现了问题
|
||||
qrcodeInfo := currentCache.GetQrcodeInfo()
|
||||
retBytes, err := baseutils.AesDecryptByteKey(checkResp.LoginQrcodeNotifyPkg.NotifyData.Buffer, qrcodeInfo.QrCodeKey)
|
||||
|
||||
if err != nil {
|
||||
// 请求出问题了,应该关闭链接
|
||||
currentWXConn.Stop()
|
||||
return err
|
||||
}
|
||||
|
||||
lgQrNotify := &wechat.LoginQRCodeNotify{}
|
||||
err = proto.Unmarshal(retBytes, lgQrNotify)
|
||||
if err != nil {
|
||||
// 请求出问题了,应该关闭链接
|
||||
currentWXConn.Stop()
|
||||
return err
|
||||
}
|
||||
|
||||
errMsg := ""
|
||||
if lgQrNotify.GetState() == 2 {
|
||||
// 每秒查一次数据库太频繁了,这里改为仅在扫码成功后查一次
|
||||
bind, _ := db.IsLicenseBind(currentUserInfo.UUID)
|
||||
if bind != nil && len(lgQrNotify.GetWxid()) > 0 && lgQrNotify.GetWxid() != bind.WxId {
|
||||
errMsg = "该授权码(KEY)已绑定其他微信号, 请换一个KEY"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 添加扫码状态缓存
|
||||
db.AddCheckStatusCache(currentUserInfo.UUID, &baseinfo.CheckLoginQrCodeResult{
|
||||
LoginQRCodeNotify: lgQrNotify,
|
||||
Msg: errMsg,
|
||||
})
|
||||
|
||||
if len(errMsg) != 0 {
|
||||
// 当前 License 已绑定其他微信号, 需要更换 License
|
||||
currentWXConn.Stop()
|
||||
return errors.New(errMsg)
|
||||
}
|
||||
|
||||
str := byteArrayToString(retBytes)
|
||||
ticketValue := extractTicketValue(str)
|
||||
|
||||
if ticketValue != "" {
|
||||
// 赋值ticketValue
|
||||
currentUserInfo.Ticket = ticketValue
|
||||
currentUserInfo.LoginDataInfo.Ticket = ticketValue
|
||||
db.AddCheckStatusCache(currentUserInfo.UUID, &baseinfo.CheckLoginQrCodeResult{
|
||||
LoginQRCodeNotify: lgQrNotify,
|
||||
Msg: "请提交验证码后登录",
|
||||
Ret: int32(0),
|
||||
})
|
||||
}
|
||||
|
||||
if lgQrNotify.GetState() == 2 {
|
||||
// 扫码成功发送登录包
|
||||
err := currentInvoker.SendManualAuthRequest(lgQrNotify.GetWxnewpass(), lgQrNotify.GetWxid())
|
||||
if err != nil {
|
||||
// 在停止连接前,确保扫码状态被正确持久化保存
|
||||
db.AddCheckStatusCache(currentUserInfo.UUID, &baseinfo.CheckLoginQrCodeResult{
|
||||
LoginQRCodeNotify: lgQrNotify,
|
||||
Msg: "登录包发送失败:" + err.Error(),
|
||||
Ret: int32(300),
|
||||
})
|
||||
// 确保状态被保存后再停止连接
|
||||
time.Sleep(time.Millisecond * 200)
|
||||
currentWXConn.Stop()
|
||||
return err
|
||||
}
|
||||
go func() {
|
||||
// 3 秒后发送指令
|
||||
time.Sleep(3 * time.Second)
|
||||
currentCache.SetScanFinish(true)
|
||||
|
||||
// 扫码完成后再次更新状态缓存,确保登录成功的状态被持久化
|
||||
db.AddCheckStatusCache(currentUserInfo.UUID, &baseinfo.CheckLoginQrCodeResult{
|
||||
LoginQRCodeNotify: lgQrNotify,
|
||||
Msg: "登录成功",
|
||||
Ret: int32(0),
|
||||
})
|
||||
}()
|
||||
} else if lgQrNotify.GetState() == 4 {
|
||||
// 在停止连接前,确保状态被正确保存
|
||||
db.AddCheckStatusCache(currentUserInfo.UUID, &baseinfo.CheckLoginQrCodeResult{
|
||||
LoginQRCodeNotify: lgQrNotify,
|
||||
Msg: "二维码失效",
|
||||
Ret: int32(301),
|
||||
})
|
||||
// 确保状态被保存后再停止连接
|
||||
time.Sleep(time.Millisecond * 200)
|
||||
currentWXConn.Stop()
|
||||
return errors.New("WXCheckQrcodeRouter err: 二维码失效")
|
||||
} else {
|
||||
currentUserInfo.HeadURL = lgQrNotify.GetHeadImgUrl()
|
||||
err := currentWXConn.GetWXReqInvoker().SendCheckLoginQrcodeRequest(qrcodeInfo.QrCodeUUID, qrcodeInfo.QrCodeKey)
|
||||
if err != nil {
|
||||
currentWXConn.Stop()
|
||||
return err
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func byteArrayToString(data []byte) string {
|
||||
return string(data)
|
||||
}
|
||||
|
||||
func extractTicketValue(str string) string {
|
||||
index := strings.Index(str, "ticket=")
|
||||
if index == -1 {
|
||||
return ""
|
||||
}
|
||||
return str[index+len("ticket="):]
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
)
|
||||
|
||||
// WXFavSyncRouter 同步收藏响应路由
|
||||
type WXFavSyncRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXFavSyncRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentReqInvoker := currentWXConn.GetWXReqInvoker()
|
||||
currentWXCache := currentWXConn.GetWXCache()
|
||||
currentTaskMgr := currentWXConn.GetWXTaskMgr()
|
||||
// currentSyncMgr := currentWXConn.GetWXSyncMgr()
|
||||
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
|
||||
currentSnsTransTask := taskMgr.GetSnsTransTask()
|
||||
|
||||
// 解析同步收藏响应包
|
||||
var favSyncResp wechat.FavSyncResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &favSyncResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 保存同步key下次使用
|
||||
// 解析同步收藏列表
|
||||
cmdList := favSyncResp.GetCmdList()
|
||||
tmpCount := cmdList.GetCount()
|
||||
tmpKeyBuf := favSyncResp.KeyBuf.GetBuffer()
|
||||
if len(tmpKeyBuf) <= 0 {
|
||||
currentReqInvoker.SendGetFavInfoRequest()
|
||||
return nil
|
||||
}
|
||||
|
||||
currentUserInfo.FavSyncKey = tmpKeyBuf
|
||||
|
||||
if tmpCount < 1024 {
|
||||
if !currentWXCache.IsInitFavSyncFinished() {
|
||||
// 同步完成
|
||||
currentWXCache.SetInitFavSyncFinished(true)
|
||||
}
|
||||
}
|
||||
currentReqInvoker.SendGetFavInfoRequest()
|
||||
// 如果还没开启转发收藏
|
||||
if !currentSnsTransTask.IsAutoRelay() {
|
||||
return nil
|
||||
}
|
||||
|
||||
itemList := cmdList.GetItemList()
|
||||
// 获取收藏缓存
|
||||
favInfoCache := currentWXCache.GetFavInfoCache()
|
||||
for index := uint32(0); index < tmpCount; index++ {
|
||||
tmpItem := itemList[index]
|
||||
// 判断是否是新增的收藏
|
||||
tmpCmdID := tmpItem.GetCmdId()
|
||||
if tmpCmdID != baseinfo.MMFavSyncCmdAddItem {
|
||||
return nil
|
||||
}
|
||||
// 处理新增的收藏
|
||||
addItem := &wechat.AddFavItem{}
|
||||
err := proto.Unmarshal(tmpItem.GetCmdBuf().GetData(), addItem)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 判断是否重复
|
||||
if favInfoCache.LastFavID() == addItem.GetFavId() && favInfoCache.LastFavUpdateTime() == addItem.GetUpdateTime() {
|
||||
continue
|
||||
}
|
||||
favInfoCache.SetLastFavID(addItem.GetFavId())
|
||||
favInfoCache.SetLastFavUpdateTime(addItem.GetUpdateTime())
|
||||
// 获取收藏详情
|
||||
return currentReqInvoker.SendBatchGetFavItemRequest(favInfoCache.LastFavID())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXGetCDNDnsRouter 获取CDN dns信息
|
||||
type WXGetCDNDnsRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXGetCDNDnsRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXGetCDNDnsRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
|
||||
// 解析获取CdnDns信息响应包
|
||||
var getCdnDNSResp wechat.GetCDNDnsResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &getCdnDNSResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 跟新DNS信息
|
||||
currentUserInfo.APPDnsInfo = getCdnDNSResp.GetAppDnsInfo()
|
||||
currentUserInfo.FAKEDnsInfo = getCdnDNSResp.GetFakeDnsInfo()
|
||||
currentUserInfo.SNSDnsInfo = getCdnDNSResp.GetSnsDnsInfo()
|
||||
currentUserInfo.DNSInfo = getCdnDNSResp.GetDnsInfo()
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/defines"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXGetContactLabelListRouter 获取联系人标签路由
|
||||
type WXGetContactLabelListRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXGetContactLabelListRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentReqInvoker := currentWXConn.GetWXReqInvoker()
|
||||
|
||||
// 解析退出登陆响应包
|
||||
var getContableListResp wechat.GetContactLabelListResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &getContableListResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,应该关闭链接
|
||||
currentWXConn.Stop()
|
||||
return err
|
||||
}
|
||||
|
||||
// 先判断是否有 收藏转发屏蔽,同步转发屏蔽
|
||||
hasFavLabel := false
|
||||
hasSyncLabel := false
|
||||
labelCount := getContableListResp.GetLabelCount()
|
||||
labelPairList := getContableListResp.GetLabelPairList()
|
||||
// 跟新标签列表
|
||||
currentWXAccount.SetLabelPairList(labelPairList)
|
||||
// 判断是否有收藏转发屏蔽组、同步转发屏蔽,如果没有就添加
|
||||
for index := uint32(0); index < labelCount; index++ {
|
||||
tmpLabelPair := labelPairList[index]
|
||||
if tmpLabelPair.GetLabelName() == defines.MFavTransShieldLabelName {
|
||||
hasFavLabel = true
|
||||
continue
|
||||
}
|
||||
|
||||
if tmpLabelPair.GetLabelName() == defines.MSyncTransShieldLabelName {
|
||||
hasSyncLabel = true
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// 创建 屏蔽组
|
||||
newLabelNameList := []string{}
|
||||
if !hasFavLabel {
|
||||
newLabelNameList = append(newLabelNameList, defines.MFavTransShieldLabelName)
|
||||
}
|
||||
if !hasSyncLabel {
|
||||
newLabelNameList = append(newLabelNameList, defines.MSyncTransShieldLabelName)
|
||||
}
|
||||
if len(newLabelNameList) > 0 {
|
||||
currentReqInvoker.SendAddContactLabelRequest(newLabelNameList, false)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXGetFavInfoRouter 心跳包响应路由
|
||||
type WXGetFavInfoRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXGetFavInfoRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXGetFavInfoRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentWXCache := currentWXConn.GetWXCache()
|
||||
currentSyncMgr := currentWXConn.GetWXSyncMgr()
|
||||
|
||||
// 解析退出登陆响应包
|
||||
var logoutResp wechat.GetFavInfoResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &logoutResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 如果没有初始化完成,则继续初始化
|
||||
if !currentWXCache.IsInitFavSyncFinished() {
|
||||
currentSyncMgr.SendFavSyncRequest()
|
||||
return nil
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/db"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXGetProfileRouter 获取帐号信息路由
|
||||
type WXGetProfileRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXGetProfileRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXGetProfileRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
|
||||
// 解析账号Profile响应
|
||||
userProfileResp := new(wechat.GetProfileResponse)
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), userProfileResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 设置昵称和头像
|
||||
currentUserInfo.NickName = userProfileResp.GetUserInfo().GetNickName().GetStr()
|
||||
currentUserInfo.HeadURL = userProfileResp.GetUserInfoExt().GetSmallHeadImgUrl()
|
||||
// 设置UserProfile信息
|
||||
currentWXAccount.SetUserProfile(userProfileResp)
|
||||
// 更新用户信息
|
||||
db.UpdateUserInfoByPhone(userProfileResp.GetUserInfo())
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXGetQrcodeRouter 获取个人/群二维码响应
|
||||
type WXGetQrcodeRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXGetQrcodeRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXGetQrcodeRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
|
||||
// 解析获取二维码响应包
|
||||
var getQrcodeResp wechat.GetQRCodeResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &getQrcodeResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 如果获取失败
|
||||
if getQrcodeResp.GetBaseResponse().GetRet() != 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 判断是否是群聊
|
||||
tmpUserName := string(wxResp.GetPackHeader().ReqData)
|
||||
if !strings.HasSuffix(tmpUserName, "@chatroom") {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 保存群二维码
|
||||
retList := strings.Split(tmpUserName, "@")
|
||||
qrcodeFileName := retList[0] + ".png"
|
||||
currentWXConn.AddGroupQrcodeData(getQrcodeResp.Qrcode.GetBuffer(), qrcodeFileName)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
|
||||
"github.com/lunny/log"
|
||||
)
|
||||
|
||||
// WXHeartBeatRouter 心跳包响应路由
|
||||
type WXHeartBeatRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXHeartBeatRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXHeartBeatRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
|
||||
// 解析心跳包响应
|
||||
var hearBeatResp wechat.HeartBeatResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &hearBeatResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
if hearBeatResp.GetBaseResponse().GetRet() == 0 {
|
||||
log.Printf("[%s],[%s] HeartBeatSuccess \n", currentUserInfo.GetUserName(), currentUserInfo.NickName)
|
||||
currentWXConn.StopShortReader()
|
||||
// 获取当前时间 秒
|
||||
nowTime := time.Now().Unix()
|
||||
currentWXConn.SetHeartBeatTime(nowTime)
|
||||
}
|
||||
//fmt.Println("心跳--->", hearBeatResp.GetBaseResponse().GetRet())
|
||||
// 等待 NextTime后再次发送心跳包
|
||||
currentWXConn.SendHeartBeatWaitingSeconds(hearBeatResp.GetNextTime())
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXInitContactRouter 初始化联系人响应路由
|
||||
type WXInitContactRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXInitContactRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentWXCache := currentWXConn.GetWXCache()
|
||||
currentReqInvoker := currentWXConn.GetWXReqInvoker()
|
||||
|
||||
// 解析初始化通讯录响应
|
||||
var initContactResp wechat.InitContactResp
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &initContactResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 设置ContactSeq
|
||||
newContactSeq := initContactResp.GetCurrentWxcontactSeq()
|
||||
currentWXCache.SetContactSeq(newContactSeq)
|
||||
// 判断 联系人数量
|
||||
contactUserNameList := initContactResp.GetContactUsernameList()
|
||||
currentWXCache.AddInitContactWxidList(contactUserNameList)
|
||||
|
||||
if len(contactUserNameList) >= 100 {
|
||||
currentReqInvoker.SendInitContactRequest(newContactSeq)
|
||||
} else {
|
||||
// 初始化通讯录
|
||||
tmpWxidList := currentWXCache.GetNextInitContactWxidList(20)
|
||||
currentReqInvoker.SendBatchGetContactBriefInfoReq(tmpWxidList)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/db"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXLogoutRouter 心跳包响应路由
|
||||
type WXLogoutRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXLogoutRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXLogoutRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
|
||||
// 解析退出登陆响应包
|
||||
var logoutResp wechat.LogOutResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &logoutResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
currentUserInfo.SetLoginState(baseinfo.MMLoginQrcodeStateNone)
|
||||
db.UpdateLoginStatus(currentUserInfo.GetUserName(), int32(currentUserInfo.GetLoginState()), "LogOut")
|
||||
// 退出登陆成功
|
||||
currentWXConn.Stop()
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/clientsdk/baseutils"
|
||||
"xiawan/wx/db"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXManualAuthRouter 扫码登陆响应路由
|
||||
type WXManualAuthRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (glqr *WXManualAuthRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXManualAuthRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentCache := currentWXConn.GetWXCache()
|
||||
currentInvoker := currentWXConn.GetWXReqInvoker()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentPackHeader := wxResp.GetPackHeader()
|
||||
currentWXSyncMgr := currentWXConn.GetWXSyncMgr()
|
||||
//currentWXFileHelperMgr := currentWXConn.GetWXFileHelperMgr()
|
||||
|
||||
// 解析扫码登陆响应
|
||||
var manualResponse wechat.ManualAuthResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, currentPackHeader, &manualResponse)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
retCode := manualResponse.GetBaseResponse().GetRet()
|
||||
// 重定向
|
||||
switch retCode {
|
||||
case baseinfo.MMErrIdcRedirect:
|
||||
|
||||
currentUserInfo.ShortHost = manualResponse.GetDnsInfo().GetNewHostList().GetList()[1].GetSubstitute()
|
||||
currentUserInfo.LongHost = manualResponse.GetDnsInfo().GetNewHostList().GetList()[0].GetSubstitute()
|
||||
|
||||
//提交登录日志
|
||||
db.SetLoginLog("ManualAuth", currentWXAccount, fmt.Sprintf("重定向登录 ShortHost :%s,LongHost:%s", currentUserInfo.ShortHost, currentUserInfo.LongHost), retCode)
|
||||
|
||||
// 关闭重新启动,再次发送登陆请求
|
||||
currentWXConn.Stop()
|
||||
time.Sleep(2 * time.Second)
|
||||
_ = currentWXConn.Start()
|
||||
qrcodeInfo := currentCache.GetQrcodeInfo()
|
||||
if qrcodeInfo.QrCodePassword == "" {
|
||||
return currentInvoker.SendManualAuthByDeviceIdRequest()
|
||||
} else {
|
||||
return currentInvoker.SendManualAuthRequest(qrcodeInfo.QrCodePassword, qrcodeInfo.QrCodeWxId)
|
||||
}
|
||||
case baseinfo.MMOk:
|
||||
//取基本信息
|
||||
accountInfo := manualResponse.GetAccountInfo()
|
||||
currentUserInfo.SetWxId(accountInfo.GetWxid())
|
||||
currentUserInfo.NickName = accountInfo.GetNickName()
|
||||
// 协商密钥
|
||||
currentUserInfo.ConsultSessionKey(manualResponse.GetAuthParam().GetEcdhKey().GetKey().GetBuffer(), manualResponse.AuthParam.SessionKey.Key)
|
||||
// AutoAuthKey
|
||||
currentUserInfo.SetAutoKey(manualResponse.AuthParam.AutoAuthKey.Buffer)
|
||||
// 随机一个字符红包AesKey
|
||||
currentUserInfo.GenHBKey()
|
||||
|
||||
// 如果数据库有存储这个微信号的信息
|
||||
if len(currentUserInfo.FavSyncKey) <= 0 {
|
||||
// 刷新收藏同步Key
|
||||
oldUserInfo := db.GetUserInfoByWXID(currentUserInfo.WxId)
|
||||
if oldUserInfo != nil {
|
||||
currentUserInfo.FavSyncKey = oldUserInfo.FavSyncKey
|
||||
}
|
||||
}
|
||||
// 开始发送心跳包
|
||||
currentWXConn.SendHeartBeatWaitingSeconds(10)
|
||||
// 设置登陆状态,发送提示
|
||||
currentWXAccount.SetLoginState(baseinfo.MMLoginStateOnLine)
|
||||
go func() {
|
||||
// 如果开了切号, 不管登录什么, 数据库里面都是iPad的设备信息
|
||||
db.UpdateLoginStatus(currentUserInfo.GetUserName(), int32(currentWXAccount.GetLoginState()), "登录成功!")
|
||||
// 获取账号的wxProfile
|
||||
currentInvoker.SendGetProfileRequest()
|
||||
// 获取联系人标签列表
|
||||
currentInvoker.SendGetContactLabelListRequest(false)
|
||||
// 获取CDNDns信息
|
||||
currentInvoker.SendGetCDNDnsRequest()
|
||||
// 开始发送二次登录包
|
||||
currentWXConn.SendAutoAuthWaitingMinutes(60)
|
||||
// 初始化通讯录
|
||||
// contactSeq := currentCache.GetContactSeq()
|
||||
// currentInvoker.SendInitContactRequest(contactSeq)
|
||||
currentCache.SetInitContactFinished(true)
|
||||
// 同步消息
|
||||
currentWXSyncMgr.SendNewSyncRequest()
|
||||
// 同步收藏
|
||||
// currentWXSyncMgr.SendFavSyncRequest()
|
||||
// 打印当前链接状态
|
||||
currentWXConn.GetWXServer().GetWXConnectMgr().ShowConnectInfo()
|
||||
//currentWXFileHelperMgr.AddNewTipMsg("上线成功!")
|
||||
//currentWXFileHelperMgr.AddNewTipMsg("系统正在初始化...")
|
||||
//redis 发布消息 发布登录状态
|
||||
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
|
||||
//Mysql 提交登录日志
|
||||
currentUserInfo.UpdateLastLoginTime() // 更新上次手动登录时间
|
||||
// 手动登录成功: 扫码登录、62登录、16登录等等
|
||||
db.SetLoginLog("ManualAuth", currentWXAccount, "登录成功!", retCode)
|
||||
fmt.Println("currentUserInfo扫码登录响应路由", currentUserInfo.DeviceInfo)
|
||||
db.SaveUserInfo(currentUserInfo)
|
||||
/*time.Sleep(time.Second * 10)
|
||||
currentWXConn.Stop()*/
|
||||
}()
|
||||
default:
|
||||
// 登陆失败
|
||||
errMsg := manualResponse.GetBaseResponse().GetErrMsg().GetStr()
|
||||
baseutils.PrintLog(errMsg)
|
||||
|
||||
// 将登录失败的错误信息保存到状态缓存中,这样前端就能获取到验证码URL等错误信息
|
||||
db.AddCheckStatusCache(currentUserInfo.UUID, &baseinfo.CheckLoginQrCodeResult{
|
||||
LoginQRCodeNotify: nil,
|
||||
Ret: retCode,
|
||||
Msg: "登录失败:" + errMsg,
|
||||
})
|
||||
|
||||
//Mysql 提交登录日志
|
||||
//db.SetLoginLog("ManualAuth", currentWXAccount, errMsg, retCode)
|
||||
//Mysql 保存用户信息
|
||||
//db.SaveUserInfo(currentUserInfo)
|
||||
//Mysql 保存登录状态
|
||||
//db.UpdateLoginStatus(currentUserInfo.GetUserName(), retCode, errMsg)
|
||||
currentWXConn.Stop()
|
||||
|
||||
//redis 发布消息 发布登录状态
|
||||
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
|
||||
fmt.Println("登录失败:" + errMsg)
|
||||
return errors.New("login failed:" + errMsg)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/clientsdk/baseutils"
|
||||
"xiawan/wx/db"
|
||||
"xiawan/wx/db/table"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"github.com/lunny/log"
|
||||
)
|
||||
|
||||
// WXNewInitRouter 获取二维码响应路由
|
||||
type WXNewInitRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXNewInitRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentWXCache := currentWXConn.GetWXCache()
|
||||
// currentSyncMgr := currentWXConn.GetWXSyncMgr()
|
||||
|
||||
// 同步响应
|
||||
var initResp wechat.NewInitResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &initResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 跟新同步Key
|
||||
syncKey := initResp.GetCurrentSyncKey().GetBuffer()
|
||||
syncKeyMgr := currentUserInfo.SyncKeyMgr()
|
||||
syncKeyMgr.SetMaxKey(initResp.GetMaxSyncKey())
|
||||
syncKeyMgr.SetMaxKey(initResp.GetCurrentSyncKey())
|
||||
|
||||
//保存SyncKey
|
||||
if len(currentUserInfo.SyncKey) <= 0 || !bytes.Equal(currentUserInfo.SyncKey, syncKey) {
|
||||
currentUserInfo.SyncKey = syncKey
|
||||
db.UpdateUserInfo(currentUserInfo)
|
||||
}
|
||||
|
||||
if initResp.GetContinueFlag() <= 0 {
|
||||
if !currentWXCache.IsInitNewSyncFinished() {
|
||||
// 禁用历史消息推送,不设置初始化完成标志
|
||||
currentWXCache.SetInitNewSyncFinished(true)
|
||||
}
|
||||
}
|
||||
|
||||
// 如果没有同步到数据则返回
|
||||
cmdList := initResp.GetCmdList()
|
||||
syncCount := initResp.GetCmdCount()
|
||||
//log.Info(initResp.GetContinueFlag())
|
||||
|
||||
//log.Info(initResp.GetContinueFlag(), syncCount)
|
||||
//redis 发布结构体
|
||||
messageResp := new(table.SyncMessageResponse)
|
||||
// 遍历同步的信息和群
|
||||
itemList := cmdList
|
||||
for index := uint32(0); index < syncCount; index++ {
|
||||
item := itemList[index]
|
||||
itemID := item.GetCmdId()
|
||||
// 同步到消息
|
||||
if itemID == baseinfo.CmdIDAddMsg {
|
||||
print(currentWXCache.IsInitNewSyncFinished(), 111)
|
||||
if !currentWXCache.IsInitNewSyncFinished() {
|
||||
// fmt.Println("跳过初始化历史消息 - IsInitNewSyncFinished=false")
|
||||
continue
|
||||
}
|
||||
// fmt.Println("处理初始化消息 - IsInitNewSyncFinished=true")
|
||||
|
||||
addMsg := &wechat.AddMsg{}
|
||||
err := proto.Unmarshal(item.CmdBuf.Data, addMsg)
|
||||
if err != nil {
|
||||
baseutils.PrintLog(err.Error())
|
||||
continue
|
||||
}
|
||||
go dealAddMsgRun(currentWXConn, addMsg, "init")
|
||||
}
|
||||
// 同步到联系人
|
||||
if itemID == baseinfo.CmdIDModContact {
|
||||
contact := new(wechat.ModContact)
|
||||
err := proto.Unmarshal(item.GetCmdBuf().GetData(), contact)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
log.Info("dealModContact")
|
||||
// dealModContact(currentWXConn, contact)
|
||||
}
|
||||
|
||||
// 删除联系人
|
||||
if itemID == baseinfo.CmdIDDelContact {
|
||||
delContact := &wechat.DelContact{}
|
||||
err := proto.Unmarshal(item.CmdBuf.Data, delContact)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
// go dealDelContact(currentWXConn, delContact.GetUserName().GetStr())
|
||||
}
|
||||
messageResp.SetMessage(item.GetCmdBuf().GetData(), int32(itemID))
|
||||
}
|
||||
//发布同步信息消息
|
||||
_ = db.PublishSyncMsgWxMessage(currentWXAccount, *messageResp)
|
||||
|
||||
// 如果数量超过10条则继续同步
|
||||
if !currentWXCache.IsInitNewSyncFinished() {
|
||||
// currentSyncMgr.SendSyncInitRequest()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,55 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/clientsdk/baseutils"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXOpenHBRouter 接收红包响应处理器
|
||||
type WXOpenHBRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXOpenHBRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXOpenHBRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentTaskMgr := currentWXConn.GetWXTaskMgr()
|
||||
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
|
||||
currentGrapHBMgr := taskMgr.GetGrabHBTask()
|
||||
|
||||
// 红包响应
|
||||
var hongbaoResp wechat.HongBaoRes
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &hongbaoResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
defer currentGrapHBMgr.GrapNext()
|
||||
// 如果 返回错误码
|
||||
if hongbaoResp.GetErrorType() != 0 {
|
||||
baseutils.PrintLog("WXReceiveHBRouter err: " + hongbaoResp.GetErrorMsg())
|
||||
return nil
|
||||
}
|
||||
|
||||
// 解析
|
||||
retHongBaoOpenResp := &baseinfo.HongBaoOpenResp{}
|
||||
err = json.Unmarshal(hongbaoResp.GetRetText().GetBuffer(), retHongBaoOpenResp)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 抢红包成功 可以增加一条记录
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/db"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXPushQrCodeLoginRouter 二维码二次登录
|
||||
type WXPushQrCodeLoginRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXPushQrCodeLoginRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXPushQrCodeLoginRouter Handle")
|
||||
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
|
||||
// 解析获取二维码响应包
|
||||
var getQrcodeResp wechat.PushLoginURLResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &getQrcodeResp)
|
||||
if err != nil {
|
||||
currentWXConn.Stop()
|
||||
return err
|
||||
}
|
||||
|
||||
//第一次push 成功后没有点击确认 第二次push 会报 -2017 需要重新扫码登录
|
||||
if getQrcodeResp.GetBaseResponse().GetRet() == -2017 {
|
||||
// 更改登录状态为未登录状态
|
||||
currentWXAccount.SetLoginState(baseinfo.MMLoginStateNoLogin)
|
||||
// Mysql 更新状态
|
||||
db.UpdateLoginStatus(currentUserInfo.GetUserName(), int32(baseinfo.MMLoginQrcodeStateNone), "需要重新登录,pushLoginResp.RetCode -2017")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 如果获取失败
|
||||
if getQrcodeResp.GetBaseResponse().GetRet() != 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/clientsdk/baseutils"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXReceiveHBRouter 接收红包响应处理器
|
||||
type WXReceiveHBRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXReceiveHBRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXReceiveHBRouter Handle")
|
||||
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentTaskMgr := currentWXConn.GetWXTaskMgr()
|
||||
currentReqInvoker := currentWXConn.GetWXReqInvoker()
|
||||
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
|
||||
currentGrabHBMgr := taskMgr.GetGrabHBTask()
|
||||
|
||||
// 心跳包响应
|
||||
var hongbaoResp wechat.HongBaoRes
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &hongbaoResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 如果 返回错误码
|
||||
if hongbaoResp.GetErrorType() != 0 {
|
||||
baseutils.PrintLog("WXReceiveHBRouter err: " + hongbaoResp.GetErrorMsg())
|
||||
// 抢下一个红包
|
||||
currentGrabHBMgr.GrapNext()
|
||||
return nil
|
||||
}
|
||||
|
||||
// 解析
|
||||
retHongBaoReceiveResp := &baseinfo.HongBaoReceiverResp{}
|
||||
err = json.Unmarshal(hongbaoResp.GetRetText().GetBuffer(), retHongBaoReceiveResp)
|
||||
baseutils.PrintLog("WXReceiveHBRouter retHongBaoReceiveResp: " + retHongBaoReceiveResp.TimingIdentifier)
|
||||
if err != nil {
|
||||
// 抢下一个红包
|
||||
currentGrabHBMgr.GrapNext()
|
||||
return err
|
||||
}
|
||||
|
||||
// 如果都没问题,就打开红包
|
||||
currentHBItem := currentGrabHBMgr.GetCurrentHBItem()
|
||||
err = currentReqInvoker.SendOpenWxHBRequest(currentHBItem, retHongBaoReceiveResp.TimingIdentifier)
|
||||
if err != nil {
|
||||
// 抢下一个红包
|
||||
currentGrabHBMgr.GrapNext()
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXSnsCommentRouter 发送朋友圈响应路由
|
||||
type WXSnsCommentRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXSnsCommentRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXSnsCommentRouter Handle")
|
||||
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
|
||||
// 解析发送朋友圈响应包
|
||||
var snsCommentResp wechat.SnsCommentResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &snsCommentResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXSnsPostRouter 发送朋友圈响应路由
|
||||
type WXSnsPostRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXSnsPostRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
|
||||
// 解析发送朋友圈响应包
|
||||
var snsPostResp wechat.SnsPostResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &snsPostResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXSnsSyncRouter 同步朋友圈
|
||||
type WXSnsSyncRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (ssr *WXSnsSyncRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXSnsSyncRouter Handle")
|
||||
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
//currentTaskMgr := currentWXConn.GetWXTaskMgr()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
//taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
|
||||
//currentSnsTransTask := taskMgr.GetSnsTransTask()
|
||||
currentReqInvoker := currentWXConn.GetWXReqInvoker()
|
||||
// 解析 同步朋友圈响应包
|
||||
var snsSyncResp wechat.SnsSyncResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &snsSyncResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 如果请求失败
|
||||
retCode := snsSyncResp.GetBaseResponse().GetRet()
|
||||
errMsg := snsSyncResp.GetBaseResponse().GetErrMsg().GetStr()
|
||||
if retCode != baseinfo.MMOk {
|
||||
return errors.New("WXSnsSyncRouter err:" + strconv.Itoa(int(retCode)) + " msg = " + errMsg)
|
||||
}
|
||||
|
||||
// 跟新key
|
||||
currentUserInfo.SnsSyncKey = snsSyncResp.GetKeyBuf().GetBuffer()
|
||||
// 遍历同步到的朋友圈
|
||||
tmpCmdList := snsSyncResp.GetCmdList()
|
||||
tmpCount := tmpCmdList.GetCount()
|
||||
if tmpCount > 0 {
|
||||
_, _ = currentReqInvoker.SendSnsSyncRequest(true)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
)
|
||||
|
||||
// WXSnsTimeLineRouter 心跳包响应路由
|
||||
type WXSnsTimeLineRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (oplog *WXSnsTimeLineRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
defer wxcore.TryE("WXSnsTimeLineRouter Handle")
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
currentTaskMgr := currentWXConn.GetWXTaskMgr()
|
||||
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
|
||||
snsTask := taskMgr.GetSnsTask()
|
||||
|
||||
// 解析退出登陆响应包
|
||||
var timeLineResp wechat.SnsTimeLineResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &timeLineResp)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
currentTime := snsTask.GetCurrentCreateTime()
|
||||
tmpObjList := timeLineResp.GetObjectList()
|
||||
tmpCount := len(tmpObjList)
|
||||
// 判断是否有初始化
|
||||
if currentTime == 0 {
|
||||
snsTask.SetCurrentCreateTime(1)
|
||||
if tmpCount > 0 {
|
||||
snsTask.SetCurrentCreateTime(tmpObjList[0].GetCreateTime())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 自动添加评论
|
||||
for index := 0; index < tmpCount; index++ {
|
||||
tmpSnsObj := tmpObjList[index]
|
||||
if tmpSnsObj.GetCreateTime() <= currentTime {
|
||||
break
|
||||
}
|
||||
if snsTask.IsAutoThumbUP() {
|
||||
snsTask.AddCommentItemObj(tmpSnsObj)
|
||||
}
|
||||
if snsTask.IsAutoComment() {
|
||||
snsTask.AddCommentItemObjcomment(tmpSnsObj)
|
||||
}
|
||||
}
|
||||
|
||||
// 设置最新的朋友圈创建时间
|
||||
if tmpCount > 0 {
|
||||
snsTask.SetCurrentCreateTime(tmpObjList[0].GetCreateTime())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package wxrouter
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
"xiawan/wx/srv/wxcore"
|
||||
"xiawan/wx/srv/wxface"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
)
|
||||
|
||||
// WXSnsUserPageRouter 获取好友朋友圈路由
|
||||
type WXSnsUserPageRouter struct {
|
||||
wxcore.WXBaseRouter
|
||||
}
|
||||
|
||||
// Handle 处理conn业务的方法
|
||||
func (hbr *WXSnsUserPageRouter) Handle(wxResp wxface.IWXResponse) error {
|
||||
currentWXConn := wxResp.GetWXConncet()
|
||||
currentTaskMgr := currentWXConn.GetWXTaskMgr()
|
||||
currentWXAccount := currentWXConn.GetWXAccount()
|
||||
currentUserInfo := currentWXAccount.GetUserInfo()
|
||||
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
|
||||
currentSnsTransTask := taskMgr.GetSnsTransTask()
|
||||
|
||||
// 解析 获取好友朋友圈响应
|
||||
var userPageResponse wechat.SnsUserPageResponse
|
||||
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &userPageResponse)
|
||||
if err != nil {
|
||||
// 请求出问题了,判断是否掉线,并重连
|
||||
time.Sleep(1 * time.Second)
|
||||
go currentWXConn.CheckOnLineStatusLogin()
|
||||
return err
|
||||
}
|
||||
|
||||
// 关联
|
||||
tmpRequest := &wechat.SnsUserPageRequest{}
|
||||
proto.Unmarshal(wxResp.GetPackHeader().ReqData, tmpRequest)
|
||||
transItem := currentSnsTransTask.GetTransFriendItem(tmpRequest.GetUsername())
|
||||
if transItem == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 初始化
|
||||
if !transItem.IsInited {
|
||||
// 初始化ID
|
||||
transItem.FirstPageMd5 = userPageResponse.GetFirstPageMd5()
|
||||
objectCount := userPageResponse.GetObjectCount()
|
||||
if objectCount > 0 {
|
||||
objectList := userPageResponse.GetObjectList()
|
||||
transItem.CreateTime = objectList[0].GetCreateTime()
|
||||
}
|
||||
transItem.IsInited = true
|
||||
return nil
|
||||
}
|
||||
|
||||
// 转发新的朋友圈
|
||||
objectCount := userPageResponse.GetObjectCount()
|
||||
objectList := userPageResponse.GetObjectList()
|
||||
for index := uint32(0); index < objectCount; index++ {
|
||||
tmpObject := objectList[index]
|
||||
if tmpObject.GetCreateTime() > transItem.CreateTime {
|
||||
// 转发
|
||||
currentSnsTransTask.AddSyncItem(tmpObject)
|
||||
continue
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
// 跟新设置
|
||||
if objectCount > 0 {
|
||||
transItem.FirstPageMd5 = userPageResponse.GetFirstPageMd5()
|
||||
transItem.CreateTime = objectList[0].GetCreateTime()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user