first commit

This commit is contained in:
2026-02-17 13:06:23 +08:00
commit 7cbd3d061d
349 changed files with 126558 additions and 0 deletions
+34
View File
@@ -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
}
+146
View File
@@ -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()), "登录成功!")
}
+97
View File
@@ -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
}
+69
View File
@@ -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
}
+156
View File
@@ -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="):]
}
+92
View File
@@ -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
}
+39
View File
@@ -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
}
+65
View File
@@ -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
}
+42
View File
@@ -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
}
+42
View File
@@ -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
}
+51
View File
@@ -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
}
+45
View File
@@ -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
}
+49
View File
@@ -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
}
+39
View File
@@ -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
}
+148
View File
@@ -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
}
+121
View File
@@ -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
+55
View File
@@ -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
}
+48
View File
@@ -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
}
+69
View File
@@ -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
}
+34
View File
@@ -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
}
+33
View File
@@ -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
}
+57
View File
@@ -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
}
+67
View File
@@ -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
}
+77
View File
@@ -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
}