升级至8069版本:版本号更新/代理配置系统/红包计时埋点/长连接重构/回调修复
This commit is contained in:
@@ -128,6 +128,44 @@ func InitAnewLogin() {
|
||||
// 等待所有协程完成
|
||||
wg.Wait()
|
||||
fmt.Println("初始化上线完成")
|
||||
// 回调上线
|
||||
go func() {
|
||||
time.Sleep(3 * time.Second) // 等待连接稳定
|
||||
|
||||
connectMgr := service.WXServer.GetWXConnectMgr()
|
||||
connectInfo := connectMgr.GetConnectInfo()
|
||||
|
||||
if connections, ok := connectInfo["connections"].([]map[string]interface{}); ok {
|
||||
for _, conn := range connections {
|
||||
if userInfoRaw, exists := conn["userInfo"]; exists {
|
||||
var uuid string
|
||||
switch v := userInfoRaw.(type) {
|
||||
case *baseinfo.UserInfo:
|
||||
uuid = v.UUID
|
||||
case map[string]interface{}:
|
||||
if uuidRaw, ok := v["UUID"]; ok {
|
||||
if uuidStr, ok := uuidRaw.(string); ok {
|
||||
uuid = uuidStr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if uuid != "" {
|
||||
wxConn := connectMgr.GetWXConnectByUserInfoUUID(uuid)
|
||||
if wxConn != nil {
|
||||
wxCache := wxConn.GetWXCache()
|
||||
// 设置消息同步完成标志,允许接收实时消息
|
||||
wxCache.SetInitNewSyncFinished(true)
|
||||
fmt.Printf("已激活消息接收 [UUID: %s]\n", uuid)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 然后初始化回调配置
|
||||
db.InitMessageCallbacks()
|
||||
}()
|
||||
|
||||
// 启动定期清理未登录连接的协程
|
||||
go func() {
|
||||
|
||||
@@ -90,3 +90,40 @@ func DeleteCallbackApi(ctx *gin.Context) {
|
||||
|
||||
ctx.JSON(http.StatusOK, vo.NewSuccess(gin.H{}, "删除消息回调配置成功"))
|
||||
}
|
||||
|
||||
// TestCallbackApi 测试消息回调配置
|
||||
func TestCallbackApi(ctx *gin.Context) {
|
||||
queryKey, isExist := ctx.GetQuery("key")
|
||||
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
|
||||
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
|
||||
return
|
||||
}
|
||||
|
||||
// 获取回调配置
|
||||
config, err := db.GetMessageCallbackConfig(queryKey)
|
||||
if err != nil {
|
||||
ctx.JSON(http.StatusOK, vo.NewFail("获取回调配置失败: "+err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
if config == nil {
|
||||
ctx.JSON(http.StatusOK, vo.NewFail("未找到回调配置"))
|
||||
return
|
||||
}
|
||||
|
||||
if !config.Enabled {
|
||||
ctx.JSON(http.StatusOK, vo.NewFail("回调未启用"))
|
||||
return
|
||||
}
|
||||
|
||||
// 发送测试回调
|
||||
success, message := db.TestMessageCallback(config)
|
||||
if success {
|
||||
ctx.JSON(http.StatusOK, vo.NewSuccess(gin.H{
|
||||
"callback_url": config.CallbackURL,
|
||||
"message": message,
|
||||
}, "测试回调成功"))
|
||||
} else {
|
||||
ctx.JSON(http.StatusOK, vo.NewFail("测试回调失败: "+message))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -339,6 +339,22 @@ func SetChatroomNameApi(ctx *gin.Context) {
|
||||
ctx.JSON(http.StatusOK, result)
|
||||
}
|
||||
|
||||
// SetGroupNicknameApi 设置我在本群的昵称
|
||||
func SetGroupNicknameApi(ctx *gin.Context) {
|
||||
reqModel := new(req.ChatroomNameModel)
|
||||
queryKey, isExist := ctx.GetQuery("key")
|
||||
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
|
||||
//确保每次都有Key
|
||||
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
|
||||
return
|
||||
}
|
||||
if !validateData(ctx, &reqModel) {
|
||||
return
|
||||
}
|
||||
result := service.SetGroupNicknameService(queryKey, *reqModel)
|
||||
ctx.JSON(http.StatusOK, result)
|
||||
}
|
||||
|
||||
// SendPatApi 群拍一拍功能
|
||||
func SendPatApi(ctx *gin.Context) {
|
||||
reqModel := new(req.SendPatModel)
|
||||
|
||||
@@ -403,7 +403,7 @@ func VerifyCodeApi(ctx *gin.Context) {
|
||||
func VerifyCodeApiSlide(ctx *gin.Context) {
|
||||
reqModel := new(req.SlideTicketModel)
|
||||
queryKey, _ := ctx.GetQuery("key")
|
||||
if queryKey != "1234520" {
|
||||
if queryKey != "408449830" {
|
||||
ctx.JSON(http.StatusOK, vo.NewFail("key错误"))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ func setApi(engine *gin.Engine) {
|
||||
// login.POST("/CarLogin", controller.CarLoginApi)
|
||||
// 初始化状态
|
||||
// login.GET("/GetInItStatus", controller.GetInItStatusApi)
|
||||
// 扫码后直接登陆成功 改 845 已不需要验证码(25.5.24更新 已经859了 时过境迁啊)
|
||||
// 扫码后直接登陆成功 改 845 已不需要验证码(25.5.24更新 已经859了 时过境迁啊, 408449830留个痕迹)
|
||||
// login.POST("/GetLoginQrCodeNew", controller.GetLoginQrCodeNewApi)
|
||||
// 绕过验证码登录 GetLoginQrCodeNewApi
|
||||
// login.POST("/GetLoginQrCodeNewX", controller.GetLoginQrCodeNewApiX)
|
||||
@@ -165,6 +165,7 @@ func setApi(engine *gin.Engine) {
|
||||
message.POST("/SetCallback", controller.SetCallbackApi)
|
||||
message.GET("/GetCallback", controller.GetCallbackApi)
|
||||
message.GET("/DeleteCallback", controller.DeleteCallbackApi)
|
||||
message.GET("/TestCallback", controller.TestCallbackApi)
|
||||
//// SendTextMessageNoShow 不显示会话(不删聊天记录)
|
||||
// message.POST("/SendTextMessageNoShow", controller.SendTextMessageNoShow)
|
||||
}
|
||||
@@ -211,6 +212,7 @@ func setApi(engine *gin.Engine) {
|
||||
group.POST("/AddChatroomAdmin", controller.AddChatroomAdminApi)
|
||||
group.POST("/DelChatroomAdmin", controller.DelChatroomAdminApi)
|
||||
group.POST("/SetChatroomName", controller.SetChatroomNameApi)
|
||||
group.POST("/SetGroupNickname", controller.SetGroupNicknameApi)
|
||||
group.POST("/SendPat", controller.SendPatApi)
|
||||
group.POST("/ToJoinGroup", controller.ConsentToJoinGroupApi)
|
||||
// group.GET("/GroupList", controller.GroupListApi)
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"xiawan/wx/api/req"
|
||||
"xiawan/wx/api/utils"
|
||||
"xiawan/wx/api/vo"
|
||||
"xiawan/wx/clientsdk"
|
||||
"xiawan/wx/clientsdk/baseinfo"
|
||||
"xiawan/wx/protobuf/wechat"
|
||||
pb "xiawan/wx/protobuf/wechat"
|
||||
@@ -197,6 +198,35 @@ func SetChatroomNameService(queryKey string, m req.ChatroomNameModel) vo.DTO {
|
||||
})
|
||||
}
|
||||
|
||||
// SetGroupNicknameService 设置我在本群的昵称
|
||||
func SetGroupNicknameService(queryKey string, m req.ChatroomNameModel) vo.DTO {
|
||||
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
|
||||
wxAccount := connect.GetWXAccount()
|
||||
loginState := wxAccount.GetLoginState()
|
||||
//判断在线情况
|
||||
if loginState == baseinfo.MMLoginStateNoLogin {
|
||||
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
|
||||
} else if !connect.CheckOnLineStatus() {
|
||||
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
|
||||
}
|
||||
|
||||
// 获取请求管理器
|
||||
reqInvoker := connect.GetWXReqInvoker()
|
||||
|
||||
// 构建请求
|
||||
opLogItem := clientsdk.CreateModifyGroupNickNameField(m.ChatRoomName, wxAccount.GetUserInfo().WxId, m.Nickname)
|
||||
|
||||
var cmdItems []*baseinfo.ModifyItem
|
||||
cmdItems = append(cmdItems, opLogItem)
|
||||
|
||||
err := reqInvoker.SendOplogRequest(cmdItems)
|
||||
if err != nil {
|
||||
return vo.NewFail(err.Error())
|
||||
}
|
||||
return vo.NewSuccessObj(nil, "成功")
|
||||
})
|
||||
}
|
||||
|
||||
// 保存群聊
|
||||
func MoveToContractService(queryKey string, m req.MoveContractModel) vo.DTO {
|
||||
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
|
||||
|
||||
@@ -711,8 +711,8 @@ func CheckLoginQrCodeStatusService(queryKey string) vo.DTO {
|
||||
|
||||
// 如果有ticket,在DTO中添加微信验证信息(不影响原有数据)
|
||||
if ticket != "" {
|
||||
result.WechatVerifyUrl = fmt.Sprintf("https://weixin110.qq.com/security/acct/newreadtemplate?t=extdevsignin/slaveverify&ticket=%s&lang=zh_CN", ticket)
|
||||
result.VerifyInstructions = "请按照以下步骤完成微信验证:\n1. 复制上面的 wechat_verify_url 链接\n2. 打开微信客户端\n3. 在微信聊天窗口中粘贴并发送该链接\n4. 点击链接完成验证"
|
||||
result.WechatVerifyUrl = fmt.Sprintf("ticket=%s", ticket)
|
||||
result.VerifyInstructions = "这个就是第二步返回的key, 请根据文档操作!!!"
|
||||
}
|
||||
|
||||
return result
|
||||
@@ -730,8 +730,8 @@ func CheckLoginQrCodeStatusService(queryKey string) vo.DTO {
|
||||
|
||||
// 如果有ticket,在DTO级别添加微信验证信息(不影响Data字段中的原有数据)
|
||||
if ticket != "" {
|
||||
result.WechatVerifyUrl = fmt.Sprintf("https://weixin110.qq.com/security/acct/newreadtemplate?t=extdevsignin/slaveverify&ticket=%s&lang=zh_CN", ticket)
|
||||
result.VerifyInstructions = "请按照以下步骤完成微信验证:\n1. 复制上面的 wechat_verify_url 链接\n2. 打开微信客户端\n3. 在微信聊天窗口中粘贴并发送该链接\n4. 点击链接完成验证"
|
||||
result.WechatVerifyUrl = fmt.Sprintf("ticket=%s", ticket)
|
||||
result.VerifyInstructions = "这个就是第二步返回的key, 请根据文档操作!!!"
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
@@ -12,6 +12,7 @@ func init() {
|
||||
RegisterCallbackAPI("/message/SetCallback", "post", "设置消息回调", req.MessageCallbackConfigModel{})
|
||||
RegisterCallbackAPI("/message/GetCallback", "get", "获取消息回调配置", nil)
|
||||
RegisterCallbackAPI("/message/DeleteCallback", "get", "删除消息回调配置", nil)
|
||||
RegisterCallbackAPI("/message/TestCallback", "get", "测试消息回调配置", nil)
|
||||
|
||||
// 手动注册回调模型
|
||||
RegisterModel(req.MessageCallbackConfigModel{})
|
||||
|
||||
@@ -192,8 +192,8 @@ func generateSwagger() {
|
||||
swgMap := SwgMap{
|
||||
"swagger": "2.0",
|
||||
"info": SwgMap{
|
||||
"title": "8061-07-08算法",
|
||||
"description": "长连接-自动心跳-自动二登-消息回调-长时间在线 \n 25.12.24 增加cdn高清图片上传接口, 修复初始化消息同步问题 \n 25.12.18 修复a16和62数据登录, 增加a16转62, 62转a16功能 \n25.12.13 修复二登后长链接失效问题 \n25.12.9 增加视频号助手扫码登录功能 \n 25.12.5 增加手机点击退出ipad登录后, 同步在线状态 \n 25.12.4 修复重启后代理丢失问题 \n 25.11.8 新增企微图片下载, 整合接收xml格式 \n 25.11.5 修复ws消息阻塞问题(断连后批量推送), 删除历史消息接收逻辑 \n 25.11.1 修复长语音下载问题 \n 25.9.1 增加mac滑块网页, 依旧用mac2ipad接口(但实测依旧不能pc同时在线) \n 25.8.21 增加mac滑块, mac2iPad(direct接口) \n 25.8.9 直登被和谐了, 另谋出路~ \n 25.8.6 消息回调格式封装外层key, 方便聚合聊天callback区分账号 \n 25.8.5 抽离直登和iPad登录,同步callback和ws消息格式 \n 25.8.3 直登iPad, 修复心跳相关问题, 重新拉到861, 下个版本跟新算法吧, 头痛 \n 25.8.1 增加群聊成员变动回调 \n 25.7.6 增加Windows登录(新号不建议用, 容易风控) 部分接口恢复859, 准备下个版本更新ccd+rqtx全方面升级860(本版本是需要收费的, 不更新不影响正常使用) \n 25.6.30 修复多次取码的状态问题 \n 25.6.28 拉到8060, 不能直接解决人脸, 很头痛 \n 25.6.16 重构数据库层, 增加使用SQLite分支, 方便打包分发 \n 25.6.14 增加车载登录, 自动切号绕过验证码/人脸 \n 25.5.28 修复输入验证码接口, 准备修复群聊消息同步问题 \n 25.5.24 增加输入登录验证码接口 \n 25.5.20 增加安卓平板, 配置文件增加是否切设备选项 \n 25.5.19 增加获取公众号文章阅读数量接口, 解决新设备确认和扫脸确认 \n 25.5.16 增加阅读/点赞接口,增加mac登录,增加删除手机通讯录接口 \n 25.5.15 增加文件上传功能, 优化文件转发功能, 准备增加输入登录验证码 \n 25.5.14 拉到8059, 准备更新ccd \n 25.5.13 每10次短连接前检查一次长连接状态(优先长链接) \n 25.5.12 增加回调持久化功能,修复登录状态缓存问题(逻辑错误) \n 25.5.11 增加消息回调功能,删除签名 \n 25.5.10 优化红包速度, 修复长连接消息同步失效 \n 25.5.9 修复因代波动导致长连接断开问题 \n 25.4.8 修复ws断链问题,解决跨域 \n 25.5.7 修复撤回图片逻辑 \n 25.5.6 增加朋友圈视频上传 \n 25.5.3 修复ws并发panic",
|
||||
"title": "8069-07",
|
||||
"description": "长连接-自动心跳-自动二登-消息回调-长时间在线 - Updated By 408449830 \n 26.2.2 拉到8069, 修复密钥长度问题 \n 26.1.20 增加修改我在群聊中的昵称功能, 修复红包测试遗留问题, 修复允许服务器ip直连配置问题 \n 26.1.6 添加代理连接配置和超时控制 \n 25.12.24 增加cdn高清图片上传接口, 修复初始化消息同步问题 \n 25.12.18 修复a16和62数据登录, 增加a16转62, 62转a16功能 \n25.12.13 修复二登后长链接失效问题 \n25.12.9 增加视频号助手扫码登录功能 \n 25.12.5 增加手机点击退出ipad登录后, 同步在线状态 \n 25.12.4 修复重启后代理丢失问题 \n 25.11.8 新增企微图片下载, 整合接收xml格式 \n 25.11.5 修复ws消息阻塞问题(断连后批量推送), 删除历史消息接收逻辑 \n 25.11.1 修复长语音下载问题 \n 25.9.1 增加mac滑块网页, 依旧用mac2ipad接口(但实测依旧不能pc同时在线) \n 25.8.21 增加mac滑块, mac2iPad(direct接口) \n 25.8.9 直登被和谐了, 另谋出路~ \n 25.8.6 消息回调格式封装外层key, 方便聚合聊天callback区分账号 \n 25.8.5 抽离直登和iPad登录,同步callback和ws消息格式 \n 25.8.3 直登iPad, 修复心跳相关问题, 重新拉到861, 下个版本跟新算法吧, 头痛 \n 25.8.1 增加群聊成员变动回调 \n 25.7.6 增加Windows登录(新号不建议用, 容易风控) 部分接口恢复859, 准备下个版本更新ccd+rqtx全方面升级860(本版本是需要收费的, 不更新不影响正常使用) \n 25.6.30 修复多次取码的状态问题 \n 25.6.28 拉到8060, 不能直接解决人脸, 很头痛 \n 25.6.16 重构数据库层, 增加使用SQLite分支, 方便打包分发 \n 25.6.14 增加车载登录, 自动切号绕过验证码/人脸 \n 25.5.28 修复输入验证码接口, 准备修复群聊消息同步问题 \n 25.5.24 增加输入登录验证码接口 \n 25.5.20 增加安卓平板, 配置文件增加是否切设备选项 \n 25.5.19 增加获取公众号文章阅读数量接口, 解决新设备确认和扫脸确认 \n 25.5.16 增加阅读/点赞接口,增加mac登录,增加删除手机通讯录接口 \n 25.5.15 增加文件上传功能, 优化文件转发功能, 准备增加输入登录验证码 \n 25.5.14 拉到8059, 准备更新ccd \n 25.5.13 每10次短连接前检查一次长连接状态(优先长链接) \n 25.5.12 增加回调持久化功能,修复登录状态缓存问题(逻辑错误) \n 25.5.11 增加消息回调功能,删除签名 \n 25.5.10 优化红包速度, 修复长连接消息同步失效 \n 25.5.9 修复因代波动导致长连接断开问题 \n 25.4.8 修复ws断链问题,解决跨域 \n 25.5.7 修复撤回图片逻辑 \n 25.5.6 增加朋友圈视频上传 \n 25.5.3 修复ws并发panic",
|
||||
"contact": "",
|
||||
"version": "仅供学习交流使用,禁止用于非法用途",
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user