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
+241
View File
@@ -0,0 +1,241 @@
package service
import (
"errors"
"fmt"
"strings"
"time"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/db"
"xiawan/wx/srv/wxface"
"github.com/gin-gonic/gin"
"github.com/lunny/log"
)
// 检查请求参数 key 对应的 license 是否可用
func CheckKey(queryKey string) (string, error) {
errMsg := fmt.Sprintf("%s 该 key 无效! 请 检查正确性 或 联系管理员生成", queryKey)
if len(strings.TrimSpace(queryKey)) == 0 {
// 请求参数中没有携带 license 或者 license 为空
return "", errors.New(errMsg)
}
has, err := db.HasLicense(queryKey)
if has == nil || err != nil {
// MySQL 数据库没有该 license
return "", errors.New(errMsg)
}
if db.CheckExpiry(has.ExpiryDate, has.Type) {
// MySQL 数据库中的该 license 已过期
return "", fmt.Errorf("%s 该 key 已过期!", queryKey)
}
// license 可用
return queryKey, nil
}
// GenAuthKeyService 生成授权码(新设备)
func GenAuthKeyService(count, days int) vo.DTO {
if count < 1 {
count = 1
}
if days < 1 {
days = 30
}
res := db.CreateLicense(count, days)
authKeys := strings.Split(res, "\n\t")
if len(res) == 0 {
authKeys = []string{}
}
return vo.NewSuccessObj(authKeys, "AuthKey生成成功")
}
// 按类型生成(不使用不计算时间)
func GenAuthKeyService3(count int, itype int) vo.DTO {
//1日 7 周 30月 90季 180 半年 365年 30000
types := []int{1, 7, 30, 90, 180, 365, 30000}
// 判断 itype 在 types 中
isType := false
for _, t := range types {
if t == itype {
isType = true
break
}
}
log.Println("isType", isType)
log.Println("Type", itype)
log.Println("types", types)
if !isType {
return vo.NewFail("type 参数错误")
}
res := db.CreateLicense3(count, itype)
authKeys := strings.Split(res, "\n\t")
if len(res) == 0 {
authKeys = []string{}
}
return vo.NewSuccessObj(authKeys, "AuthKey生成成功")
}
// 授权码延期 西柚云
func DelayAuthKeyServiceNew(key string, m req.DelayAuthKeyModelNew) vo.DTO {
if m.KeyUse == "" || key == "" {
return vo.NewFail("keyuse 参数错误")
}
// 计算被使用key的剩余天数
keyuse_expirydata, err := db.HasLicense(m.KeyUse)
if err != nil || keyuse_expirydata == nil {
return vo.NewFail("查询失败")
}
key_use_days := keyuse_expirydata.Type
ms := req.DelayAuthKeyModel{
Key: key,
Days: key_use_days,
ExpiryDate: "",
}
db.DeleteLicense(m.KeyUse, 2)
return DelayAuthKeyService(ms)
}
// 授权码解绑 西柚云
func UnbindAuthKeyService(key string) vo.DTO {
if key == "" {
return vo.NewFail("key 参数错误")
}
ms := req.DeleteAuthKeyModel{
Key: key,
Opt: 3,
}
return checkExIdPerformNoCreateConnect(key, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
wxAccount.GetUserInfo().SetLoginState(0)
if wxAccount.GetUserInfo().GetLoginState() == 0 {
return DeleteAuthKeyService(ms)
} else {
return vo.NewFail("解绑失败")
}
})
}
// 查看配置
func GetConfigService(key string) vo.DTO {
if key == "" {
return vo.NewFail("key 参数错误")
}
query, err := db.QueryCommand(key)
if err != nil {
return vo.NewFail("操作失败!")
}
return vo.NewSuccessObj(query, "操作成功!")
}
// DelayAuthKeyService 授权码延期
func DelayAuthKeyService(m req.DelayAuthKeyModel) vo.DTO {
if m.Days < 1 {
m.Days = 30
}
if len(strings.TrimSpace(m.ExpiryDate)) > 0 {
// 获取当前的过期日期
expiryDate, err := time.Parse("2006-01-02", m.ExpiryDate)
if err != nil {
return vo.NewFail("ExpiryDate 参数解析错误")
}
now := time.Now()
if expiryDate.Before(now) {
return vo.NewFail("ExpiryDate 参数设置错误")
}
// ExpiryDate 参数可用
m.ExpiryDate = strings.TrimSpace(m.ExpiryDate)
m.Days = 0
}
expiryDateStr, err := db.DelayLicense(m)
if err != nil {
return vo.NewFail("延期失败: " + err.Error())
}
// 延期成功; 更新已建立链接的授权码的过期时间
return getExistWxConnect(m.Key, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
if connect != nil {
connect.GetWXServer().UpdateExpiryDate(m.Key, expiryDateStr)
}
return vo.NewSuccess(gin.H{
"expiryDate": expiryDateStr,
}, "延期成功")
})
}
// 更新禁用状态
func BannedAuthKeyService(m req.BannedAuthKeyModel) vo.DTO {
bannedStr := "启用:0"
if m.IsBanned != 0 {
m.IsBanned = 1
bannedStr = "禁用:1"
}
err := db.DisableLicense(m.Key, m.IsBanned)
if err != nil {
return vo.NewFail("设置失败: " + err.Error())
}
// 延期成功; 更新已建立链接的授权码的过期时间
return getExistWxConnect(m.Key, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
if connect != nil {
connect.GetWXServer().UpdateDisable(m.Key, m.IsBanned)
}
return vo.NewSuccess(gin.H{
"isBanned": bannedStr,
}, "设置成功")
})
}
// HttpSyncLicenseKeyService HTTP-激活状态
func HttpSyncLicenseKeyService() vo.DTO {
results, err := db.HttpSyncLicenseKey()
if err != nil {
return vo.NewFail("发生错误: " + err.Error())
}
return vo.NewSuccessObj(results, "")
}
// DeleteAuthKeyService 删除授权码
func DeleteAuthKeyService(m req.DeleteAuthKeyModel) vo.DTO {
err := db.DeleteLicense(m.Key, m.Opt)
if err != nil {
return vo.NewFail("删除授权码失败: " + err.Error())
}
return vo.NewSuccess(gin.H{}, "删除成功")
}
// GetLicenseKeyService 查询卡密有效期
func GetLicenseKeyService(queryKey string) vo.DTO {
has, err := db.HasLicense(queryKey)
if err != nil {
return vo.NewFail("查询失败")
}
if has == nil {
return vo.NewFail("卡密不存在")
}
return vo.NewSuccessObj(has, "查询成功")
}
// GetActiveLicenseKeysService 获取所有激活状态的卡密
func GetActiveLicenseKeysService() vo.DTO {
results, err := db.GetActiveLicenseKeys()
if err != nil {
return vo.NewFail("查询失败: " + err.Error())
}
return vo.NewSuccessObj(results, "查询成功")
}
+919
View File
@@ -0,0 +1,919 @@
package service
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"regexp"
"strconv"
"strings"
"time"
"xiawan/wx/api/req"
"xiawan/wx/api/utils"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
)
// GetA8KeyService 授权链接
func GetA8KeyService(queryKey string, m req.GetA8KeyRequestModel) 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()
resp, err := reqInvoker.GetA8KeyRequest(m.OpCode, m.Scene, m.ReqUrl, baseinfo.ThrIdGetA8Key)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// JSLoginService 小程序授权
func JsLoginService(queryKey string, m req.AppletModel) 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()
resp, err := reqInvoker.JSLoginRequest(m.AppId)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// JSOperateWxDataService 小程序云函数操作
func JSOperateWxDataService(queryKey string, m req.AppletModel) 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()
resp, err := reqInvoker.JSOperateWxDataRequest(m.AppId, m.Opt, m.Data)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
func SdkOauthAuthorizeService(queryKey string, m req.AppletModel) 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()
resp, err := reqInvoker.SdkOauthAuthorizeRequest(m.AppId, m.SdkName, m.PackageName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 二维码授权登录
func QRConnectAuthorizeService(queryKey string, m req.QRConnectAuthorizeModel) 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()
resp, err := reqInvoker.SendQRConnectAuthorize(m.QrUrl)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 二维码授权登录确认
func QRConnectAuthorizeConfirmService(queryKey string, m req.QRConnectAuthorizeModel) 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()
resp, err := reqInvoker.SendQRConnectAuthorizeConfirm(m.QrUrl)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 授权链接
func GetMpA8Service(queryKey string, m req.GetMpA8KeyModel) 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()
resp, err := reqInvoker.SendGetMpA8Request(m.Url, m.Opcode)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 授权公众号登录
func AuthMpLoginService(queryKey string, m req.GetMpA8KeyModel) 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()
m.Opcode = 2
resp, err := reqInvoker.SendGetMpA8Request(m.Url, m.Opcode)
if err != nil {
return vo.NewFail(err.Error())
}
if resp.BaseResponse.GetRet() == 0 {
if m.Scene == 0 {
v, cookie := utils.GetHTML(resp.GetFullURL(), resp.HttpHeader)
var passTicket = regexp.MustCompile(`var _pass_ticket = '([^']*)'`)
var appmsgToken = regexp.MustCompile(`var _appmsg_token = '([^']*)'`)
var qrticket = regexp.MustCompile(`var qrticket = '([^']*)'`)
data := url.Values{}
data.Add("uin", "777")
data.Add("key", "777")
data.Add("pass_ticket", passTicket.FindStringSubmatch(v)[1])
data.Add("appmsg_token", appmsgToken.FindStringSubmatch(v)[1])
data.Add("f", "json")
data.Add("param", "qrticket")
data.Add("qrticket", qrticket.FindStringSubmatch(v)[1])
rsp := utils.HttpPost("https://mp.weixin.qq.com/wap/loginauthqrcode?action=confirm", data, cookie)
return vo.NewSuccessObj(rsp, "授权登录成功")
} else if m.Scene == 1 {
v, cookie := utils.GetHTML(resp.GetFullURL(), resp.HttpHeader)
var ticket = regexp.MustCompile(`_ticket = "(.*?)",`)
var uuid = regexp.MustCompile(`_uuid = "(.*?)",`)
var passTicket = regexp.MustCompile(`_pass_ticket = "(.*?)",`)
var appmsgToken = regexp.MustCompile(`_appmsg_token = "(.*?)",`)
var msgId = regexp.MustCompile(`_msgid = "(.*?)",`)
var secondOpenId = regexp.MustCompile(`_second_openid = "(.*?)",`)
data := url.Values{}
data.Add("ticket", ticket.FindStringSubmatch(v)[1])
data.Add("uuid", uuid.FindStringSubmatch(v)[1])
data.Add("action", "check")
data.Add("uin", "777")
data.Add("key", "777")
data.Add("pass_ticket", passTicket.FindStringSubmatch(v)[1])
data.Add("appmsg_token", appmsgToken.FindStringSubmatch(v)[1])
data.Add("code", "invalid")
data.Add("type", "bind_second_admin")
data.Add("msgid", msgId.FindStringSubmatch(v)[1])
data.Add("second_openid", secondOpenId.FindStringSubmatch(v)[1])
data.Add("expire_time_type", "0")
data.Add("allow", "1")
rsp := utils.HttpPost("https://mp.weixin.qq.com/safe/safeconfirm_reply", data, cookie)
return vo.NewSuccessObj(rsp, "授权验证成功")
} else if m.Scene == 2 {
v, cookie := utils.GetHTML(resp.GetFullURL(), resp.HttpHeader)
var ticket = regexp.MustCompile(`_ticket = "(.*?)",`)
var uuid = regexp.MustCompile(`_uuid = "(.*?)",`)
var passTicket = regexp.MustCompile(`_pass_ticket = "(.*?)",`)
var appmsgToken = regexp.MustCompile(`_appmsg_token = "(.*?)",`)
var msgId = regexp.MustCompile(`_msgid = "(.*?)",`)
data := url.Values{}
data.Add("ticket", ticket.FindStringSubmatch(v)[1])
data.Add("uuid", uuid.FindStringSubmatch(v)[1])
data.Add("action", "check")
data.Add("uin", "777")
data.Add("key", "777")
data.Add("pass_ticket", passTicket.FindStringSubmatch(v)[1])
data.Add("appmsg_token", appmsgToken.FindStringSubmatch(v)[1])
data.Add("code", "invalid")
data.Add("type", "appkey")
data.Add("msgid", msgId.FindStringSubmatch(v)[1])
data.Add("allow", "1")
rsp := utils.HttpPost("https://mp.weixin.qq.com/safe/safeconfirm_reply", data, cookie)
return vo.NewSuccessObj(rsp, "授权验证成功")
} else if m.Scene == 3 {
v, cookie := utils.GetHTML(resp.GetFullURL(), resp.HttpHeader)
var passTicket = regexp.MustCompile(`pass_ticket: '(.*?)',`)
var qrcheckTicket = regexp.MustCompile(`qrcheck_ticket: '(.*?)',`)
var appmsgToken = regexp.MustCompile(`window.appmsg_token = "(.*?)";`)
data := url.Values{}
data.Add("f", "json")
data.Add("action", "scan")
data.Add("qrcheck_ticket", qrcheckTicket.FindStringSubmatch(v)[1])
data.Add("uin", "777")
data.Add("key", "777")
data.Add("pass_ticket", passTicket.FindStringSubmatch(v)[1])
data.Add("appmsg_token", appmsgToken.FindStringSubmatch(v)[1])
rsp := utils.HttpPost("https://mp.weixin.qq.com/wap/qrcheckoper", data, cookie)
return vo.NewSuccessObj(rsp, "授权验证成功")
} else if m.Scene == 4 {
v, cookie := utils.GetHTML(resp.GetFullURL(), resp.HttpHeader)
var passTicket = regexp.MustCompile(`pass_ticket: '(.*?)',`)
var appmsgToken = regexp.MustCompile(`appmsg_token: '(.*?)',`)
var qrcheckTicket = regexp.MustCompile(`qrcheck_ticket: '(.*?)',`)
data := url.Values{}
data.Add("f", "json")
data.Add("action", "confirm")
data.Add("operate_type", "1")
data.Add("qrcheck_ticket", qrcheckTicket.FindStringSubmatch(v)[1])
data.Add("uin", "777")
data.Add("key", "777")
data.Add("pass_ticket", passTicket.FindStringSubmatch(v)[1])
data.Add("appmsg_token", appmsgToken.FindStringSubmatch(v)[1])
rsp := utils.HttpPost("https://mp.weixin.qq.com/mp/wapsafeqrcode", data, cookie)
return vo.NewSuccessObj(rsp, "授权验证成功")
}
}
return vo.NewSuccessObj(resp, "失败")
})
}
// 获取公众号历史消息
func GetAppletHistoryMsg(queryKey string, m req.GetMpHistoryMsgModel) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
var Opcode = uint32(2) //
resp, err := reqInvoker.SendQWAcceptChatRoomRequest(m.Url, Opcode)
if err != nil {
return vo.NewFail(err.Error())
}
if resp.BaseResponse.GetRet() == 0 {
rsp := utils.HttpGet(resp.GetFullURL(), resp.HttpHeader)
return vo.NewSuccessObj(rsp, "成功")
}
return vo.NewSuccessObj(resp, "失败")
})
}
// GetAppMsgExtService 阅读公众号文章
func GetAppMsgExtService(queryKey string, m req.ReadParam) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
var Opcode = uint32(2)
resp, err := reqInvoker.SendGetMpA8Request(m.Url, Opcode)
if err != nil {
return vo.NewFail(err.Error())
}
if resp.BaseResponse.GetRet() != 0 {
return vo.NewFail("获取文章信息失败")
}
// 解析
urlObj, err := url.Parse(resp.GetFullURL())
if err != nil {
return vo.NewFail(fmt.Sprintf("解析URL异常:%v", err.Error()))
}
query := urlObj.Query()
if _, ok := query["pass_ticket"]; !ok {
return vo.NewFail("获取pass_ticket失败")
}
// 获取HTML页面和Cookie
_, cookie := utils.GetHTML(resp.GetFullURL(), resp.HttpHeader)
// 构建阅读请求
postUrl := "https://mp.weixin.qq.com/mp/getappmsgext?f=json&mock=&fasttmplajax=1&f=json&uin=&key=&pass_ticket=" +
query["pass_ticket"][0] + "&wxtoken=&devicetype=iOS13.3.1&clientversion=17000c2d&__biz=" +
url.QueryEscape(query["__biz"][0]) + "&appmsg_token=&x5=0&f=json&wx_header=1&pass_ticket=" + query["pass_ticket"][0]
postData := url.Values{}
postData.Add("r", "")
postData.Add("__biz", query["__biz"][0])
postData.Add("appmsg_type", "9")
postData.Add("mid", query["mid"][0])
postData.Add("sn", query["sn"][0])
postData.Add("idx", query["idx"][0])
postData.Add("scene", "126")
postData.Add("title", "")
postData.Add("ct", time.Now().String())
postData.Add("abtest_cookie", "")
postData.Add("devicetype", "iOS13.3.1")
postData.Add("version", "17000c2d")
postData.Add("is_need_ticket", "0")
postData.Add("is_need_ad", "0")
postData.Add("comment_id", "")
postData.Add("is_need_reward", "0")
postData.Add("both_ad", "0")
postData.Add("reward_uin_count", "0")
postData.Add("send_time", "")
postData.Add("msg_daily_idx", "1")
postData.Add("is_original", "0")
postData.Add("is_only_read", "1")
postData.Add("req_id", "")
postData.Add("pass_ticket", query["pass_ticket"][0])
postData.Add("is_temp_url", "0")
postData.Add("item_show_type", "0")
postData.Add("tmp_version", "1")
postData.Add("more_read_type", "0")
postData.Add("appmsg_like_type", "2")
postData.Add("related_video_sn", "")
postData.Add("vid", "")
postData.Add("is_pay_subscribe", "0")
postData.Add("pay_subscribe_uin_count", "0")
postData.Add("has_red_packet_cover", "0")
postData.Add("album_id", "")
result := utils.HttpPost(postUrl, postData, cookie)
return vo.NewSuccessObj(result, "阅读成功")
})
}
// GetAppMsgExtLikeService 点赞公众号文章
func GetAppMsgExtLikeService(queryKey string, m req.ReadParam) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
var Opcode = uint32(2)
resp, err := reqInvoker.SendGetMpA8Request(m.Url, Opcode)
if err != nil {
return vo.NewFail(err.Error())
}
if resp.BaseResponse.GetRet() != 0 {
return vo.NewFail("获取文章信息失败")
}
// 解析
urlObj, err := url.Parse(resp.GetFullURL())
if err != nil {
return vo.NewFail(fmt.Sprintf("解析URL异常:%v", err.Error()))
}
query := urlObj.Query()
if _, ok := query["pass_ticket"]; !ok {
return vo.NewFail("获取pass_ticket失败")
}
// 获取HTML页面和Cookie
bodyStr, cookie := utils.GetHTML(resp.GetFullURL(), resp.HttpHeader)
// 提取appmsg_token,用正则表达式
var appmsgToken string
reAppmsgToken := regexp.MustCompile(`var appmsg_token = ["'](.*?)["']`)
appmsgTokenMatches := reAppmsgToken.FindStringSubmatch(bodyStr)
if len(appmsgTokenMatches) > 1 {
appmsgToken = appmsgTokenMatches[1]
} else {
// 尝试另一种格式
reAppmsgToken = regexp.MustCompile(`appmsg_token="(.*?)"`)
appmsgTokenMatches = reAppmsgToken.FindStringSubmatch(bodyStr)
if len(appmsgTokenMatches) > 1 {
appmsgToken = appmsgTokenMatches[1]
}
}
// 构建阅读请求 (和阅读一样的请求,为了保证点赞成功)
postUrl := "https://mp.weixin.qq.com/mp/getappmsgext?f=json&mock=&fasttmplajax=1&f=json&uin=&key=&pass_ticket=" +
query["pass_ticket"][0] + "&wxtoken=&devicetype=iOS13.3.1&clientversion=17000c2d&__biz=" +
url.QueryEscape(query["__biz"][0]) + "&appmsg_token=&x5=0&f=json&wx_header=1&pass_ticket=" + query["pass_ticket"][0]
postData := url.Values{}
postData.Add("r", "")
postData.Add("__biz", query["__biz"][0])
postData.Add("appmsg_type", "9")
postData.Add("mid", query["mid"][0])
postData.Add("sn", query["sn"][0])
postData.Add("idx", query["idx"][0])
postData.Add("scene", "126")
postData.Add("title", "")
postData.Add("ct", time.Now().String())
postData.Add("abtest_cookie", "")
postData.Add("devicetype", "iOS13.3.1")
postData.Add("version", strconv.FormatInt(int64(baseinfo.ClientVersion), 16))
postData.Add("is_need_ticket", "0")
postData.Add("is_need_ad", "0")
postData.Add("comment_id", "")
postData.Add("is_need_reward", "0")
postData.Add("both_ad", "0")
postData.Add("reward_uin_count", "0")
postData.Add("send_time", "")
postData.Add("msg_daily_idx", "1")
postData.Add("is_original", "0")
postData.Add("is_only_read", "1")
postData.Add("req_id", "")
postData.Add("pass_ticket", query["pass_ticket"][0])
postData.Add("is_temp_url", "0")
postData.Add("item_show_type", "0")
postData.Add("tmp_version", "1")
postData.Add("more_read_type", "0")
postData.Add("appmsg_like_type", "2")
postData.Add("related_video_sn", "")
postData.Add("vid", "")
postData.Add("is_pay_subscribe", "0")
postData.Add("pay_subscribe_uin_count", "0")
postData.Add("has_red_packet_cover", "0")
postData.Add("album_id", "")
result := utils.HttpPost(postUrl, postData, cookie)
// 提取appmsgid,用正则表达式
reAppmsgid := regexp.MustCompile(`var appmsgid = ['"+][0-9]*['"+] \|\| ['"+][0-9]*['"+] \|\| ['"+][0-9]*['"+]`)
appmsgidStr := reAppmsgid.FindString(bodyStr)
reDigits := regexp.MustCompile(`[0-9]+`)
appmsgid := reDigits.FindString(appmsgidStr)
if appmsgid == "" {
return vo.NewFail("获取文章appmsgid失败")
}
// 构建点赞请求
likeUrl := "https://mp.weixin.qq.com/mp/appmsg_like?__biz=" + url.QueryEscape(query["__biz"][0]) +
"&mid=" + query["mid"][0] + "&idx=" + query["idx"][0] + "&like=1&f=json&appmsgid=" + appmsgid +
"&itemidx=&fasttmplajax=1&f=json&uin=777&key=777&pass_ticket=" + query["pass_ticket"][0] +
"&wxtoken=777&devicetype=iOS13.3.1&clientversion=" + strconv.FormatInt(int64(baseinfo.ClientVersion), 16) +
"&appmsg_token=" + appmsgToken + "&x5=0&f=json&wx_header=1"
// 创建自定义header,确保Cookie正确传递
header := make(map[string]string)
header["Cookie"] = strings.Join(cookie, "; ")
header["Content-Type"] = "application/x-www-form-urlencoded"
header["User-Agent"] = "Mozilla/5.0 (iPad; CPU OS 12_4_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.15(0x17000f31) NetType/WIFI Language/zh_CN"
header["Referer"] = resp.GetFullURL()
header["Origin"] = "https://mp.weixin.qq.com"
header["X-Requested-With"] = "XMLHttpRequest"
likeData := url.Values{}
likeData.Add("scene", "142")
likeData.Add("appmsg_like_type", "1")
likeData.Add("item_show_type", "0")
likeData.Add("client_version", strconv.FormatInt(int64(baseinfo.ClientVersion), 16))
likeData.Add("is_temp_url", "0")
likeData.Add("style", "1")
likeData.Add("exptype", "")
likeData.Add("expsessionid", "")
likeData.Add("request_id", time.Now().Format("20060102150405")+strconv.Itoa(int(time.Now().UnixNano()%1000)))
likeData.Add("device_type", "iOS13.3.1")
likeData.Add("appmsg_token", appmsgToken) // 使用从页面提取的appmsg_token
// 使用自定义的HTTP请求函数
req, err := http.NewRequest("POST", likeUrl, strings.NewReader(likeData.Encode()))
if err != nil {
return vo.NewFail(fmt.Sprintf("创建请求失败:%v", err.Error()))
}
for k, v := range header {
req.Header.Set(k, v)
}
// 添加更多调试信息
fmt.Printf("点赞请求URL: %s\n", likeUrl)
fmt.Printf("点赞请求参数: %s\n", likeData.Encode())
fmt.Printf("点赞请求Cookie: %s\n", header["Cookie"])
fmt.Printf("点赞请求appmsg_token: %s\n", appmsgToken)
client := &http.Client{}
httpResp, err := client.Do(req)
var likeResult string
if err != nil {
likeResult = fmt.Sprintf("{\"error\":\"%s\"}", err.Error())
} else {
defer httpResp.Body.Close()
respBody, _ := ioutil.ReadAll(httpResp.Body)
likeResult = string(respBody)
fmt.Printf("点赞响应: %s\n", likeResult)
}
return vo.NewSuccessObj(map[string]interface{}{
"read": result,
"like": likeResult,
}, "点赞成功")
})
}
// GetAppMsgReadCountService 获取公众号文章阅读数
func GetAppMsgReadCountService(queryKey string, m req.ReadParam) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
var Opcode = uint32(2)
resp, err := reqInvoker.SendGetMpA8Request(m.Url, Opcode)
if err != nil {
return vo.NewFail(err.Error())
}
if resp.BaseResponse.GetRet() != 0 {
return vo.NewFail("获取文章信息失败")
}
// 获取HTML页面内容
htmlContent, _ := utils.GetHTML(resp.GetFullURL(), resp.HttpHeader)
// 用正则表达式提取阅读数
readNumRegex := regexp.MustCompile(`var read_num_new = '(\d+)' \* 1;`)
readNumMatches := readNumRegex.FindStringSubmatch(htmlContent)
if len(readNumMatches) < 2 {
return vo.NewFail("未找到阅读数信息")
}
readCount := readNumMatches[1]
fullURL := resp.GetFullURL()
for _, h := range resp.HttpHeader {
if h.GetName() == "X-WECHAT-UIN" {
fullURL += "&uin=" + h.GetKey() + "&countrycode=CN"
} else if h.GetName() == "X-WECHAT-ACCTMODE" {
fullURL += "&acctmode=" + h.GetKey()
} else if h.GetName() == "X-WECHAT-KEY" {
fullURL += "&key=" + h.GetKey()
}
}
result := map[string]string{
"read_count": readCount,
"article_url": fullURL,
}
return vo.NewSuccessObj(result, "获取阅读数成功")
})
}
// ChannelsLoginService 视频号助手扫码登录
func ChannelsLoginService(queryKey string, m req.ChannelsLoginModel) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
resp1, err := reqInvoker.GetA8KeyRequest(2, 4, m.Url, baseinfo.ThrIdGetA8Key)
if err != nil {
return vo.NewFail("第一步失败: " + err.Error())
}
if resp1.BaseResponse.GetRet() != 0 {
return vo.NewFail(fmt.Sprintf("第一步失败, ret=%d, errMsg=%s", resp1.BaseResponse.GetRet(), resp1.BaseResponse.GetErrMsg().GetStr()))
}
fullURL := resp1.GetFullURL()
if fullURL == "" {
return vo.NewFail("第一步成功但未返回完整 URL")
}
parsedURL, err := url.Parse(fullURL)
if err != nil {
return vo.NewFail("解析 URL 失败: " + err.Error())
}
query := parsedURL.Query()
token := query.Get("token")
exportkey := query.Get("exportkey")
rid := fmt.Sprintf("%x-%x", time.Now().UnixNano()&0xFFFFFFFF, time.Now().UnixNano()&0xFFFFFFFF)
scanURL := fmt.Sprintf("https://channels.weixin.qq.com/cgi-bin/mmfinderassistant-bin/auth/scan-qrcode?token=%s&exportKey=%s&_rid=%s&exportkey=%s&_pageUrl=https://channels.weixin.qq.com/mobile/confirm_login.html",
url.QueryEscape(token), url.QueryEscape(exportkey), rid, url.QueryEscape(exportkey))
scanData := map[string]string{
"_rid": rid,
"exportkey": exportkey,
"_pageUrl": "https://channels.weixin.qq.com/mobile/confirm_login.html",
}
scanDataJSON, _ := json.Marshal(scanData)
scanResp := utils.HttpPostJSON(scanURL, string(scanDataJSON), nil)
// 解析 scan-qrcode 响应
var scanResult map[string]interface{}
if err := json.Unmarshal([]byte(scanResp), &scanResult); err != nil {
return vo.NewFail("解析 scan-qrcode 响应失败: " + err.Error())
}
if errCode, ok := scanResult["errCode"].(float64); !ok || errCode != 0 {
return vo.NewFail(fmt.Sprintf("scan-qrcode 失败: %v", scanResult))
}
data, ok := scanResult["data"].(map[string]interface{})
if !ok {
return vo.NewFail("scan-qrcode 响应格式错误")
}
finderList, ok := data["finderList"].([]interface{})
if !ok || len(finderList) == 0 {
return vo.NewFail("未找到 finderList")
}
var selectedFinder map[string]interface{}
if m.FinderUsername != "" && m.FinderUsername != "string" {
found := false
for _, finder := range finderList {
finderMap, ok := finder.(map[string]interface{})
if !ok {
continue
}
if username, ok := finderMap["finderUsername"].(string); ok && username == m.FinderUsername {
selectedFinder = finderMap
found = true
break
}
}
if !found {
return vo.NewFail(fmt.Sprintf("未找到指定的 finderUsername: %s", m.FinderUsername))
}
} else {
// 如果未指定或为默认值,选择第一个
firstFinder, ok := finderList[0].(map[string]interface{})
if !ok {
return vo.NewFail("finderList 格式错误")
}
selectedFinder = firstFinder
}
finderUsername, ok := selectedFinder["finderUsername"].(string)
if !ok {
return vo.NewFail("未找到 finderUsername")
}
rid2 := fmt.Sprintf("%x-%x", time.Now().UnixNano()&0xFFFFFFFF, time.Now().UnixNano()&0xFFFFFFFF)
authURL := fmt.Sprintf("https://channels.weixin.qq.com/cgi-bin/mmfinderassistant-bin/auth/finder-handle-auth?token=%s&exportKey=%s&action=0&finderUsername=%s&_rid=%s&exportkey=%s&_pageUrl=https://channels.weixin.qq.com/mobile/confirm_login.html",
url.QueryEscape(token), url.QueryEscape(exportkey), url.QueryEscape(finderUsername), rid2, url.QueryEscape(exportkey))
authData := map[string]string{
"_rid": rid2,
"exportkey": exportkey,
"_pageUrl": "https://channels.weixin.qq.com/mobile/confirm_login.html",
}
authDataJSON, _ := json.Marshal(authData)
authResp := utils.HttpPostJSON(authURL, string(authDataJSON), nil)
var authResult map[string]interface{}
if err := json.Unmarshal([]byte(authResp), &authResult); err != nil {
return vo.NewFail("解析 finder-handle-auth 响应失败: " + err.Error())
}
if errCode, ok := authResult["errCode"].(float64); !ok || errCode != 0 {
return vo.NewFail(fmt.Sprintf("finder-handle-auth 失败: %v", authResult))
}
result := map[string]interface{}{
"scan_qrcode": scanResult,
"handle_auth": authResult,
"full_url": fullURL,
"finder_username": finderUsername,
}
return vo.NewSuccessObj(result, "视频号助手登录成功")
})
}
// ShopLoginConfirmService 微信小店确认登录
func ShopLoginConfirmService(queryKey string, m req.ShopLoginConfirmModel) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
// 步骤1: 调用GetA8Key获取授权 (Scene=4)
// 这一步建立授权会话
resp1, err := reqInvoker.GetA8KeyRequest(2, 4, m.Url, baseinfo.ThrIdGetA8Key)
if err != nil {
return vo.NewFail("GetA8Key失败: " + err.Error())
}
if resp1.BaseResponse.GetRet() != 0 {
return vo.NewFail(fmt.Sprintf("GetA8Key失败, ret=%d, errMsg=%s", resp1.BaseResponse.GetRet(), resp1.BaseResponse.GetErrMsg().GetStr()))
}
// 步骤2: 调用CGI 8887模拟扫码事件上报
// 这一步模拟用户扫码行为,告诉服务器我们已经"扫码"了
_, err = reqInvoker.SendScanQrcodeEventReportRequest(resp1.GetFullURL())
if err != nil {
return vo.NewFail("扫码事件上报失败: " + err.Error())
}
// // 步骤3: 调用CGI 971获取确认信息 (包含6500+字节的token/session数据)
resp971, err := reqInvoker.SendExtDeviceLoginConfirmGetRequest(resp1.GetFullURL())
if err != nil {
return vo.NewFail("获取确认信息失败: " + err.Error())
}
if resp971.BaseResponse.GetRet() != 0 {
return vo.NewFail(fmt.Sprintf("获取确认信息失败, ret=%d, errMsg=%s", resp971.BaseResponse.GetRet(), resp971.BaseResponse.GetErrMsg().GetStr()))
}
// 步骤4: 调用CGI 972确认登录
resp, err := reqInvoker.SendExtDeviceLoginConfirmOkRequest(resp1.GetFullURL())
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
func ShopLoginConfirmGetService(queryKey string, m req.ShopLoginConfirmModel) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
reqInvoker := connect.GetWXReqInvoker()
url := strings.TrimSpace(m.Url)
resp971, err := reqInvoker.SendExtDeviceLoginConfirmGetRequest(url)
if err == nil && resp971.BaseResponse.GetRet() == 0 {
return vo.NewSuccessObj(resp971, "")
}
// resp1, err := reqInvoker.GetA8KeyRequest(2, 4, url, baseinfo.ThrIdGetA8Key)
// if err != nil {
// return vo.NewFail("GetA8Key失败: " + err.Error())
// }
// if resp1.BaseResponse.GetRet() != 0 {
// return vo.NewFail(fmt.Sprintf("GetA8Key失败, ret=%d, errMsg=%s", resp1.BaseResponse.GetRet(), resp1.BaseResponse.GetErrMsg().GetStr()))
// // }
// _, _ = reqInvoker.SendScanQrcodeEventReportRequest(resp1.GetFullURL())
// resp971, err = reqInvoker.SendExtDeviceLoginConfirmGetRequest(resp1.GetFullURL())
if err != nil {
return vo.NewFail("获取确认信息失败: " + err.Error())
}
return vo.NewSuccessObj(resp971, "")
})
}
func ShopLoginConfirmOkService(queryKey string, m req.ShopLoginConfirmModel) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
reqInvoker := connect.GetWXReqInvoker()
resp, err := reqInvoker.SendExtDeviceLoginConfirmOkRequest(m.Url)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
func ScanQrcodeEventReportService(queryKey string, m req.ShopLoginConfirmModel) 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())))
}
if m.Url == "" || m.Url == "undefined" || m.Url == "null" {
return vo.NewFail("url不能为空")
}
reqInvoker := connect.GetWXReqInvoker()
resp, err := reqInvoker.SendScanQrcodeEventReportRequest(m.Url)
if err != nil {
return vo.NewFail("扫码事件上报失败: " + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
+429
View File
@@ -0,0 +1,429 @@
package service
import (
"fmt"
"reflect"
"strings"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/clientsdk/proxynet"
"xiawan/wx/db"
"xiawan/wx/db/table"
"xiawan/wx/protobuf/wechat"
"xiawan/wx/srv"
"xiawan/wx/srv/srvconfig"
"xiawan/wx/srv/websrv"
"xiawan/wx/srv/wxcore"
"xiawan/wx/srv/wxface"
"xiawan/wx/srv/wxrouter"
"github.com/lunny/log"
)
// 基础服务功能
var WXServer wxface.IWXServer
type BusinessFunc = func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO
type USerInfoCallFunc = func(account *srv.WXAccount, invoker wxface.IWXReqInvoker, state uint32) vo.DTO
// 初始化微信响应路由
func InitWXServerRouter() {
// 开启服务器
wxServer := wxcore.NewWXServer()
// 注册微信响应路由
// wxServer.AddWXRouter(baseinfo.MMRequestTypeGetLoginQRCode, new(wxrouter.WXGetLoginQrcodeRouter)) // 获取登陆二维码响应
wxServer.AddWXRouter(baseinfo.MMRequestTypeCheckLoginQRCode, new(wxrouter.WXCheckQrcodeRouter)) // 检测二维码状态请求
wxServer.AddWXRouter(baseinfo.MMRequestTypePushQrLogin, new(wxrouter.WXPushQrCodeLoginRouter)) // 唤醒登录
wxServer.AddWXRouter(baseinfo.MMRequestTypeManualAuth, new(wxrouter.WXManualAuthRouter))
wxServer.AddWXRouter(baseinfo.MMRequestTypeHybridManualAuth, new(wxrouter.WXManualAuthRouter)) // 登录
wxServer.AddWXRouter(baseinfo.MMRequestTypeLogout, new(wxrouter.WXLogoutRouter)) // 退出登录
wxServer.AddWXRouter(baseinfo.MMRequestTypeAutoAuth, new(wxrouter.WXAutoAuthRouter)) // token登陆
wxServer.AddWXRouter(baseinfo.MMRequestTypeNewSync, new(wxrouter.WXNewSyncRouter)) // 同步消息,联系人
wxServer.AddWXRouter(baseinfo.MMRequestTypeNewInit, new(wxrouter.WXNewInitRouter)) // 首次登录初始化
wxServer.AddWXRouter(baseinfo.MMRequestTypeHeartBeat, new(wxrouter.WXHeartBeatRouter)) // 心跳包
wxServer.AddWXRouter(baseinfo.MMRequestTypeGetProfile, new(wxrouter.WXGetProfileRouter)) // 获取帐号信息
wxServer.AddWXRouter(baseinfo.MMRequestTypeGetCdnDNS, new(wxrouter.WXGetCDNDnsRouter)) // 获取CDNDns信息
wxServer.AddWXRouter(baseinfo.MMRequestTypeInitContact, new(wxrouter.WXInitContactRouter)) // 初始化联系人
wxServer.AddWXRouter(baseinfo.MMRequestTypeBatchGetContactBriefInfo, new(wxrouter.WXBatchGetContactBriefInfoReqRouter)) // 初始化联系人
// wxServer.AddWXRouter(baseinfo.MMRequestTypeGetContact, new(wxrouter.WXGetContactRouter)) // 批量获取联系人信息
wxServer.AddWXRouter(baseinfo.MMRequestTypeReceiveWxHB, new(wxrouter.WXReceiveHBRouter)) // 接收红包
wxServer.AddWXRouter(baseinfo.MMRequestTypeOpenWxHB, new(wxrouter.WXOpenHBRouter)) // 打开红包
// wxServer.AddWXRouter(baseinfo.MMRequestTypeOplog, new(wxrouter.WXOplogRouter)) // Oplog请求
// wxServer.AddWXRouter(baseinfo.MMRequestTypeNewSendMsg, new(wxrouter.WXNewSendMsgRouter)) // 发送文本消息
wxServer.AddWXRouter(baseinfo.MMRequestTypeFavSync, new(wxrouter.WXFavSyncRouter)) // 同步收藏
wxServer.AddWXRouter(baseinfo.MMRequestTypeGetFavInfo, new(wxrouter.WXGetFavInfoRouter)) // 获取收藏信息
wxServer.AddWXRouter(baseinfo.MMRequestTypeBatchGetFavItem, new(wxrouter.WXBatchGetFavItemRouter)) // 获取单条收藏(收藏转发)
wxServer.AddWXRouter(baseinfo.MMRequestTypeMMSnsPost, new(wxrouter.WXSnsPostRouter)) // 发送朋友圈
wxServer.AddWXRouter(baseinfo.MMRequestTypeMMSnsSync, new(wxrouter.WXSnsSyncRouter)) // 同步朋友圈
wxServer.AddWXRouter(baseinfo.MMRequestTypeMMSnsUserPage, new(wxrouter.WXSnsUserPageRouter)) // 朋友圈同步转发
wxServer.AddWXRouter(baseinfo.MMRequestTypeMMSnsTimeLine, new(wxrouter.WXSnsTimeLineRouter)) // 同步朋友圈
wxServer.AddWXRouter(baseinfo.MMRequestTypeMMSnsComment, new(wxrouter.WXSnsCommentRouter)) // 评论/点赞朋友圈
wxServer.AddWXRouter(baseinfo.MMRequestTypeGetContactLabelList, new(wxrouter.WXGetContactLabelListRouter)) // 获取标签列表
wxServer.AddWXRouter(baseinfo.MMRequestTypeAddContactLabel, new(wxrouter.WXAddContactLabelRouter)) // 新增标签列表
wxServer.AddWXRouter(baseinfo.MMRequestTypeGetQrCode, new(wxrouter.WXGetQrcodeRouter)) // 获取二维码
// wxServer.AddWXRouter(baseinfo.MMRequestTypeBindQueryNew, new(wxrouter.WXBindQueryNewRouter)) // 获取钱包信息
wxServer.Start()
WXServer = wxServer
}
func CreateWXConnectByQueryKey(queryKey, proxy string, wxAccount *srv.WXAccount) wxface.IWXConnect {
var proxyInfo *proxynet.WXProxyInfo
if proxy != "" {
proxyInfo = proxynet.ParseWXProxyInfo(proxy)
}
if wxAccount == nil {
wxAccount = srv.NewWXAccount(&websrv.TaskInfo{
UUID: queryKey,
}, proxyInfo, uint32(0), nil)
}
wxConnect := wxcore.NewWXConnect(WXServer, wxAccount)
return wxConnect
}
// checkExIdReturn 检测实例Id并返回实例
func checkExIdReturn(queryKey string, ClientVersion uint32) wxface.IWXConnect {
// 判断 ClientVersion == 0
if !(int(ClientVersion) > 0) {
ClientVersion = baseinfo.ClientVersion
}
//获取实例管理器
connectMgr := WXServer.GetWXConnectMgr()
//查询的queryKey为空创建一个链接实例
if queryKey == "" {
return nil
}
//查询该链接是否存在
iwxConnect := connectMgr.GetWXConnectByUserInfoUUID(queryKey)
if iwxConnect != nil {
//执行回调方法
return iwxConnect
} else {
//如果链接管理器不存在该链接查询数据库是否存在
dbUserInfo := db.GetUSerInfoByUUID(queryKey)
//数据库存在该链接数据 重新实例化一个链接对象
if dbUserInfo != nil {
if !(int(dbUserInfo.ClientVersion) > 0) {
dbUserInfo.ClientVersion = ClientVersion
}
//创建一个用户信息
wxAccount := srv.NewWXAccount(&websrv.TaskInfo{
UUID: queryKey,
}, nil, dbUserInfo.ClientVersion, dbUserInfo)
//创建一个新链接
wxConnect := wxcore.NewWXConnect(WXServer, wxAccount)
//设置用户信息
wxAccount.SetUserInfo(dbUserInfo)
return wxConnect
} else {
//创建新一个用户信息
wxAccount := srv.NewWXAccount(&websrv.TaskInfo{
UUID: queryKey,
}, nil, ClientVersion, dbUserInfo)
//创建一个新链接
wxConnect := wxcore.NewWXConnect(WXServer, wxAccount)
return wxConnect
}
}
}
// 检查实例Id是否存在 不存在创建新的链接
func checkExIdPerform(queryKey string, ClientVersion uint32, businessFunc BusinessFunc) vo.DTO {
// 判断 ClientVersion == 0
if !(int(ClientVersion) > 0) {
ClientVersion = baseinfo.ClientVersion
}
//获取实例管理器
connectMgr := WXServer.GetWXConnectMgr()
//查询的queryKey为空创建一个链接实例
if queryKey == "" {
return businessFunc(nil, true)
}
//查询该链接是否存在
iwxConnect := connectMgr.GetWXConnectByUserInfoUUID(queryKey)
if iwxConnect != nil {
//执行回调方法
return businessFunc(iwxConnect, false)
} else {
//如果链接管理器不存在该链接查询数据库是否存在
dbUserInfo := db.GetUSerInfoByUUID(queryKey)
//数据库存在该链接数据 重新实例化一个链接对象
if dbUserInfo != nil {
if !(int(dbUserInfo.ClientVersion) > 0) {
dbUserInfo.ClientVersion = ClientVersion
}
// 设置代理信息
key := fmt.Sprintf("%s%s", "wechat:Proxy:", queryKey)
exists, _ := db.Exists(key)
newModel := &req.GetLoginQrCodeModel{
Proxy: "",
Check: false,
}
if exists {
db.GETObj(key, &newModel)
}
var proxyInfo *proxynet.WXProxyInfo
if newModel.Proxy != "" {
proxyInfo = proxynet.ParseWXProxyInfo(newModel.Proxy)
} else {
proxyInfo = nil
}
//创建一个用户信息
wxAccount := srv.NewWXAccount(&websrv.TaskInfo{
UUID: queryKey,
}, proxyInfo, dbUserInfo.ClientVersion, dbUserInfo)
//创建一个新链接
wxConnect := wxcore.NewWXConnect(WXServer, wxAccount)
//设置用户信息
wxAccount.SetUserInfo(dbUserInfo)
return businessFunc(wxConnect, false)
} else {
// 设置代理信息
key := fmt.Sprintf("%s%s", "wechat:Proxy:", queryKey)
exists, _ := db.Exists(key)
newModel := &req.GetLoginQrCodeModel{
Proxy: "",
Check: false,
}
if exists {
db.GETObj(key, &newModel)
}
var proxyInfo *proxynet.WXProxyInfo
if newModel.Proxy != "" {
proxyInfo = proxynet.ParseWXProxyInfo(newModel.Proxy)
} else {
proxyInfo = nil
}
//创建新一个用户信息
wxAccount := srv.NewWXAccount(&websrv.TaskInfo{
UUID: queryKey,
}, proxyInfo, ClientVersion, dbUserInfo)
//创建一个新链接
wxConnect := wxcore.NewWXConnect(WXServer, wxAccount)
return businessFunc(wxConnect, true)
}
}
}
// 检查实例Id是否存在 链接不存在返回错误不创建新链接
func checkExIdPerformNoCreateConnect(queryKey string, businessFunc BusinessFunc) vo.DTO {
ClientVersion := baseinfo.ClientVersion
//获取实例管理器
connectMgr := WXServer.GetWXConnectMgr()
//查询的queryKey为空创建一个链接实例
if queryKey == "" {
return businessFunc(nil, true)
}
//查询该链接是否存在
iwxConnect := connectMgr.GetWXConnectByUserInfoUUID(queryKey)
if iwxConnect != nil {
//执行回调方法
return businessFunc(iwxConnect, false)
} else {
//如果链接管理器不存在该链接查询数据库是否存在
dbUserInfo := db.GetUSerInfoByUUID(queryKey)
//数据库存在该链接数据 重新实例化一个链接对象
if dbUserInfo != nil {
if !(int(dbUserInfo.ClientVersion) > 0) {
dbUserInfo.ClientVersion = ClientVersion
}
// 设置代理信息
key := fmt.Sprintf("%s%s", "wechat:Proxy:", dbUserInfo.UUID)
exists, _ := db.Exists(key)
newModel := &req.GetLoginQrCodeModel{
Proxy: "",
Check: false,
}
if exists {
db.GETObj(key, &newModel)
}
var proxyInfo *proxynet.WXProxyInfo
if newModel.Proxy != "" {
proxyInfo = proxynet.ParseWXProxyInfo(newModel.Proxy)
} else {
proxyInfo = nil
}
//创建一个用户信息
wxAccount := srv.NewWXAccount(&websrv.TaskInfo{
UUID: queryKey,
}, proxyInfo, dbUserInfo.ClientVersion, dbUserInfo)
//创建一个新链接
wxConnect := wxcore.NewWXConnect(WXServer, wxAccount)
//设置用户信息
wxAccount.SetUserInfo(dbUserInfo)
return businessFunc(wxConnect, false)
} else {
// 诊断逻辑:为什么查不到?
reason := "未知原因"
var uEntity table.UserInfoEntity
err := db.MysqlDB.Where("uuid = ?", queryKey).First(&uEntity).Error
if err != nil {
reason = fmt.Sprintf("数据库UserInfo表未找到该UUID记录: %v", err)
} else {
// UUID 存在,检查 TargetIp
if srvconfig.GlobalSetting.TargetIp != "" && uEntity.TargetIp != srvconfig.GlobalSetting.TargetIp {
reason = fmt.Sprintf("TargetIp不匹配(DB:%s, Config:%s)", uEntity.TargetIp, srvconfig.GlobalSetting.TargetIp)
} else {
// 检查 DeviceInfo
// 判断是62还是A16
key := fmt.Sprintf("%s%s", "wechat:a16DeviceInfo:", uEntity.WxId)
exists, _ := db.Exists(key)
if !exists {
var dEntity table.DeviceInfoEntity
if err := db.MysqlDB.Where("wxId = ?", uEntity.WxId).First(&dEntity).Error; err != nil {
reason = fmt.Sprintf("缺少设备信息(DeviceInfo表无记录且Redis无A16缓存), WxId: %s, Err: %v", uEntity.WxId, err)
} else {
reason = "UserInfo和DeviceInfo都存在,但GetUSerInfoByUUID返回nil,可能是其他数据完整性问题"
}
} else {
reason = "UserInfo存在且有A16缓存,但GetUSerInfoByUUID返回nil,可能是反序列化或其他问题"
}
}
}
return vo.DTO{
Code: vo.FAIL_UUID,
Data: nil,
Text: fmt.Sprintf("%s 该链接不存在!调试信息: %s", queryKey, reason),
}
}
}
}
// 获取缓存中已存在的 wx 链接
func getExistWxConnect(queryKey string, businessFunc BusinessFunc) vo.DTO {
//获取实例管理器
connectMgr := WXServer.GetWXConnectMgr()
//查询的queryKey为空创建一个链接实例
if queryKey == "" {
return businessFunc(nil, true)
}
//查询该链接是否存在
iwxConnect := connectMgr.GetWXConnectByUserInfoUUID(queryKey)
if iwxConnect != nil {
//执行回调方法
userInfo := iwxConnect.GetWXAccount().GetUserInfo()
iwxConnect.GetWXAccount().SetUserInfo(userInfo)
return businessFunc(iwxConnect, false)
}
return businessFunc(nil, true)
}
func DeepFields(ifaceType reflect.Type) []reflect.StructField {
var fields []reflect.StructField
for i := 0; i < ifaceType.NumField(); i++ {
v := ifaceType.Field(i)
if v.Anonymous && v.Type.Kind() == reflect.Struct {
fields = append(fields, DeepFields(v.Type)...)
} else {
fields = append(fields, v)
}
}
return fields
}
func StructCopy(DstStructPtr interface{}, SrcStructPtr interface{}) {
srcv := reflect.ValueOf(SrcStructPtr)
dstv := reflect.ValueOf(DstStructPtr)
srct := reflect.TypeOf(SrcStructPtr)
dstt := reflect.TypeOf(DstStructPtr)
if srct.Kind() != reflect.Ptr || dstt.Kind() != reflect.Ptr ||
srct.Elem().Kind() == reflect.Ptr || dstt.Elem().Kind() == reflect.Ptr {
panic("Fatal error:type of parameters must be Ptr of value")
}
if srcv.IsNil() || dstv.IsNil() {
panic("Fatal error:value of parameters should not be nil")
}
srcV := srcv.Elem()
dstV := dstv.Elem()
srcfields := DeepFields(reflect.ValueOf(SrcStructPtr).Elem().Type())
for _, v := range srcfields {
if v.Anonymous {
continue
}
dst := dstV.FieldByName(v.Name)
src := srcV.FieldByName(v.Name)
if !dst.IsValid() {
continue
}
if src.Type() == dst.Type() && dst.CanSet() {
dst.Set(src)
continue
}
if src.Kind() == reflect.Ptr && !src.IsNil() && src.Type().Elem() == dst.Type() {
dst.Set(src.Elem())
continue
}
if dst.Kind() == reflect.Ptr && dst.Type().Elem() == src.Type() {
dst.Set(reflect.New(src.Type()))
dst.Elem().Set(src)
continue
}
}
return
}
/*
*
获取DeviceToken
*/
func checkDeviceToken(tmpUserInfo *baseinfo.UserInfo) {
//如果是android
if strings.HasPrefix(tmpUserInfo.LoginDataInfo.LoginData, "A") {
key := fmt.Sprintf("%s%s", "wechat:deviceTokenA16:", tmpUserInfo.LoginDataInfo.UserName)
exists, _ := db.Exists(key)
if exists {
//A16存redis
trustRes := &wechat.TrustResp{}
error := db.GETObj(key, &trustRes)
if error != nil {
log.Error("redis deviceToken is error=" + error.Error())
}
tmpUserInfo.DeviceInfoA16.DeviceToken = trustRes
} else {
tmpUserInfo.DeviceInfoA16.DeviceId = []byte(tmpUserInfo.LoginDataInfo.LoginData[:15])
tmpUserInfo.DeviceInfoA16.DeviceIdStr = tmpUserInfo.LoginDataInfo.LoginData
deviceTokenRsp, err := clientsdk.SendAndroIdDeviceTokenRequest(tmpUserInfo)
if err != nil {
log.Error("android 请求 deviceTokenRequest error!")
}
//保存5天
db.SETExpirationObj(key, &deviceTokenRsp, 60*60*24*5)
tmpUserInfo.DeviceInfoA16.DeviceToken = deviceTokenRsp
}
} else if strings.HasPrefix(tmpUserInfo.LoginDataInfo.LoginData, "62") {
key := fmt.Sprintf("%s%s", "wechat:deviceTokenIos:", tmpUserInfo.LoginDataInfo.UserName)
exists, _ := db.Exists(key)
if exists {
//ios存redis
trustRes := &wechat.TrustResp{}
error := db.GETObj(key, &trustRes)
if error != nil {
log.Error("ios redis deviceTokenIos is error=" + error.Error())
}
tmpUserInfo.DeviceInfo.DeviceToken = trustRes
} else {
deviceTokenRsp, err := clientsdk.SendIosDeviceTokenRequest(tmpUserInfo)
if err != nil {
log.Error("ios 请求 deviceTokenRequest error!")
}
//保存5天
db.SETExpirationObj(key, &deviceTokenRsp, 60*60*24*5)
tmpUserInfo.DeviceInfo.DeviceToken = deviceTokenRsp
fmt.Println(deviceTokenRsp, 333)
}
}
}
+280
View File
@@ -0,0 +1,280 @@
package service
import (
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
)
// AutoRedRequestService 自动抢红包
func AutoRedRequestService(queryKey string, m req.AutoRedRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// TransferRequestService 自动接收转账处理
func TransferRequestService(queryKey string, m req.AutoTransferRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// DelayRedRequestService 延迟领取红包处理
func DelayRedRequestService(queryKey string, m req.DelayRedRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// DelayTransferRequestService 延迟接收转账处理
func DelayTransferRequestService(queryKey string, m req.DelayAutoTransferRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// KeywordAvoidanceRequestService 关键字包不抢处理
func KeywordAvoidanceRequestService(queryKey string, m req.KeywordAvoidanceRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// AutoLikeRequestService 自动点赞处理
func AutoLikeRequestService(queryKey string, m req.AutoLikeRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// AutoForwardRequestService 朋友圈跟随转发处理
func AutoForwardRequestService(queryKey string, m req.AutoForwardRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// FavoriteForwardRequestService 朋友圈收藏转发处理
func FavoriteForwardRequestService(queryKey string, m req.FavoriteForwardRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// AutoCommentRequestService 朋友圈自动评论处理
func AutoCommentRequestService(queryKey string, m req.AutoCommentRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// MomentsRequestService 定时发朋友圈处理
func MomentsRequestService(queryKey string, m req.MomentsRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// MomentsPostRequestService 发大视频朋友圈处理
func MomentsPostRequestService(queryKey string, m req.MomentsPostRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// WelcomeNewMemberRequestService 欢迎新人入群处理
func WelcomeNewMemberRequestService(queryKey string, m req.WelcomeNewMemberRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// KeywordKickRequestService 关键词自动踢人处理
func KeywordKickRequestService(queryKey string, m req.KeywordKickRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// KeywordAutoReplyRequestService 关键词自动回复处理
func KeywordAutoReplyRequestService(queryKey string, m req.KeywordAutoReplyRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// MessageForwardingRequestService 万群同步处理
func MessageForwardingRequestService(queryKey string, m req.MessageForwardingRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
// 判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
// AutoApproveRequestService 自动同意好友请求
func AutoApproveRequestService(queryKey string, m req.AutoApproveRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
return vo.NewSuccessObj(nil, "设置成功!")
})
}
+124
View File
@@ -0,0 +1,124 @@
package service
import (
"strconv"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
)
// FavSyncService 同步收藏
func FavSyncService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 同步收藏
resp, err := reqInvoker.SendFavSyncRequestResult()
if err != nil {
return vo.NewFail("FavSyncServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 获取收藏list
func GetFavListService(queryKey string, req req.FavInfoModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 同步收藏
resp, err := reqInvoker.SendFavSyncListRequestResult(req.KeyBuf)
if err != nil {
return vo.NewFail("FavSyncServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// GetFavInfoService 获取收藏信息
func BatchDelFavItemService(queryKey string, m req.FavInfoModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取收藏消息
resp, err := reqInvoker.SendBatchDelFavItemRequestResult(m.FavId)
if err != nil {
return vo.NewFail("BatchDelFavItemServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// GetFavInfoService 获取收藏信息
func GetFavInfoService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取收藏消息
resp, err := reqInvoker.SendGetFavInfoRequestResult()
if err != nil {
return vo.NewFail("GetFavInfoServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// GetFavInfoService 获取收藏详细
func BatchGetFavItemService(queryKey string, m req.FavInfoModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取收藏消息
resp, err := reqInvoker.SendBatchGetFavItemRequestResult(m.FavId)
if err != nil {
return vo.NewFail("GetFavInfoServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
+49
View File
@@ -0,0 +1,49 @@
package service
import (
"encoding/base64"
"strconv"
"strings"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
)
// UploadAppAttachService 上传文件服务
func UploadAppAttachService(queryKey string, m req.UploadAppAttachModel) 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()
// 处理文件数据
fileData := m.FileData
sFileBase := strings.Split(fileData, ",")
if len(sFileBase) > 1 {
fileData = sFileBase[1]
}
fileBytes, err := base64.StdEncoding.DecodeString(fileData)
if err != nil {
return vo.NewFail("文件解码失败:" + err.Error())
}
// 上传文件
resp, err := reqInvoker.UploadAppAttach(fileBytes)
if err != nil {
return vo.NewFail("上传文件失败:" + err.Error())
}
return vo.NewSuccessObj(resp, "上传文件成功")
})
}
+75
View File
@@ -0,0 +1,75 @@
package service
import (
"github.com/google/uuid"
"strconv"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
)
// GetFinderSearchService 视频号搜索
func GetFinderSearchService(queryKey string, req req.FinderSearchModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 同步收藏
resp, err := reqInvoker.SendGetFinderSearchRequest(req.Index, req.Userver, req.UserKey, uuid.New().String())
if err != nil {
return vo.NewFail("GetFinderSearchServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 视频号中心
func FinderUserPrepareService(queryKey string, req req.FinderUserPrepareModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 同步收藏
resp, err := reqInvoker.SendFinderUserPrepareRequest(req.Userver)
if err != nil {
return vo.NewFail("FinderUserPrepareServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 视频号关注取消
func FinderFollowService(queryKey string, req req.FinderFollowModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendFinderFollowRequest(req.FinderUserName, req.OpType, req.RefObjectId, req.Cook, req.Userver, req.PosterUsername)
if err != nil {
return vo.NewFail("FinderUserPrepareServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
+267
View File
@@ -0,0 +1,267 @@
package service
import (
"strconv"
"sync"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
"github.com/gin-gonic/gin"
"github.com/gogf/gf/container/garray"
)
// GetContactListService 获取联系人
func GetContactListService(queryKey string, req req.GetContactListModel) 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()
//分页获取好友列表
resp, err := reqInvoker.SendGetContactListPageRequest(req.CurrentWxcontactSeq, req.CurrentChatRoomContactSeq)
if err != nil {
return vo.NewSuccess(gin.H{
"errMsg": resp.GetBaseResponse().GetErrMsg().GetStr(),
"retCode": resp.GetBaseResponse().GetRet(),
}, "")
}
return vo.NewSuccess(gin.H{
"ContactList": resp,
"errMsg": resp.GetBaseResponse().GetErrMsg().GetStr(),
"retCode": resp.GetBaseResponse().GetRet(),
}, "")
})
}
// GetFriendListService 获取好友
func GetFriendListService(queryKey string) 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())))
}
// 获取二级缓存器
iwxCache := connect.GetWXCache()
if !iwxCache.IsInitFinished() {
return vo.NewSuccess(gin.H{
"IsInitFinished": false,
}, "初始化未完成!")
}
return vo.NewSuccess(gin.H{
"IsInitFinished": true,
"count": len(wxAccount.GetWXFriendList()),
"friendList": wxAccount.GetWXFriendList(),
}, "")
})
}
// GetGroupListService 获取群列表
func GetGroupListService(queryKey string) 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())))
}
// 获取二级缓存器
iwxCache := connect.GetWXCache()
if !iwxCache.IsInitFinished() {
return vo.NewSuccess(gin.H{
"IsInitFinished": false,
}, "初始化未完成!")
}
return vo.NewSuccess(gin.H{
"IsInitFinished": true,
"count": len(wxAccount.GetWXGroupList()),
"GroupList": wxAccount.GetWXGroupList(),
}, "")
})
}
// GetGHListService 获取群列表
func GetGHListService(queryKey string) 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())))
}
// 获取二级缓存器
iwxCache := connect.GetWXCache()
if !iwxCache.IsInitFinished() {
return vo.NewSuccess(gin.H{
"IsInitFinished": false,
}, "初始化未完成!")
}
return vo.NewSuccess(gin.H{
"IsInitFinished": true,
"count": len(wxAccount.GetWXGhList()),
"GhList": wxAccount.GetWXGhList(),
}, "")
})
}
// FollowGHService 关注公众号
func FollowGHService(queryKey string, m req.FollowGHModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := connect.GetWXReqInvoker()
if len(m.GHList) <= 0 {
return vo.NewFail("没有要关注公众号。")
}
respArray := garray.New(true)
wg := sync.WaitGroup{}
for _, item := range m.GHList {
wg.Add(1)
go func(m req.VerifyUserItem) {
defer wg.Done()
resp, err := reqInvoker.VerifyUserRequest(1, "", m.Scene, m.Gh, m.Gh, "")
if err != nil {
respArray.Append(gin.H{
"GH": m.Gh,
"isFollowSuccess": false,
"errMsg": err.Error(),
})
return
}
isFollowSuccess := false
if resp.GetBaseResponse().GetRet() == 0 {
isFollowSuccess = true
}
respArray.Append(gin.H{
"GH": m.Gh,
"isFollowSuccess": isFollowSuccess,
"errMsg": resp.GetBaseResponse().GetErrMsg().GetStr(),
"retCode": resp.GetBaseResponse().GetRet(),
})
}(item)
}
wg.Wait()
return vo.NewSuccessObj(respArray.Interfaces(), "")
})
}
// UploadMContactService 上传手机通讯录好友
func UploadMContactService(queryKey string, m req.UploadMContactModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := connect.GetWXReqInvoker()
if len(m.MobileList) == 0 {
return vo.NewFail("没有要上传的手机号!")
}
/*lolDeviceInfoOsType := wxAccount.GetUserInfo().DeviceInfo.OsType
lolDeviceInfoOsTypeNumber := wxAccount.GetUserInfo().DeviceInfo.OsTypeNumber
userInfo := wxAccount.GetUserInfo().DeviceInfo
if !strings.HasSuffix(userInfo.OsType, "HUAWEI android") {
userInfo.OsType = "HUAWEI android"
userInfo.OsTypeNumber = "android 9.0"
reqInvoker.SendAutoAuthRequest()
}*/
resp, err := reqInvoker.UploadMContact(m.Mobile, m.MobileList, m.Opcode)
if err != nil {
return vo.NewFail("UploadMContactService - " + err.Error())
}
/*if strings.HasSuffix(userInfo.OsType, "HUAWEI android") {
userInfo := wxAccount.GetUserInfo().DeviceInfo
userInfo.OsType = lolDeviceInfoOsType
userInfo.OsTypeNumber = lolDeviceInfoOsTypeNumber
reqInvoker.SendAutoAuthRequest()
}*/
return vo.NewSuccessObj(resp, "操作成功!")
})
}
// GetMFriendService 获取手机通讯录好友
func GetMFriendService(queryKey string) 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()
resp, err := reqInvoker.GetMFriend()
if err != nil {
return vo.NewFail("GetMFriendService - " + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// VerifyUserRequestService // 添加好友 // 关注公众号 // 同意好友请求
func VerifyUserRequestService(queryKey string, m req.VerifyUserRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.VerifyUserRequest(m.OpCode, m.VerifyContent, m.Scene, m.V3, m.V4, m.ChatRoomUserName)
if err != nil {
return vo.NewFail("VerifyUserRequestService err" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
+96
View File
@@ -0,0 +1,96 @@
package service
import (
"strconv"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
"xiawan/wx/srv/wxtask"
)
// SearchContactRequestService 搜索好友
func SearchContactRequestService(queryKey string, m req.SearchContactRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendSearchContactRequest(m.OpCode, m.FromScene, m.SearchScene, m.UserName)
if err != nil {
return vo.NewFail("SearchContactRequestService err:" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 获取好友关系
func GetFriendRelationService(queryKey string, m req.GetFriendRelationModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendGetFriendRelationRequest(m.UserName)
if err != nil {
return vo.NewFail("GetFriendRelationService err:" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 查联系人详情
func GetContactContactService(queryKey string, m req.BatchGetContactModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendGetContactRequestForList(m.UserNames, m.RoomWxIDList)
if err != nil {
return vo.NewFail("SearchContactRequestService err:" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// StartFriendTaskService 启动好友任务(1:检测僵死粉 2:清理僵死粉)
func StartFriendTaskService(queryKey string, taskType int) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 创建好友任务并执行
friendTask := wxtask.NewWXFriendTask(iwxConnect)
success := friendTask.StartFriendTask(taskType)
if !success {
return vo.NewFail("启动任务失败")
}
return vo.NewSuccessObj(nil, "任务启动成功")
})
}
+566
View File
@@ -0,0 +1,566 @@
package service
import (
"strconv"
"strings"
"xiawan/wx/api/req"
"xiawan/wx/api/utils"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/protobuf/wechat"
pb "xiawan/wx/protobuf/wechat"
"xiawan/wx/srv"
"xiawan/wx/srv/wxface"
"github.com/gin-gonic/gin"
"github.com/gogo/protobuf/proto"
)
// GetChatroomQrCodeService 获取群二维码
func GetChatroomQrCodeService(queryKey string, m req.GetChatroomQrCodeModel) 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()
// 获取群二维码请求
resp, err := reqInvoker.SendGetQrCodeRequest(m.ChatRoomName, uint32(0))
if err != nil {
return vo.NewFail("GetQrCodeerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// SetChatroomAnnouncementService 设置群公告
func SetChatroomAnnouncementService(queryKey string, m req.UpdateChatroomAnnouncementModel) 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()
resp, err := reqInvoker.SetChatRoomAnnouncementRequest(m.ChatRoomName, m.Content)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccess(gin.H{
"baseResp": resp.GetBaseResponse(),
}, "")
})
}
// ConsentToJoinGroupService 同意进入群聊
func ConsentToJoinGroupService(queryKey string, m req.ConsentToJoinGroupModel) 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()
resp, err := reqInvoker.ConsentToJoinGroupRequest(m.Url)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// GetChatroomMemberDetailService 获取群成员详细
func GetChatroomMemberDetailService(queryKey string, m req.GetChatroomMemberDetailModel) 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()
resp, err := reqInvoker.GetChatroomMemberDetailRequest(m.ChatRoomName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 获取群公告
func SetGetChatRoomInfoDetailService(queryKey string, m req.GetChatroomMemberDetailModel) 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()
resp, err := reqInvoker.SetGetChatRoomInfoDetailRequest(m.ChatRoomName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 获取群详情
func GetChatRoomInfoService(queryKey string, m req.ChatRoomWxIdListModel) 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()
resp, err := reqInvoker.SendGetContactRequest(m.ChatRoomWxIdList, nil, m.ChatRoomWxIdList, true)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 设置群昵称
func SetChatroomNameService(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())))
}
chatRoomNames := strings.Split(m.ChatRoomName, ",")
// 获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
getContactResp, err := reqInvoker.SendGetContactRequest(chatRoomNames, nil, chatRoomNames, true)
if err != nil {
return vo.NewFail(err.Error())
}
modContact := getContactResp.ContactList[0]
modContact.NickName = &pb.SKBuiltinString{
Str: proto.String(m.Nickname),
}
buffer, err := proto.Marshal(modContact)
cmdItem := baseinfo.ModifyItem{
CmdID: uint32(27),
Len: uint32(len(buffer)),
Data: buffer,
}
var cmdItems []*baseinfo.ModifyItem
cmdItems = append(cmdItems, &cmdItem)
error := reqInvoker.SendOplogRequest(cmdItems)
if error != nil {
return vo.NewFail(error.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 {
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())))
}
chatRoomNames := strings.Split(m.ChatRoomName, ",")
// 获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
getContactResp, err := reqInvoker.SendGetContactRequest(chatRoomNames, nil, chatRoomNames, true)
if err != nil {
return vo.NewFail(err.Error())
}
modContact := getContactResp.ContactList[0]
bit := uint32(0)
if m.Val == 1 {
bit = *(modContact.BitVal) | uint32(1<<0)
} else {
bit = *(modContact.BitVal) &^ uint32(1<<0)
}
ModContactData := &pb.ModContact{
UserName: &pb.SKBuiltinString{
Str: &m.ChatRoomName,
},
NickName: &pb.SKBuiltinString{},
Pyinitial: &pb.SKBuiltinString{},
QuanPin: &pb.SKBuiltinString{},
Sex: proto.Int32(0),
ImgBuf: &pb.SKBuiltinString_{
Len: proto.Uint32(0),
},
BitMask: modContact.BitMask,
BitVal: proto.Uint32(bit),
ImgFlag: proto.Uint32(0),
Remark: &pb.SKBuiltinString{
Str: modContact.Remark.Str,
},
RemarkPyinitial: &pb.SKBuiltinString{
Str: modContact.RemarkPyinitial.Str,
},
RemarkQuanPin: &pb.SKBuiltinString{
Str: modContact.RemarkQuanPin.Str,
},
ContactType: proto.Uint32(0),
ChatRoomNotify: proto.Uint32(1),
AddContactScene: proto.Uint32(0),
ExtFlag: proto.Uint32(0),
}
buffer, err := proto.Marshal(ModContactData)
cmdItem := baseinfo.ModifyItem{
CmdID: uint32(2),
Len: uint32(len(buffer)),
Data: buffer,
}
var cmdItems []*baseinfo.ModifyItem
cmdItems = append(cmdItems, &cmdItem)
error := reqInvoker.SendOplogRequest(cmdItems)
if error != nil {
return vo.NewFail(error.Error())
}
return vo.NewSuccessObj(nil, "成功")
})
}
// QuitChatroomService 退出群聊
func QuitChatroomService(queryKey string, m req.GetChatroomMemberDetailModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.GetQuitChatroomRequest(m.ChatRoomName)
if err != nil {
return vo.NewFail(err.Error())
}
//删除缓存中群
wxAccount.RemoveWXGroup(m.ChatRoomName)
return vo.NewSuccessObj(nil, "发送退群请求成功")
})
}
// CreateChatRoomService 创建群
func CreateChatRoomService(queryKey string, m req.CreateChatRoomModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendCreateChatRoomRequest(m.TopIc, m.UserList)
if err != nil {
return vo.NewFail("创建群失败!err :" + err.Error())
}
go addGroupCache(wxAccount, resp)
return vo.NewSuccessObj(resp, "")
})
}
// 添加到缓存
func addGroupCache(wx *srv.WXAccount, chatRoom *wechat.CreateChatRoomResponse) {
if chatRoom == nil || chatRoom.ChatRoomName.GetStr() == "{}" ||
chatRoom.ChatRoomName.GetStr() == "" {
return
}
v := make([]*wechat.ChatRoomMemberInfo, 0)
for _, val := range chatRoom.MemberList {
v = append(v, &wechat.ChatRoomMemberInfo{
UserName: proto.String(val.MemberName.GetStr()),
ChatroomMemberFlag: proto.Uint32(0),
})
}
modContact := &wechat.ModContact{
UserName: chatRoom.ChatRoomName,
NickName: chatRoom.Topic,
Pyinitial: chatRoom.Pyinitial,
QuanPin: chatRoom.QuanPin,
ChatRoomOwner: &wx.GetUserInfo().WxId,
SmallHeadImgUrl: chatRoom.SmallHeadImgUrl,
ChatroomMaxCount: proto.Uint32(uint32(50000)),
NewChatroomData: &wechat.ChatRoomMemberData{
MemberCount: chatRoom.MemberCount,
ChatroomMemberList: v,
},
}
wx.AddWXGroup(modContact)
}
// InviteChatroomMembersService 邀请群成员
func InviteChatroomMembersService(queryKey string, m req.InviteChatroomMembersModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendInviteChatroomMembersRequest(m.ChatRoomName, m.UserList)
if err != nil {
return vo.NewFail("InviteChatroomMembersServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// AddChatRoomMemberService 添加群成员
func AddChatRoomMemberService(queryKey string, m req.InviteChatroomMembersModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendAddChatRoomMemberRequest(m.ChatRoomName, m.UserList)
if err != nil {
return vo.NewFail("InviteChatroomMembersServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 删除群成员
func SendDelDelChatRoomMemberService(queryKey string, m req.InviteChatroomMembersModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendDelDelChatRoomMemberRequest(m.ChatRoomName, m.UserList)
if err != nil {
return vo.NewFail("InviteChatroomMembersServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 转让群
func SendTransferGroupOwnerService(queryKey string, m req.TransferGroupOwnerModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendTransferGroupOwnerRequest(m.ChatRoomName, m.NewOwnerUserName)
if err != nil {
return vo.NewFail("InviteChatroomMembersServiceerr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 扫码入群
func ScanIntoUrlGroupService(queryKey string, m req.ScanIntoUrlGroupModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
if len(m.Url) == 0 {
return vo.NewFail("ScanIntoUrlGroupService url == empty")
}
resp, err := reqInvoker.GetA8KeyRequest(2, 4, m.Url, baseinfo.GetA8Key)
if err != nil {
return vo.NewFail("ScanIntoUrlGroupService err:" + err.Error())
}
if resp.GetBaseResponse().GetRet() != 0 {
return vo.NewSuccess(gin.H{
"isJoinSuccess": false,
"resp": resp,
}, "进群失败")
}
body, err := utils.ScanIntoGrouppost(resp.GetFullURL())
if err != nil && strings.Index(err.Error(), "@chatroom") != -1 {
return vo.NewSuccess(gin.H{
"isJoinSuccess": true,
"body": body,
"chatroomUrl": err.Error(),
"fullUrl": resp.GetFullURL(),
"resp": resp,
}, "进群成功")
}
msg := ""
if strings.Index(body, "频繁") != -1 {
msg = ",操作太频繁,请稍后再试!"
}
if strings.Index(body, "二维码已过期") != -1 {
msg = ",二维码已过期!"
}
if strings.Index(body, "该群聊邀请已过期") != -1 {
msg = ",该群聊邀请已过期!"
}
return vo.NewSuccess(gin.H{
"isJoinSuccess": true,
"body": body,
"fullUrl": resp.GetFullURL(),
"resp": resp,
}, "进群失败"+msg)
})
}
// 设置群聊邀请开关
func SetChatroomAccessVerifyService(queryKey string, m req.SetChatroomAccessVerifyModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
v := uint32(0)
if m.Enable {
v = uint32(2)
}
req := &wechat.ModChatRoomAccessVerifyRequest{
ChatRoomName: proto.String(m.ChatRoomName),
Status: proto.Uint32(v),
}
buffer, err := proto.Marshal(req)
cmdItem := baseinfo.ModifyItem{
CmdID: 66,
Len: uint32(len(buffer)),
Data: buffer,
}
var cmdItems []*baseinfo.ModifyItem
cmdItems = append(cmdItems, &cmdItem)
err = reqInvoker.SendOplogRequest(cmdItems)
if err != nil {
return vo.NewFail("SetFunctionSwitchService err:" + err.Error())
}
return vo.NewSuccessObj("ok", "成功")
})
}
// 添加群管理员
func AddChatroomAdminService(queryKey string, m req.ChatroomMemberModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendAddChatroomAdminRequest(m.ChatRoomName, m.UserList)
if err != nil {
return vo.NewFail("SendAddChatroomAdminRequesterr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 删除群管理
func DelChatroomAdminService(queryKey string, m req.ChatroomMemberModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendDelChatroomAdminRequest(m.ChatRoomName, m.UserList)
if err != nil {
return vo.NewFail("SendDelChatroomAdminRequesterr :" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
+58
View File
@@ -0,0 +1,58 @@
package service
import (
"encoding/json"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/db"
"github.com/gin-gonic/gin"
)
// SetKeywordReplyService 设置关键词回复
func SetKeywordReplyService(queryKey string, m req.SetKeywordReplyModel) vo.DTO {
// 将关键词回复对转换为JSON字符串
pairsJSON, err := json.Marshal(m.Pairs)
if err != nil {
return vo.NewFail("序列化关键词回复对失败")
}
// 更新B002和B002Str
enable := 0
if m.Enable {
enable = 1
}
_, err = db.UpdateCommand(queryKey, "B002", enable, "")
if err != nil {
return vo.NewFail("更新关键词回复状态失败")
}
_, err = db.UpdateCommand(queryKey, "B002Str", 0, string(pairsJSON))
if err != nil {
return vo.NewFail("更新关键词回复配置失败")
}
return vo.NewSuccess(gin.H{}, "设置成功")
}
// GetKeywordReplyService 获取关键词回复配置
func GetKeywordReplyService(queryKey string) vo.DTO {
command, err := db.QueryCommand(queryKey)
if err != nil {
return vo.NewFail("获取关键词回复配置失败")
}
var pairs []req.KeywordReplyPair
if command.B002Str != "" {
err = json.Unmarshal([]byte(command.B002Str), &pairs)
if err != nil {
return vo.NewFail("解析关键词回复配置失败")
}
}
return vo.NewSuccessObj(map[string]interface{}{
"enable": command.B002 == 1,
"pairs": pairs,
}, "获取成功")
}
+167
View File
@@ -0,0 +1,167 @@
package service
import (
"strconv"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
"github.com/lunny/log"
)
// GetContactLabelListRequestService 获取标签列表
func GetContactLabelListRequestService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendGetContactLabelListRequest(true)
if err != nil {
return vo.NewFail("GetContactLabelListRequestService" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// AddContactLabelRequestService 添加标签
func AddContactLabelRequestService(queryKey string, m req.LabelModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
if len(m.LabelNameList) == 0 {
return vo.NewFail("没有要添加的标签")
}
resp, err := reqInvoker.SendAddContactLabelRequest(m.LabelNameList, true)
if err != nil {
return vo.NewFail("AddContactLabelRequestService" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// DelContactLabelRequestService 删除标签
func DelContactLabelRequestService(queryKey string, m req.LabelModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendDelContactLabelRequest(m.LabelId)
if err != nil {
return vo.NewFail("SendDelContactLabelRequestService" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// ModifyLabelRequestService 修改标签
func ModifyLabelRequestService(queryKey string, m req.LabelModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendModifyLabelRequest(m.UserLabelList)
if err != nil {
return vo.NewFail("SendDelContactLabelRequestService" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 获取标签下好友
func GetWXFriendListByLabelIDService(queryKey string, req req.LabelModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
retList := make([]string, 0)
// 遍历好友 获取对应标签的好友列表
i, _ := strconv.Atoi(req.LabelId)
//重新拉取好友列表
if len(wxAccount.FriendMap) <= 0 {
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
var CurrentWxcontactSeq = uint32(0)
var CurrentChatRoomContactSeq = uint32(0)
for true {
resp, err := reqInvoker.SendGetContactListPageRequest(CurrentWxcontactSeq, CurrentChatRoomContactSeq)
if err != nil {
log.Error("分页请求获取联系人出现error")
break
}
if resp.BaseResponse.GetRet() != 0 {
log.Error("分页请求获取联系人出现error=0")
break
}
CurrentWxcontactSeq = resp.GetCurrentWxcontactSeq()
CurrentChatRoomContactSeq = resp.GetCurrentChatRoomContactSeq()
if len(resp.GetContactUsernameList()) <= 0 {
break
}
//批量获取联系人
response, error := reqInvoker.SendGetContactRequestForList(resp.GetContactUsernameList(), nil)
if error != nil {
log.Error("获取详情出现error")
}
if response.BaseResponse.GetRet() != 0 {
log.Error("获取详情出现error=0")
break
}
for _, v := range response.GetContactList() {
wxAccount.AddWXFriendContact(v)
}
}
}
for userName, modContact := range wxAccount.FriendMap {
if wxAccount.ContainsLabel(modContact.GetLabelIdlist(), uint32(i)) {
retList = append(retList, userName)
}
}
return vo.NewSuccessObj(retList, "")
})
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+77
View File
@@ -0,0 +1,77 @@
package service
import (
"strconv"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/db"
"xiawan/wx/srv/wxface"
)
// GetMyQrCodeService 获取个人二维码
func GetMyQrCodeService(queryKey string, m req.GetQrCodeModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
wxid := wxAccount.GetUserInfo().WxId
resp, err := reqInvoker.SendGetQrCodeRequest(wxid, m.Style)
if err != nil {
return vo.NewFail("GetQrCodeService err:" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 查看附近的人
func GetPeopleNearbyService(queryKey string, m req.PeopleNearbyModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendGetPeopleNearbyResultRequest(m.Longitude, m.Latitude)
if err != nil {
return vo.NewFail("GetPeopleNearbyService" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 修改指令状态
func UpdateCmdStatusService(queryKey string, m req.ModifyCmdStatusModelNew) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(wxConn wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := wxConn.GetWXAccount()
cache := wxConn.GetWXCache()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !wxConn.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
db.UpdateCommand(queryKey, m.Key, m.Value, m.ValueStr)
query, err := db.QueryCommand(queryKey)
if err != nil {
return vo.NewFail("操作失败!")
}
cache.SendUsageByText()
return vo.NewSuccessObj(query, "操作成功!")
})
}
+226
View File
@@ -0,0 +1,226 @@
package service
import (
"encoding/json"
"strconv"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
)
// 获取银行卡信息
func GetBandCardListService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
tmpReqItem := &baseinfo.TenPayReqItem{}
tmpReqItem.CgiCMD = 72
tmpReqItem.ReqText = ""
tenPayResp, err := reqInvoker.SendBandCardRequest(tmpReqItem)
if err != nil {
return vo.NewFail("GetBandCardListService err:" + err.Error())
}
// 解析响应
retResp := &baseinfo.TenPayResp{}
retText := tenPayResp.GetRetText().GetBuffer()
err = json.Unmarshal(retText, retResp)
if err != nil {
return vo.NewFail("查询QB信息失败")
}
return vo.NewSuccessObj(retResp, "")
})
}
// 生成自定义二维码
func GeneratePayQCodeService(queryKey string, req req.GeneratePayQCodeModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
var tenpayUrl = "delay_confirm_flag=0&desc=" + req.Name + "&fee=" + req.Money + "&fee_type=CNY&pay_scene=31&receiver_name=" + wxAccount.GetUserInfo().WxId + "&scene=31&transfer_scene=2"
wcPaySign, err := clientsdk.TenPaySignDes3(tenpayUrl, "%^&*Tenpay!@#$")
if err != nil {
return vo.NewFail("no")
}
tenpayUrl += "&WCPaySign=" + wcPaySign
tmpReqItem := &baseinfo.TenPayReqItem{}
tmpReqItem.CgiCMD = 94
tmpReqItem.ReqText = tenpayUrl
tenPayResp, err := reqInvoker.SendTenPayRequest(tmpReqItem)
if err != nil {
return vo.NewFail("GetBandCardListService err:" + err.Error())
}
// 解析响应
retResp := &baseinfo.GeneratePayQCodeResp{}
retText := tenPayResp.GetRetText().GetBuffer()
err = json.Unmarshal(retText, retResp)
if err != nil {
return vo.NewFail("查询QB信息失败")
}
return vo.NewSuccessObj(retResp, "")
})
}
// CollectMoneyService 确认收款
func CollectMoneyService(queryKey string, req req.CollectmoneyModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
tenpayUrl := "invalid_time=" + req.InvalidTime + "&op=confirm&total_fee=0&trans_id=" + req.TransFerId + "&transaction_id=" + req.TransactionId + "&username=" + req.ToUserName
wcPaySign, err := clientsdk.TenPaySignDes3(tenpayUrl, "%^&*Tenpay!@#$")
if err != nil {
return vo.NewFail("no")
}
tenpayUrl += "&WCPaySign=" + wcPaySign
tmpReqItem := &baseinfo.TenPayReqItem{}
tmpReqItem.CgiCMD = 85
tmpReqItem.ReqText = tenpayUrl
tenPayResp, err := reqInvoker.SendTenPayRequest(tmpReqItem)
if err != nil {
return vo.NewFail("CollectMoneyService err:" + err.Error())
}
return vo.NewSuccessObj(tenPayResp, "")
})
}
// 拆红包
func OpenRedEnvelopesService(queryKey string, req baseinfo.HongBaoItem) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
rsp, err := reqInvoker.SendOpenRedEnvelopesRequest(&req)
if err != nil {
return vo.NewFail("CollectMoneyService err:" + err.Error())
}
return vo.NewSuccessObj(rsp, "")
})
}
// 创建红包
func WXCreateRedPacketService(queryKey string, req baseinfo.RedPacket) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
rsp, err := reqInvoker.SendWXCreateRedPacketRequest(&req)
if err != nil {
return vo.NewFail("CollectMoneyService err:" + err.Error())
}
return vo.NewSuccessObj(rsp, "")
})
}
// 查看红包详情
func QueryRedEnvelopesDetailService(queryKey string, req baseinfo.HongBaoItem) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
rsp, err := reqInvoker.SendRedEnvelopesDetailRequest(&req)
if err != nil {
return vo.NewFail("QueryRedEnvelopesDetailService err:" + err.Error())
}
return vo.NewSuccessObj(string(rsp.GetRetText().GetBuffer()), "")
})
}
// 查看红包领取列表
func GetRedPacketListService(queryKey string, req baseinfo.GetRedPacketList) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
rsp, err := reqInvoker.SendGetRedPacketListRequest(&req)
if err != nil {
return vo.NewFail("QueryRedEnvelopesDetailService err:" + err.Error())
}
return vo.NewSuccessObj(string(rsp.GetRetText().GetBuffer()), "")
})
}
// CreatePreTransferService 创建转账
func CreatePreTransferService(queryKey string, req *req.CreatePreTransfer) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
tenPayResp, err := reqInvoker.SendCreatePreTransferRequest(req)
if err != nil {
return vo.NewFail("CreatePreTransferService err:" + err.Error())
}
return vo.NewSuccessObj(tenPayResp, "")
})
}
// ConfirmPreTransferService 确认转账
func ConfirmPreTransferService(queryKey string, req *req.ConfirmPreTransfer) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
tenPayResp, err := reqInvoker.SendConfirmPreTransferRequest(req)
if err != nil {
return vo.NewFail("ConfirmPreTransferService err:" + err.Error())
}
return vo.NewSuccessObj(tenPayResp, "")
})
}
+41
View File
@@ -0,0 +1,41 @@
package service
import (
"xiawan/wx/db/table"
)
// GetProxyMappingList 获取代理映射列表
func GetProxyMappingList() ([]table.ProxyMapping, error) {
// 固定返回代理映射列表
list := []table.ProxyMapping{
{ProxyNumber: "1", ProxyValue: "辽宁"},
{ProxyNumber: "2", ProxyValue: "上海"},
{ProxyNumber: "3", ProxyValue: "江苏"},
{ProxyNumber: "4", ProxyValue: "浙江"},
{ProxyNumber: "5", ProxyValue: "安徽"},
{ProxyNumber: "6", ProxyValue: "福建"},
{ProxyNumber: "7", ProxyValue: "江西"},
{ProxyNumber: "8", ProxyValue: "山东"},
{ProxyNumber: "9", ProxyValue: "河南"},
{ProxyNumber: "10", ProxyValue: "湖北"},
{ProxyNumber: "11", ProxyValue: "湖南"},
{ProxyNumber: "12", ProxyValue: "北京"},
{ProxyNumber: "13", ProxyValue: "天津"},
{ProxyNumber: "14", ProxyValue: "河北"},
{ProxyNumber: "15", ProxyValue: "山西"},
{ProxyNumber: "16", ProxyValue: "内蒙古"},
{ProxyNumber: "17", ProxyValue: "广东"},
{ProxyNumber: "18", ProxyValue: "广西"},
{ProxyNumber: "19", ProxyValue: "海南"},
{ProxyNumber: "20", ProxyValue: "陕西"},
{ProxyNumber: "21", ProxyValue: "甘肃"},
{ProxyNumber: "22", ProxyValue: "青海"},
{ProxyNumber: "23", ProxyValue: "宁夏"},
{ProxyNumber: "24", ProxyValue: "新疆"},
{ProxyNumber: "25", ProxyValue: "重庆"},
{ProxyNumber: "26", ProxyValue: "四川"},
{ProxyNumber: "27", ProxyValue: "贵州"},
{ProxyNumber: "28", ProxyValue: "云南"},
}
return list, nil
}
+495
View File
@@ -0,0 +1,495 @@
package service
import (
"github.com/gogo/protobuf/proto"
"strconv"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/protobuf/wechat"
"xiawan/wx/srv/wxface"
)
func QWContactService(queryKey string, m *req.QWContactModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendQWContactRequest(m.ToUserName, m.ChatRoom, m.T)
if err != nil {
return vo.NewFail("查询失败")
}
return vo.NewSuccessObj(resp, "")
})
}
// 提取全部的企业通寻录
func QWSyncContactService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendQWSyncContactRequest()
if err != nil {
return vo.NewFail("查询失败")
}
return vo.NewSuccessObj(resp, "")
})
}
// 备注企业 wxid
func QWRemarkService(queryKey string, m *req.QWRemarkModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
req := &wechat.QYModChatRoomTopicRequest{
G: proto.String(m.ToUserName),
P: proto.String(m.Name),
}
buffer, err := proto.Marshal(req)
err = reqInvoker.SendQWOpLogRequest(3, buffer)
if err != nil {
return vo.NewFail("失败")
}
return vo.NewSuccessObj("ok", "操作成功")
})
}
// 创建企业微信
func QWCreateChatRoomService(queryKey string, m *req.QWCreateModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendQWCreateChatRoomRequest(m.ToUserName)
if err != nil {
return vo.NewFail("失败")
}
return vo.NewSuccessObj(resp, "操作成功")
})
}
// 搜手机或企业对外名片链接提取验证
func QWSearchContactService(queryKey string, m req.SearchContactModel) 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()
resp, err := reqInvoker.SendQWSearchContactRequest(m.Tg, m.FromScene, m.UserName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 向企业微信打招呼
func QWApplyAddContactService(queryKey string, m req.QWApplyAddContactModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendQWApplyAddContactRequest(m.UserName, m.V1, m.Content)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj("ok", "操作成功")
})
}
// 单向加企业微信
func QWAddContactService(queryKey string, m req.QWApplyAddContactModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
// 获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendQWAddContactRequest(m.UserName, m.V1, m.Content)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj("ok", "操作成功")
})
}
// 提取全部企业微信群
func QWSyncChatRoomService(queryKey string, m req.QWSyncChatRoomModel) 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()
rsp, err := reqInvoker.SendQWSyncChatRoomRequest(m.Key)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 转让企业群
func QWChatRoomTransferOwnerService(queryKey string, m req.QWChatRoomTransferOwnerModel) 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()
rsp, err := reqInvoker.SendQWChatRoomTransferOwnerRequest(m.ChatRoomName, m.ToUserName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 直接拉好友进群
func QWAddChatRoomMemberService(queryKey string, m req.QWAddChatRoomMemberModel) 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()
rsp, err := reqInvoker.SendQWAddChatRoomMemberRequest(m.ChatRoomName, m.ToUserName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 发送群邀请链接
func QWInviteChatRoomMemberService(queryKey string, m req.QWAddChatRoomMemberModel) 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()
rsp, err := reqInvoker.SendQWInviteChatRoomMemberRequest(m.ChatRoomName, m.ToUserName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 删除企业群成员
func QWDelChatRoomMemberService(queryKey string, m req.QWAddChatRoomMemberModel) 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()
rsp, err := reqInvoker.SendQWDelChatRoomMemberRequest(m.ChatRoomName, m.ToUserName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 提取企业群全部成员
func QWGetChatRoomMemberService(queryKey string, m req.QWAddChatRoomMemberModel) 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()
rsp, err := reqInvoker.SendQWGetChatRoomMemberRequest(m.ChatRoomName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// -提取企业群名称公告设定等信息
func QWGetChatroomInfoService(queryKey string, m req.QWAddChatRoomMemberModel) 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()
rsp, err := reqInvoker.SendQWGetChatroomInfoRequest(m.ChatRoomName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 提取企业群二维码
func QWGetChatRoomQRService(queryKey string, m req.QWAddChatRoomMemberModel) 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()
rsp, err := reqInvoker.SendQWGetChatRoomQRRequest(m.ChatRoomName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 增加企业管理员
func QWAppointChatRoomAdminService(queryKey string, m req.QWAddChatRoomMemberModel) 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()
rsp, err := reqInvoker.SendQWAppointChatRoomAdminRequest(m.ChatRoomName, m.ToUserName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 移除群管理
func QWDelChatRoomAdminService(queryKey string, m req.QWAddChatRoomMemberModel) 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()
rsp, err := reqInvoker.SendQWDelChatRoomAdminRequest(m.ChatRoomName, m.ToUserName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 同意进企业群
func QWAcceptChatRoomRequestService(queryKey string, m req.QWAcceptChatRoomModel) 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()
rsp, err := reqInvoker.SendQWAcceptChatRoomRequest(m.Link, m.Opcode)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 设定企业群
func QWAdminAcceptJoinChatRoomSetService(queryKey string, m req.QWAdminAcceptJoinChatRoomSetModel) 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()
rsp, err := reqInvoker.SendQWAdminAcceptJoinChatRoomSetRequest(m.ChatRoomName, m.P)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 修改企业群名称
func QWModChatRoomNameService(queryKey string, m req.QWModChatRoomNameModel) 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()
rsp, err := reqInvoker.SendQWModChatRoomNameRequest(m.ChatRoomName, m.Name)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 修改成员在群中呢称
func QWModChatRoomMemberNickService(queryKey string, m req.QWModChatRoomNameModel) 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()
rsp, err := reqInvoker.SendQWModChatRoomMemberNickRequest(m.ChatRoomName, m.Name)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 发布企业群公告
func QWChatRoomAnnounceService(queryKey string, m req.QWModChatRoomNameModel) 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()
rsp, err := reqInvoker.SendQWChatRoomAnnounceRequest(m.ChatRoomName, m.Name)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
// 删除企业群
func SendQWDelChatRoomService(queryKey string, m req.QWModChatRoomNameModel) 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()
rsp, err := reqInvoker.SendQWDelChatRoomRequest(m.ChatRoomName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(rsp, "操作成功")
})
}
+641
View File
@@ -0,0 +1,641 @@
package service
import (
"encoding/base64"
"fmt"
"log"
"regexp"
"strconv"
"strings"
"sync"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/clientsdk/baseutils"
"xiawan/wx/clientsdk/xmltool"
"xiawan/wx/protobuf/proto_ref"
"xiawan/wx/srv/defines"
"xiawan/wx/srv/wxcore"
"xiawan/wx/srv/wxface"
"github.com/gin-gonic/gin"
"github.com/gogf/gf/container/garray"
_ "github.com/gogf/gf/container/garray"
)
// SendSnsTimeLineRequestService 获取朋友圈主页
func SendSnsTimeLineRequestService(queryKey string, m req.GetSnsInfoModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
//获取朋友圈主页
resp, err := reqInvoker.SendSnsTimeLineRequestResult(m.FirstPageMD5, m.MaxID)
if err != nil {
return vo.NewFail("SendSnsTimeLineRequestService" + err.Error())
}
ObjectList := resp.GetObjectList()
if ObjectList != nil && len(ObjectList) > 0 {
for _, v := range ObjectList {
objectDesc := v.GetObjectDesc()
if objectDesc == nil {
continue
}
if objectDesc.GetBuffer() != nil {
v.SetObjectDescStr(objectDesc.GetBuffer())
}
}
}
return vo.NewSuccessObj(resp, "")
})
}
// 通过id获朋友圈详情
func SendSnsObjectDetailByIdService(queryKey string, m req.GetIdDetailModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
//获取好友朋友圈主页
id, _ := strconv.ParseUint(m.Id, 0, 64)
resp, err := reqInvoker.SendSnsObjectDetailRequest(id)
if err != nil {
return vo.NewFail("SendSnsTimeLineRequestService" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// SendSnsUserPageRequestService 获取指定人朋友圈
func SendSnsUserPageRequestService(queryKey string, m req.GetSnsInfoModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
//获取好友朋友圈主页
resp, err := reqInvoker.SendSnsUserPageRequest(m.UserName, m.FirstPageMD5, m.MaxID, true)
if err != nil {
return vo.NewFail("SendSnsUserPageRequestService" + err.Error())
}
count := resp.GetObjectCount()
if count > 0 {
snsObjList := resp.ObjectList
for _, snsObject := range snsObjList {
objDesc := snsObject.ObjectDesc
tmpTimeLineObj := &proto_ref.TimelineObject{}
// 反序列化 TimeLineXML
err := xmltool.Unmarshal(objDesc.Buffer, &tmpTimeLineObj)
if err != nil {
log.Println("GetSnsSyncService Parse TimeLineXML - xml.Unmarshal err:", err)
}
snsObject.ObjectInfo = tmpTimeLineObj
//snsObject.ObjectDesc = nil
}
}
return vo.NewSuccessObj(resp, "")
})
}
// 转发收藏朋友圈
func SendFavItemCircleService(queryKey string, m req.SendFavItemCircle) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取指定的朋友圈
objIDString := baseutils.GetNumberString(m.SourceID)
snsObjID, _ := strconv.ParseUint(objIDString, 10, 64)
snsObject, err := reqInvoker.SendSnsObjectDetailRequest(snsObjID)
if err != nil {
baseutils.PrintLog("WXSnsTransTask.doFavTask - SendSnsObjectDetailRequest err: " + err.Error())
return vo.NewFail("操作失败!" + err.Error())
}
//放入消息队例
currentTaskMgr := iwxConnect.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentSnsTransTask := taskMgr.GetSnsTransTask()
// 转发朋友圈
err = currentSnsTransTask.DoSnsTransTask(snsObject, defines.MTaskTypeFavTrans, m.BlackList, m.Location, m.LocationVal)
if err == nil {
// 如果转发收藏成功则删除
reqInvoker.SendBatchDelFavItemRequest(m.FavItemID)
return vo.NewSuccessObj("ok", "操作成功!")
}
return vo.NewFail("操作失败!" + err.Error())
})
}
// 一键转发朋友圈
func SendOneIdCircleService(queryKey string, m req.GetIdDetailModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取指定的朋友圈
snsObjID, _ := strconv.ParseUint(m.Id, 10, 64)
snsObject, err := reqInvoker.SendSnsObjectDetailRequest(snsObjID)
if err != nil {
baseutils.PrintLog("WXSnsTransTask.doFavTask - SendSnsObjectDetailRequest err: " + err.Error())
return vo.NewFail("操作失败!" + err.Error())
}
//放入消息队例
currentTaskMgr := iwxConnect.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentSnsTransTask := taskMgr.GetSnsTransTask()
// 转发朋友圈
err = currentSnsTransTask.DoSnsTransTask(snsObject, defines.MTaskTypeFavTrans, m.BlackList, m.Location, m.LocationVal)
if err == nil {
// 如果转发收藏成功则删除
return vo.NewSuccessObj("ok", "转发成功!")
}
return vo.NewFail("操作失败!" + err.Error())
})
}
// 获取收藏朋友圈详情
func GetCollectCircleService(queryKey string, m req.SendFavItemCircle) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 获取指定的朋友圈
objIDString := baseutils.GetNumberString(m.SourceID)
snsObjID, _ := strconv.ParseUint(objIDString, 10, 64)
snsObject, err := reqInvoker.SendSnsObjectDetailRequest(snsObjID)
if err != nil {
baseutils.PrintLog("WXSnsTransTask.doFavTask - SendSnsObjectDetailRequest err: " + err.Error())
return vo.NewFail("操作失败!" + err.Error())
}
return vo.NewSuccessObj(snsObject, "操作成功!")
})
}
// SetBackgroundImageApi 设置朋友圈图片
func SetBackgroundImageService(queryKey string, m req.SetBackgroundImageModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//习近平
content := fmt.Sprintf("<TimelineObject><id><![CDATA[0]]></id><username><![CDATA[%s]]></username><createTime><![CDATA[0]]></createTime><contentDescShowType>0</contentDescShowType><contentDescScene>0</contentDescScene><private><![CDATA[0]]></private><contentDesc></contentDesc><contentattr><![CDATA[0]]></contentattr><sourceUserName></sourceUserName><sourceNickName></sourceNickName><statisticsData></statisticsData><weappInfo><appUserName></appUserName><pagePath></pagePath></weappInfo><canvasInfoXml></canvasInfoXml><location poiClickableStatus=\"0\" poiClassifyId=\"\" poiScale=\"0\" longitude=\"0.0\" city=\"\" poiName=\"\" latitude=\"0.0\" poiClassifyType=\"0\" poiAddress=\"\" ></location><ContentObject><contentStyle><![CDATA[7]]></contentStyle><contentSubStyle><![CDATA[0]]></contentSubStyle><title>&#x0A;&#x0A;&#x0A;</title><description></description><contentUrl></contentUrl><mediaList><media><id><![CDATA[0]]></id><type><![CDATA[2]]></type><title></title><description></description><private><![CDATA[0]]></private><url type=\"1\" ><![CDATA[%s]]></url><thumb type=\"1\" ><![CDATA[%s]]></thumb>", wxAccount.GetUserInfo().WxId, m.Url, m.Url)
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
snsPostItem := baseinfo.SnsPostItem{
Content: content,
Xml: true,
MediaList: make([]*baseinfo.SnsMediaItem, 0),
}
resp, err := reqInvoker.SendSnsPostRequestNew(&snsPostItem)
if err != nil {
return vo.NewFail("操作失败!" + err.Error())
}
return vo.NewSuccessObj(resp, "操作成功!")
})
}
// 下载视频
func DownloadMediaService(queryKey string, req req.DownloadMediaModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
tmpEncKey, _ := strconv.Atoi(req.Key)
videoData, err := reqInvoker.SendCdnSnsVideoDownloadReuqest(uint64(tmpEncKey), req.URL)
if err != nil {
return vo.NewFail("下载失败!" + err.Error())
}
return vo.NewSuccessObj(videoData, "下载成功!")
})
}
// 设置朋友圈可见天数
func SetFriendCircleDaysService(queryKey string, postItem req.SetFriendCircleDaysModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SetFriendCircleDays(&postItem)
if err != nil {
return vo.NewFail("设置朋友圈可见天数失败!" + err.Error())
}
return vo.NewSuccessObj("ok", "设置朋友圈可见天数成功!")
})
}
// SendFriendCircle发送朋友圈
func SendFriendCircleService(queryKey string, postItem req.SnsPostItemModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
snsPostItem := baseinfo.SnsPostItem{
MediaList: make([]*baseinfo.SnsMediaItem, 0),
}
//对结构体进行复制
StructCopy(&snsPostItem, &postItem)
if postItem.LocationInfo != nil {
snsPostItem.LocationInfo = (*baseinfo.SnsLocationInfo)(postItem.LocationInfo)
}
if len(postItem.MediaList) > 0 {
for _, item := range postItem.MediaList {
var snsMediaItem baseinfo.SnsMediaItem
StructCopy(&snsMediaItem, item)
snsPostItem.MediaList = append(snsPostItem.MediaList, &snsMediaItem)
}
}
resp, err := reqInvoker.SendSnsPostRequestNew(&snsPostItem)
if err != nil {
return vo.NewFail("发送朋友圈失败!" + err.Error())
}
return vo.NewSuccessObj(resp, "发送朋友圈成功!")
})
}
// SendFriendCircleByXMlService 根据XML发送朋友圈
func SendFriendCircleByXMlService(queryKey string, postItem baseinfo.TimelineObject) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendSnsPostRequestByXML(&postItem, []string{})
if err != nil {
return vo.NewFail("发送朋友圈失败!" + err.Error())
}
return vo.NewSuccessObj(nil, "发送朋友圈成功!")
})
}
// UploadFriendCircleImagesService 上传朋友圈图片
func UploadFriendCircleImageService(queryKey string, m req.UploadFriendCircleModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
uploadRespArray := garray.New(true)
wg := new(sync.WaitGroup)
if len(m.ImageDataList) <= 0 {
return vo.NewFail("没有要上传的图片!")
}
for _, imageData := range m.ImageDataList {
sImageBase := strings.Split(imageData, ",")
if len(sImageBase) > 1 {
imageData = sImageBase[1]
}
imageBuffer, _ := base64.StdEncoding.DecodeString(imageData)
//生成一个Md5
imageId := baseutils.Md5ValueByte(imageBuffer, false)
fmt.Println(imageId)
//查询数据库是否存在该Id
//上传图片
wg.Add(1)
go func(image []byte, id string) {
defer wg.Done()
upImageResp, err := reqInvoker.SendCdnSnsUploadImageReuqest(image)
if err != nil {
uploadRespArray.Append(gin.H{
"imageId": imageId,
"errMgs": err.Error(),
})
} else {
uploadRespArray.Append(gin.H{
"imageId": imageId,
"resp": upImageResp,
})
}
}(imageBuffer, imageId)
}
wg.Wait()
return vo.NewSuccessObj(uploadRespArray.Interfaces(), "")
})
}
// SendSnsObjectOpRequestService 朋友圈操作
func SendSnsObjectOpRequestService(queryKey string, m req.SendSnsObjectOpRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
if len(m.SnsObjectOpList) <= 0 {
return vo.NewFail("没有要操作的Id")
}
opItems := make([]*baseinfo.SnsObjectOpItem, 0)
for _, item := range m.SnsObjectOpList {
var opItem baseinfo.SnsObjectOpItem
StructCopy(&opItem, &item)
opItems = append(opItems, &opItem)
}
resp, err := reqInvoker.SendSnsObjectOpRequest(opItems)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// SendSnsCommentRequestService 点赞/评论
func SendSnsCommentRequestService(queryKey string, m req.SendSnsCommentRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
respArray := garray.New(true)
wg := new(sync.WaitGroup)
if len(m.SnsCommentList) <= 0 {
return vo.NewFail("没有数据!")
}
for _, item := range m.SnsCommentList {
commItem := &baseinfo.SnsCommentItem{}
if item.OpType == baseinfo.MMSnsCommentTypeLike { //点赞
id, _ := strconv.ParseUint(item.ItemID, 0, 64)
commItem = clientsdk.CreateSnsCommentLikeItem(id, item.ToUserName)
} else if item.OpType == baseinfo.MMSnsCommentTypeComment { // 评论
//oldDevieType:=wxAccount.GetUserInfo().DeviceInfo.OsType
//wxAccount.GetUserInfo().DeviceInfo.OsType="wechat"
//_=reqInvoker.SendAutoAuthRequest()
/*defer func() {
wxAccount.GetUserInfo().DeviceInfo.OsType=oldDevieType
_=reqInvoker.SendAutoAuthRequest()
}()*/
//评论能用
if m.Tx {
item.Content = item.Content + "\n\n~~~~~~~~~~\n每日一练习,\n大大有进步"
}
id, _ := strconv.ParseUint(item.ItemID, 0, 64)
commItem = clientsdk.CreateSnsCommentItem(id, item.ToUserName, item.Content, nil)
commItem.ReplyItem = &baseinfo.ReplyCommentItem{}
StructCopy(commItem.ReplyItem, &item.ReplyItem)
}
wg.Add(1)
go func(commentItem *baseinfo.SnsCommentItem) {
defer wg.Done()
err := reqInvoker.SendSnsCommentRequest(commentItem)
if err != nil {
respArray.Append(gin.H{
"data": commentItem,
"isCommentSuccess": false,
"errMsg": err.Error(),
})
} else {
respArray.Append(gin.H{
"data": commentItem,
"isCommentSuccess": true,
"errMsg": "",
})
}
}(commItem)
}
wg.Wait()
return vo.NewSuccessObj(respArray.Interfaces(), "")
})
}
// GetSnsSyncService 同步朋友圈
func GetSnsSyncService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := connect.GetWXAccount()
userInfo := wxAccount.GetUserInfo()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !connect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := connect.GetWXReqInvoker()
snsSyncResp, err := reqInvoker.SendSnsSyncRequest(false)
if err != nil {
return vo.NewFail("GetSnsSyncService err:" + err.Error())
}
// 如果请求失败
retCode := snsSyncResp.GetBaseResponse().GetRet()
errMsg := snsSyncResp.GetBaseResponse().GetErrMsg().GetStr()
if retCode != baseinfo.MMOk {
return vo.NewFail("WXSnsSyncRouter err:" + strconv.Itoa(int(retCode)) + " msg = " + errMsg)
}
// 更新 key
userInfo.SnsSyncKey = snsSyncResp.GetKeyBuf().GetBuffer()
// 遍历同步到的朋友圈
tmpCmdList := snsSyncResp.GetCmdList()
tmpCount := tmpCmdList.GetCount()
// 定义正则表达式,用于匹配<TimelineObject>...</TimelineObject>之间的内容
re := regexp.MustCompile(`<TimelineObject>.*?</TimelineObject>`)
snsItems := make([]baseinfo.SnsSyncItem, 0)
if tmpCount > 0 {
itemList := snsSyncResp.GetCmdList().GetItemList()
for _, item := range itemList {
snsItem := baseinfo.SnsSyncItem{
CmdId: item.GetCmdId(),
}
tmpTimeLineObj := &baseinfo.TimelineObject{}
tmpTimeLineData := re.FindString(string(item.CmdBuf.Data))
// 反序列化 TimeLineXML
err := xmltool.Unmarshal([]byte(tmpTimeLineData), &tmpTimeLineObj)
if err != nil {
log.Println("GetSnsSyncService Parse TimeLineXML - xml.Unmarshal err:", err)
}
snsItem.TimelineInfo = *tmpTimeLineObj
snsItems = append(snsItems, snsItem)
}
}
resp := baseinfo.SnsSyncResp{
ContinueFlag: snsSyncResp.GetContinueFlag(),
SnsSyncKey: userInfo.SnsSyncKey,
SnsCount: tmpCount,
SnsItems: snsItems,
}
return vo.NewSuccessObj(resp, "")
})
}
// CdnSnsVideoUploadService 上传CDN朋友圈视频服务
func CdnSnsVideoUploadService(queryKey string, m req.CdnSnsVideoUploadModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
//取基本信息
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
//获取请求管理器
reqInvoker := iwxConnect.GetWXReqInvoker()
// 解码base64数据
videoData, err := base64.StdEncoding.DecodeString(m.VideoData)
if err != nil {
return vo.NewFail("视频数据解析失败!" + err.Error())
}
thumbData, err := base64.StdEncoding.DecodeString(m.ThumbData)
if err != nil {
return vo.NewFail("缩略图数据解析失败!" + err.Error())
}
//上传朋友圈视频
resp, err := reqInvoker.SendCdnSnsVideoUploadReuqest(videoData, thumbData)
if err != nil {
return vo.NewFail("上传朋友圈视频失败!" + err.Error())
}
return vo.NewSuccessObj(resp, "上传朋友圈视频成功")
})
}
+552
View File
@@ -0,0 +1,552 @@
package service
import (
"encoding/hex"
"fmt"
"strconv"
"time"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/clientsdk/baseutils"
"xiawan/wx/clientsdk/proxynet"
"xiawan/wx/db"
"xiawan/wx/db/table"
"xiawan/wx/protobuf/wechat"
"xiawan/wx/srv/wxcore"
"xiawan/wx/srv/wxface"
"github.com/gin-gonic/gin"
"github.com/gogo/protobuf/proto"
)
// logOutService 退出登录
func LogOutService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
// 在退出登录前,先清理WebSocket连接
currentTaskMgr := connect.GetWXTaskMgr()
if taskMgr, ok := currentTaskMgr.(*wxcore.WXTaskMgr); ok {
wsTask := taskMgr.SocketMsgTask
userUUID := wxAccount.GetUserInfo().UUID
// 清理WebSocket连接
existingConn := wsTask.GetWebSocket(userUUID)
if existingConn != nil {
fmt.Println("退出登录时清理WebSocket连接:", userUUID)
existingConn.Close()
wsTask.DeleteWebSocket(userUUID)
}
// 禁用WebSocket功能
wsTask.SetWebSocketEnabled(false)
}
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendLogoutRequest()
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccess(gin.H{}, "退出成功!")
})
}
// SendDelContactService 删除好友
func SendDelContactService(queryKey string, m req.DelContactModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendDelContactRequest(m.DelUserName)
if err != nil {
return vo.NewFail(err.Error())
}
return vo.NewSuccess(gin.H{}, "删除成功!")
})
}
// OnlineInfoService 获取登录设备信息
func OnlineInfoService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendOnlineInfo()
if err != nil {
return vo.NewFail(err.Error())
}
deviceInfoList := make([]gin.H, 0)
for _, deviceInfo := range resp.GetOnlineList() {
deviceInfoList = append(deviceInfoList, gin.H{
"deviceType": deviceInfo.GetDeviceType(),
"deviceId": hex.EncodeToString(deviceInfo.GetDeviceID()),
"clientKey": deviceInfo.GetClientKey(),
"onlineStatus": deviceInfo.GetOnlineStatus(),
})
}
return vo.NewSuccessObj(gin.H{
"onlineCount": resp.GetOnlineCount(),
"onlineList": deviceInfoList,
}, "")
})
}
// GetProfileService 获取个人资料详细信息
func GetProfileService(queryKey string) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
} else if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("账号离线,自动上线失败!loginState == " + strconv.Itoa(int(wxAccount.GetLoginState())))
}
reqInvoker := iwxConnect.GetWXReqInvoker()
/*err := reqInvoker.SendGetProfileRequest()
if err != nil {
return vo.NewFail("获取个人资料失败")
}*/
profile, err := reqInvoker.SendGetProfileNewRequest()
if err != nil {
return vo.NewFail("获取个人资料失败")
}
return vo.NewSuccessObj(profile, "")
})
}
// SendModifyUserInfoRequest 修改资料
func SendModifyUserInfoRequestService(queryKey string, m req.ModifyUserInfo) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendModifyUserInfoRequest(m.City, m.Country, m.NickName, m.Province, m.Signature, m.Sex, m.InitFlag)
if err != nil {
return vo.NewFail("修改资料失败!")
}
return vo.NewSuccessObj(nil, "修改资料成功!")
})
}
// 修改名称
func UpdateNickNameService(queryKey string, m req.UpdateNickNameModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendUpdateNickNameRequest(m.Scene, m.Val)
if err != nil {
return vo.NewFail("修改名称失败!")
}
return vo.NewSuccessObj(nil, "修改成功!")
})
}
// 设置名称
func SetNickNameService(queryKey string, m req.UpdateNickNameModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SendUpdateNickNameRequest(m.Scene, m.Val)
if err != nil {
return vo.NewFail("修改失败!")
}
return vo.NewSuccessObj(nil, "修改成功!")
})
}
// 修改姓别
func SetSexService(queryKey string, m req.UpdateSexModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !connect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := connect.GetWXReqInvoker()
err := reqInvoker.SetSexService(m.Sex, m.Country, m.City, m.Province)
if err != nil {
return vo.NewFail("修改失败!")
}
return vo.NewSuccessObj(nil, "修改成功!")
})
}
func GetRedisSyncMsgService(queryKey string) 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()
resp, err := reqInvoker.SendWxSyncMsg(queryKey)
// 如果没有同步到数据则返回
cmdList := resp.GetCmdList()
syncCount := cmdList.GetCount()
messageResp := new(table.SyncMessageResponse)
// 遍历同步的信息和群
itemList := cmdList.GetItemList()
for index := uint32(0); index < syncCount; index++ {
item := itemList[index]
itemID := item.GetCmdId()
// 同步到消息
if itemID == baseinfo.CmdIDAddMsg {
addMsg := &wechat.AddMsg{}
err := proto.Unmarshal(item.CmdBuf.Data, addMsg)
if err != nil {
baseutils.PrintLog(err.Error())
continue
}
}
messageResp.SetMessage(item.GetCmdBuf().GetData(), int32(itemID))
}
//发布同步信息消息
if err != nil {
return vo.NewFail(err.Error())
}
messageResp.Key = resp.KeyBuf
return vo.NewSuccessObj(*messageResp, "成功")
})
}
// SendChangePwdRequestService 更改密码
func SendChangePwdRequestService(queryKey string, m req.SendChangePwdRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.SendChangePwdRequest(m.OldPass, m.NewPass, m.OpCode)
if err != nil {
return vo.NewFail("SendChangePwdRequestService err:" + err.Error())
}
return vo.NewSuccessObj(resp, "")
})
}
// 上传头像
func UploadHeadImageService(queryKey string, m req.UploadHeadImageModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
resp, err := reqInvoker.UploadHeadImage(m.Base64)
if err != nil {
return vo.NewFail("SendChangePwdRequestService err:" + err.Error())
}
return vo.NewSuccessObj(resp, "成功")
})
}
// endModifyRemarkRequestService 修改备注
func SendModifyRemarkRequestService(queryKey string, m req.SendModifyRemarkRequestModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
err := reqInvoker.SendModifyRemarkRequest(m.UserName, m.RemarkName)
if err != nil {
return vo.NewFail("SendChangePwdRequestService err:" + err.Error())
}
return vo.NewSuccessObj(nil, "成功")
})
}
// UpdateAutoPassService 修改加好友需要验证属性
func UpdateAutoPassService(queryKey string, m req.UpdateAutopassModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
err := reqInvoker.UpdateAutopassRequest(m.SwitchType)
if err != nil {
return vo.NewFail("UpdateAutoPassService err:" + err.Error())
}
return vo.NewSuccessObj(nil, "成功")
})
}
// 设置微信号
func SetWechatService(queryKey string, m req.AlisaModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
rsp, err := reqInvoker.SetWechatRequest(m.Alisa)
if err != nil {
return vo.NewFail("UpdateAutoPassService err:" + err.Error())
}
return vo.NewSuccessObj(rsp, "成功")
})
}
// 修改步数
func UpdateStepNumberService(queryKey string, m req.UpdateStepNumberModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
rsp, err := reqInvoker.UpdateStepNumberRequest(m.Number)
if err != nil {
return vo.NewFail("UpdateStepNumberService err:" + err.Error())
}
return vo.NewSuccessObj(rsp, "成功")
})
}
// 获取步数
func GetUserRankLikeCountService(queryKey string, m req.UserRankLikeModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
rsp, err := reqInvoker.SendGetUserRankLikeCountRequest(m.RankId)
if err != nil {
return vo.NewFail("UpdateStepNumberService err:" + err.Error())
}
return vo.NewSuccessObj(rsp, "成功")
})
}
// 设置添加我的方式
func SetFunctionSwitchService(queryKey string, m req.WxFunctionSwitchModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
req := &wechat.FunctionSwitch{
FunctionId: proto.Uint32(m.Function),
SwitchValue: proto.Uint32(m.Value),
}
buffer, err := proto.Marshal(req)
cmdItem := baseinfo.ModifyItem{
CmdID: 0x17,
Len: uint32(len(buffer)),
Data: buffer,
}
var cmdItems []*baseinfo.ModifyItem
cmdItems = append(cmdItems, &cmdItem)
err = reqInvoker.SendOplogRequest(cmdItems)
if err != nil {
return vo.NewFail("SetFunctionSwitchService err:" + err.Error())
}
return vo.NewSuccessObj("ok", "成功")
})
}
// 设置拍一拍名称
func SetSendPatService(queryKey string, m req.SetSendPatModel) vo.DTO {
return checkExIdPerformNoCreateConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := iwxConnect.GetWXAccount()
loginState := wxAccount.GetLoginState()
//判断在线情况
if !iwxConnect.CheckOnLineStatus() {
return vo.NewFail("你已退出登录")
} else if loginState == baseinfo.MMLoginStateNoLogin {
return vo.NewFail("该账号需要重新登录!loginState == MMLoginStateNoLogin ")
}
reqInvoker := iwxConnect.GetWXReqInvoker()
req := &wechat.PatMod{
Value: proto.Int64(8),
Name: proto.String(m.Value),
}
buffer, err := proto.Marshal(req)
cmdItem := baseinfo.ModifyItem{
CmdID: 222,
Len: uint32(len(buffer)),
Data: buffer,
}
var cmdItems []*baseinfo.ModifyItem
cmdItems = append(cmdItems, &cmdItem)
err = reqInvoker.SendOplogRequest(cmdItems)
if err != nil {
return vo.NewFail("SetSendPatService err:" + err.Error())
}
return vo.NewSuccessObj("ok", "成功")
})
}
// SetProxyService 修改socks5代理
func SetProxyService(queryKey string, model req.GetLoginQrCodeModel) vo.DTO {
key := fmt.Sprintf("%s%s", "wechat:Proxy:", queryKey)
// 判断代理为空,清除 redis 缓存
if len(model.Proxy) == 0 {
//删除缓存
db.DelObj(key)
}
return getExistWxConnect(queryKey, func(iwxConnect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
if iwxConnect == nil {
return vo.NewFail("链接不存在! 但代理缓存已重置!Proxy:【" + model.Proxy + "】")
}
wxAccount := iwxConnect.GetWXAccount()
errMsg := ""
newProxyUrl := ""
oldProxyUrl := wxAccount.GetUserInfo().GetProxyUrl()
// 断开连接后 之后重新使用新代理建立连接
iwxConnect.Stop()
// 等待 500 毫秒
time.Sleep(time.Millisecond * 500)
// 判断是否删除代理
if len(model.Proxy) == 0 {
// 删除代理
wxAccount.GetUserInfo().RemoveProxy()
newProxyUrl = ""
} else {
// 修改代理
proxyInfo := proxynet.ParseWXProxyInfo(model.Proxy)
dialer := proxyInfo.GetDialer()
if dialer != nil {
wxAccount := iwxConnect.GetWXAccount()
wxAccount.GetUserInfo().SetProxy(proxyInfo)
newProxyUrl = wxAccount.GetUserInfo().GetProxyUrl()
} else {
errMsg = "代理链接格式错误, 正确示例:socks5://username:password@ipv4:port"
}
}
if len(errMsg) > 0 {
return vo.NewFail(errMsg)
}
// 重新二次登录
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("设置代理: %v\n", r)
}
}()
// 等 500 毫秒后重新初始化
time.Sleep(time.Millisecond * 500)
InitLoginStatusService(queryKey, false, true, model)
//存redis缓存
error := db.SETObj(key, model)
if error != nil {
}
}()
return vo.NewSuccess(gin.H{
"oldProxyUrl": oldProxyUrl,
"newProxyUrl": newProxyUrl,
}, errMsg)
})
}
+338
View File
@@ -0,0 +1,338 @@
package service
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"xiawan/wx/api/req"
)
type PrecheckRequest struct {
UUID string `json:"uuid"`
Precheck struct {
Ticket string `json:"ticket"`
} `json:"precheck"`
}
type VerifyMethodRequest struct {
UUID string `json:"uuid"`
GetVerifyMethod struct {
Ticket string `json:"ticket"`
} `json:"get_verify_method"`
}
type SubmitPinRequest struct {
UUID string `json:"uuid"`
SubmitPin struct {
Ticket string `json:"ticket"`
Pin string `json:"pin"`
} `json:"submit_pin"`
}
type VerificationcodeParam struct {
Key string
Code string
}
type OuterResponse struct {
Data string `json:"data"`
Status int `json:"status"`
UUID string `json:"uuid"` // 这里是个 JSON 字符串
}
// 定义结构体以匹配返回值
type ResponseData11 struct {
Data string `json:"data"`
Status int `json:"status"`
UUID string `json:"uuid"`
}
func getEncodedUUID(data string) (string, error) {
urlStr := "http://113.44.162.180:5001/get_uuid"
payload := map[string]string{"data": data}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return "", err
}
req, err := http.NewRequest("POST", urlStr, bytes.NewBuffer(payloadBytes))
if err != nil {
return "", err
}
req.Header.Add("Authorization", "Bearer 4282f08a7f1743a06686f1d9dddfa213badb1406de7f6419e135761cca29a2aa")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
return "", err
}
// 先反序列化外层响应
var outerResp OuterResponse
if err := json.Unmarshal(body, &outerResp); err != nil {
return "", fmt.Errorf("unmarshal outer response failed: %w", err)
}
if outerResp.UUID == "" {
return "", fmt.Errorf("outerResp.UUID is empty")
}
// 对 outerResp.UUID 字符串再做一次反序列化
var innerResp ResponseData11
if err := json.Unmarshal([]byte(outerResp.UUID), &innerResp); err != nil {
return "", fmt.Errorf("unmarshal inner UUID json failed: %w", err)
}
if innerResp.UUID == "" {
return "", fmt.Errorf("innerResp.UUID is empty")
}
// URL编码真正的 uuid 字符串
encodedUUID := url.QueryEscape(innerResp.UUID)
return encodedUUID, nil
}
func precheck(uuid, Ticket string) (string, error) {
url := "https://weixin110.qq.com/security/acct/extdevauthslavecgi?t=extdevsignin%2Fslaveverify&ticket=" + Ticket + "&step=precheck&wechat_real_lang=zh_CN"
requestData := PrecheckRequest{
UUID: uuid,
Precheck: struct {
Ticket string `json:"ticket"`
}{
Ticket: Ticket, //3_2d512e8104f3992c5fa8bfa1047ab3bb ios 18.0.1 pc 3_76cdadf7b44f1e05ad8c140ba26dc044
},
}
fmt.Println("我是Ticket", Ticket)
jsonData, err := json.Marshal(requestData)
if err != nil {
return "", err
}
payload := bytes.NewBuffer(jsonData)
req, err := http.NewRequest("POST", url, payload)
if err != nil {
return "", err
}
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/85551")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
var data map[string]interface{}
err = json.Unmarshal(body, &data)
if err != nil {
return "", err
}
ret, ok1 := data["ret"].(float64)
errMsg, ok2 := data["err_msg"].(string)
if ok1 && ok2 && ret == 0 && errMsg == "成功。" {
return res.Header.Get("Set-Cookie"), nil
} else {
return "", nil
}
}
func getVerifyID(uuid, cookie, Ticket string) (string, error) {
url := "https://weixin110.qq.com/security/acct/extdevauthslavecgi?t=extdevsignin/slaveverify&ticket=" + Ticket + "&step=get_verify_method&wechat_real_lang=zh_CN"
requestData := VerifyMethodRequest{
UUID: uuid,
GetVerifyMethod: struct {
Ticket string `json:"ticket"`
}{
Ticket: Ticket,
},
}
jsonData, err := json.Marshal(requestData)
if err != nil {
return "", err
}
payload := bytes.NewBuffer(jsonData)
req, err := http.NewRequest("POST", url, payload)
if err != nil {
return "", err
}
req.Header.Add("Cookie", cookie)
//req.Header.Add("Accept", "*/*")
//req.Header.Add("Accept-Encoding", "gzip, deflate, br")
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/85551")
//req.Header.Add("Connection", "keep-alive")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
var responseData struct {
Data struct {
VerifyID string `json:"verify_id"`
} `json:"data"`
}
err = json.Unmarshal(body, &responseData)
if err != nil {
return "", err
}
if responseData.Data.VerifyID != "" {
return responseData.Data.VerifyID, nil
}
return "", nil
}
func submitPinAndCheck(secverifyid, uuid, pin, Ticket string) (bool, error) {
fmt.Println("--------------------------------\n", "secverifyid:", secverifyid, "\n", "uuid:", uuid, "\n", "pin:", pin, "\n", "Ticket:", Ticket, "\n--------------------------------")
url := "https://weixin110.qq.com/security/acct/commverifypincgi?t=extdevsignin/slaveverify&ticket=" + Ticket + "&step=submit_pin&secverifyid=" + secverifyid + "&wechat_real_lang=zh_CN"
requestData := SubmitPinRequest{
UUID: uuid,
SubmitPin: struct {
Ticket string `json:"ticket"`
Pin string `json:"pin"`
}{
Ticket: Ticket,
Pin: pin,
},
}
jsonData, err := json.Marshal(requestData)
if err != nil {
return false, err
}
payload := bytes.NewBuffer(jsonData)
req, err := http.NewRequest("POST", url, payload)
if err != nil {
return false, err
}
//req.Header.Add("Accept", "*/*")
//req.Header.Add("Accept-Encoding", "gzip, deflate, br")
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/8555")
//req.Header.Add("Connection", "keep-alive")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return false, err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return false, err
}
var responseData struct {
Ret int `json:"ret"`
}
fmt.Println("我是body", string(body))
err = json.Unmarshal(body, &responseData)
if err != nil {
return false, err
}
return responseData.Ret == 0, nil
}
func runAllSteps(data, pin, Ticket string) (req.ResponseResult, error) {
encodedUUID, err := getEncodedUUID(data)
if err != nil {
return req.ResponseResult{}, err
}
fmt.Println("我是encodedUUID", encodedUUID)
if encodedUUID == "" {
return req.ResponseResult{
Code: -1,
Success: false,
Message: "效验失败",
Data: nil,
}, nil
}
setCookie, err := precheck(encodedUUID, Ticket)
if err != nil {
return req.ResponseResult{}, err
}
fmt.Println("我是setCookie", setCookie)
if setCookie == "" {
return req.ResponseResult{
Code: -2,
Success: false,
Message: "效验失败",
Data: nil,
}, nil
}
verifyID, err := getVerifyID(encodedUUID, setCookie, Ticket)
if err != nil {
return req.ResponseResult{}, err
}
fmt.Println("我是verifyID", verifyID)
if verifyID == "" {
return req.ResponseResult{
Code: -3,
Success: false,
Message: "效验失败",
Data: nil,
}, nil
}
success, err := submitPinAndCheck(verifyID, encodedUUID, pin, Ticket)
if err != nil {
return req.ResponseResult{}, err
}
var message string
if success {
message = "验证成功,请调用检测二维码继续登录"
} else {
message = "验证失败"
}
return req.ResponseResult{
Code: 0,
Success: true,
Message: message,
Data: nil,
}, nil
}
func Verificationcode2(Data req.VerifyCodeModel, queryKey string) req.ResponseResult {
connectMgr := WXServer.GetWXConnectMgr()
iwxConnect := connectMgr.GetWXConnectByUserInfoUUID(queryKey)
if iwxConnect == nil {
return req.ResponseResult{
Code: -8,
Success: false,
Message: "用户不存在",
Data: nil,
}
}
temp_userinfo := iwxConnect.GetWXAccount().GetUserInfo()
result, err := runAllSteps(Data.Data62, Data.Code, Data.Ticket)
if err != nil {
fmt.Println(err)
}
if result.Success {
result.Data = temp_userinfo.Ticket
}
return result
}
+341
View File
@@ -0,0 +1,341 @@
// 过mac滑块
package service
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"xiawan/wx/api/req"
)
type PrecheckRequestSlide struct {
UUID string `json:"uuid"`
Precheck struct {
Ticket string `json:"ticket"`
} `json:"precheck"`
}
type VerifyMethodRequestSlide struct {
UUID string `json:"uuid"`
GetVerifyMethod struct {
Ticket string `json:"ticket"`
} `json:"get_verify_method"`
}
type SubmitPinRequestSlide struct {
Appid string `json:"appid"`
Ccdata string `json:"ccdata"`
RandStr string `json:"rand_str"`
Ticket string `json:"ticket"`
UUID string `json:"uuid"`
}
type VerificationcodeParamSlide struct {
Key string
Code string
}
type OuterResponseSlide struct {
Data string `json:"data"`
Status int `json:"status"`
UUID string `json:"uuid"` // 这里是个 JSON 字符串
}
// 定义结构体以匹配返回值
type ResponseData11Slide struct {
Data string `json:"data"`
Status int `json:"status"`
UUID string `json:"uuid"`
}
func getEncodedUUIDSlide(data string) (string, error) {
urlStr := "http://113.44.162.180:5001/get_uuid"
payload := map[string]string{"data": data}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return "", err
}
req, err := http.NewRequest("POST", urlStr, bytes.NewBuffer(payloadBytes))
if err != nil {
return "", err
}
req.Header.Add("Authorization", "Bearer 4282f08a7f1743a06686f1d9dddfa213badb1406de7f6419e135761cca29a2aa")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
return "", err
}
// 先反序列化外层响应
var outerResp OuterResponse
if err := json.Unmarshal(body, &outerResp); err != nil {
return "", fmt.Errorf("unmarshal outer response failed: %w", err)
}
if outerResp.UUID == "" {
return "", fmt.Errorf("outerResp.UUID is empty")
}
// 对 outerResp.UUID 字符串再做一次反序列化
var innerResp ResponseData11Slide
if err := json.Unmarshal([]byte(outerResp.UUID), &innerResp); err != nil {
return "", fmt.Errorf("unmarshal inner UUID json failed: %w", err)
}
if innerResp.UUID == "" {
return "", fmt.Errorf("innerResp.UUID is empty")
}
// URL编码真正的 uuid 字符串
encodedUUID := url.QueryEscape(innerResp.UUID)
return encodedUUID, nil
}
func precheckSlide(uuid, Ticket string) (string, error) {
url := "https://weixin110.qq.com/security/acct/extdevauthslavecgi?t=extdevsignin%2Fslaveverify&ticket=" + Ticket + "&step=precheck&wechat_real_lang=zh_CN"
requestData := PrecheckRequestSlide{
UUID: uuid,
Precheck: struct {
Ticket string `json:"ticket"`
}{
Ticket: Ticket, //3_2d512e8104f3992c5fa8bfa1047ab3bb ios 18.0.1 pc 3_76cdadf7b44f1e05ad8c140ba26dc044
},
}
fmt.Println("我是Ticket", Ticket)
jsonData, err := json.Marshal(requestData)
if err != nil {
return "", err
}
payload := bytes.NewBuffer(jsonData)
req, err := http.NewRequest("POST", url, payload)
if err != nil {
return "", err
}
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/85551")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
var data map[string]interface{}
err = json.Unmarshal(body, &data)
if err != nil {
return "", err
}
ret, ok1 := data["ret"].(float64)
errMsg, ok2 := data["err_msg"].(string)
if ok1 && ok2 && ret == 0 && errMsg == "成功。" {
return res.Header.Get("Set-Cookie"), nil
} else {
return "", nil
}
}
func getVerifyIDSlide(uuid, cookie, Ticket string) (string, error) {
url := "https://weixin110.qq.com/security/acct/extdevauthslavecgi?t=extdevsignin/slaveverify&ticket=" + Ticket + "&step=get_verify_method&wechat_real_lang=zh_CN"
requestData := VerifyMethodRequest{
UUID: uuid,
GetVerifyMethod: struct {
Ticket string `json:"ticket"`
}{
Ticket: Ticket,
},
}
jsonData, err := json.Marshal(requestData)
if err != nil {
return "", err
}
payload := bytes.NewBuffer(jsonData)
req, err := http.NewRequest("POST", url, payload)
if err != nil {
return "", err
}
req.Header.Add("Cookie", cookie)
//req.Header.Add("Accept", "*/*")
//req.Header.Add("Accept-Encoding", "gzip, deflate, br")
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/85551")
//req.Header.Add("Connection", "keep-alive")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
var responseData struct {
Data struct {
VerifyID string `json:"verify_id"`
} `json:"data"`
}
err = json.Unmarshal(body, &responseData)
if err != nil {
return "", err
}
if responseData.Data.VerifyID != "" {
return responseData.Data.VerifyID, nil
}
return "", nil
}
func submitPinAndCheckSlide(secverifyid, uuid, slideTicket, randStr string) (bool, error) {
fmt.Println("--------------------------------\n", "secverifyid:", secverifyid, "\n", "uuid:", uuid, "\n", "slideTicket:", slideTicket, "\n", "randStr:", randStr, "\n--------------------------------")
url := "https://weixin110.qq.com/security/acct/commverifycodecgi?t=extdevsignin/slaveverify&step=verify_capt&secverifyid=" + secverifyid + "&wechat_real_lang=zh_CN&exportkey=&version=9"
requestData := SubmitPinRequestSlide{
UUID: uuid,
Appid: "2078688116",
Ccdata: "",
RandStr: randStr,
Ticket: slideTicket,
}
jsonData, err := json.Marshal(requestData)
if err != nil {
return false, err
}
payload := bytes.NewBuffer(jsonData)
req, err := http.NewRequest("POST", url, payload)
if err != nil {
return false, err
}
//req.Header.Add("Accept", "*/*")
//req.Header.Add("Accept-Encoding", "gzip, deflate, br")
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/8555")
//req.Header.Add("Connection", "keep-alive")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return false, err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return false, err
}
var responseData struct {
Ret int `json:"ret"`
}
fmt.Println("我是body", string(body))
err = json.Unmarshal(body, &responseData)
if err != nil {
return false, err
}
return responseData.Ret == 0, nil
}
func runAllStepsSlide(data, slideTicket, Ticket, randStr string) (req.ResponseResult, error) {
fmt.Println("data", data)
fmt.Println("slideTicket", slideTicket)
fmt.Println("Ticket", Ticket)
fmt.Println("randStr", randStr)
encodedUUID, err := getEncodedUUIDSlide(data)
if err != nil {
return req.ResponseResult{}, err
}
fmt.Println("我是encodedUUID", encodedUUID)
if encodedUUID == "" {
return req.ResponseResult{
Code: -1,
Success: false,
Message: "效验失败",
Data: nil,
}, nil
}
setCookie, err := precheckSlide(encodedUUID, Ticket)
if err != nil {
return req.ResponseResult{}, err
}
fmt.Println("我是setCookie", setCookie)
if setCookie == "" {
return req.ResponseResult{
Code: -2,
Success: false,
Message: "效验失败",
Data: nil,
}, nil
}
verifyID, err := getVerifyIDSlide(encodedUUID, setCookie, Ticket)
if err != nil {
return req.ResponseResult{}, err
}
fmt.Println("我是verifyID", verifyID)
if verifyID == "" {
return req.ResponseResult{
Code: -3,
Success: false,
Message: "效验失败",
Data: nil,
}, nil
}
success, err := submitPinAndCheckSlide(verifyID, encodedUUID, slideTicket, randStr)
if err != nil {
return req.ResponseResult{}, err
}
var message string
if success {
message = "验证成功,请调用检测二维码继续登录"
} else {
message = "验证失败"
}
return req.ResponseResult{
Code: 0,
Success: true,
Message: message,
Data: nil,
}, nil
}
func VerificationcodeSlide(Data req.SlideTicketModel) req.ResponseResult {
// connectMgr := WXServer.GetWXConnectMgr()
// iwxConnect := connectMgr.GetWXConnectByUserInfoUUID(queryKey)
// if iwxConnect == nil {
// return req.ResponseResult{
// Code: -8,
// Success: false,
// Message: "用户不存在",
// Data: nil,
// }
// }
// temp_userinfo := iwxConnect.GetWXAccount().GetUserInfo()
result, err := runAllStepsSlide(Data.Data62, Data.SlideTicket, Data.Ticket, Data.RandStr)
if err != nil {
fmt.Println(err)
}
// if result.Success {
// result.Data = temp_userinfo.Ticket
// }
return result
}
+244
View File
@@ -0,0 +1,244 @@
package service
import (
"encoding/json"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/db"
"github.com/gin-gonic/gin"
)
// SetWelcomeService 设置欢迎词配置
func SetWelcomeService(queryKey string, m req.SetWelcomeModel) vo.DTO {
// 获取现有配置,保留群聊列表
existingConfig := req.WelcomeConfig{
ChatRooms: []string{},
}
command, err := db.QueryCommand(queryKey)
if err == nil && command.B003Str != "" {
err = json.Unmarshal([]byte(command.B003Str), &existingConfig)
if err != nil {
// 解析失败,使用空列表
existingConfig.ChatRooms = []string{}
}
}
// 保留现有群聊列表
m.Config.ChatRooms = existingConfig.ChatRooms
// 将欢迎词配置转换为JSON字符串
configJSON, err := json.Marshal(m.Config)
if err != nil {
return vo.NewFail("序列化欢迎词配置失败")
}
// 更新B003和B003Str
enable := 0
if m.Config.Enable {
enable = 1
}
_, err = db.UpdateCommand(queryKey, "B003", enable, "")
if err != nil {
return vo.NewFail("更新欢迎词状态失败")
}
_, err = db.UpdateCommand(queryKey, "B003Str", 0, string(configJSON))
if err != nil {
return vo.NewFail("更新欢迎词配置失败")
}
return vo.NewSuccess(nil, "设置成功")
}
// GetWelcomeService 获取欢迎词配置
func GetWelcomeService(queryKey string) vo.DTO {
command, err := db.QueryCommand(queryKey)
if err != nil {
return vo.NewFail("查询欢迎词配置失败")
}
var config req.WelcomeConfig
if command.B003Str != "" {
err = json.Unmarshal([]byte(command.B003Str), &config)
if err != nil {
return vo.NewFail("解析欢迎词配置失败")
}
}
// 设置启用状态
config.Enable = command.B003 == 1
return vo.NewSuccess(gin.H{
"config": config,
}, "获取成功")
}
// SetAdminKeywordService 设置管理员关键词配置
func SetAdminKeywordService(queryKey string, m req.SetAdminKeywordModel) vo.DTO {
// 将管理员关键词配置转换为JSON字符串
configJSON, err := json.Marshal(m.Config)
if err != nil {
return vo.NewFail("序列化管理员关键词配置失败")
}
// 更新B004和B004Str
enable := 0
if m.Config.Enable {
enable = 1
}
_, err = db.UpdateCommand(queryKey, "B004", enable, "")
if err != nil {
return vo.NewFail("更新管理员关键词状态失败")
}
_, err = db.UpdateCommand(queryKey, "B004Str", 0, string(configJSON))
if err != nil {
return vo.NewFail("更新管理员关键词配置失败")
}
return vo.NewSuccess(nil, "设置成功")
}
// GetAdminKeywordService 获取管理员关键词配置
func GetAdminKeywordService(queryKey string) vo.DTO {
command, err := db.QueryCommand(queryKey)
if err != nil {
return vo.NewFail("查询管理员关键词配置失败")
}
var config req.AdminKeywordConfig
if command.B004Str != "" {
err = json.Unmarshal([]byte(command.B004Str), &config)
if err != nil {
return vo.NewFail("解析管理员关键词配置失败")
}
}
// 设置启用状态
config.Enable = command.B004 == 1
return vo.NewSuccess(gin.H{
"config": config,
}, "获取成功")
}
// SetKickKeywordService 设置踢人关键词配置
func SetKickKeywordService(queryKey string, m req.SetKickKeywordModel) vo.DTO {
// 将踢人关键词配置转换为JSON字符串
configJSON, err := json.Marshal(m.Config)
if err != nil {
return vo.NewFail("序列化踢人关键词配置失败")
}
// 更新B006和B006Str
enable := 0
if m.Config.Enable {
enable = 1
}
_, err = db.UpdateCommand(queryKey, "B006", enable, "")
if err != nil {
return vo.NewFail("更新踢人关键词状态失败")
}
_, err = db.UpdateCommand(queryKey, "B006Str", 0, string(configJSON))
if err != nil {
return vo.NewFail("更新踢人关键词配置失败")
}
return vo.NewSuccess(nil, "设置成功")
}
// GetKickKeywordService 获取踢人关键词配置
func GetKickKeywordService(queryKey string) vo.DTO {
command, err := db.QueryCommand(queryKey)
if err != nil {
return vo.NewFail("查询踢人关键词配置失败")
}
var config req.KickKeywordConfig
if command.B006Str != "" {
err = json.Unmarshal([]byte(command.B006Str), &config)
if err != nil {
return vo.NewFail("解析踢人关键词配置失败")
}
}
// 设置启用状态
config.Enable = command.B006 == 1
return vo.NewSuccess(gin.H{
"config": config,
}, "获取成功")
}
// SetInviteKeywordService 设置关键词邀请入群配置
func SetInviteKeywordService(queryKey string, m req.SetInviteKeywordModel) vo.DTO {
// 获取现有配置,保留已设置的关键词对
existingConfig := req.InviteKeywordConfig{
Pairs: []req.InviteKeywordPair{},
}
command, err := db.QueryCommand(queryKey)
if err == nil && command.B005Str != "" {
err = json.Unmarshal([]byte(command.B005Str), &existingConfig)
if err != nil {
// 解析失败,使用空列表
existingConfig.Pairs = []req.InviteKeywordPair{}
}
}
// 保留现有关键词对列表
m.Config.Pairs = existingConfig.Pairs
// 将关键词邀请入群配置转换为JSON字符串
configJSON, err := json.Marshal(m.Config)
if err != nil {
return vo.NewFail("序列化关键词邀请入群配置失败")
}
// 更新B005和B005Str
enable := 0
if m.Config.Enable {
enable = 1
}
_, err = db.UpdateCommand(queryKey, "B005", enable, "")
if err != nil {
return vo.NewFail("更新关键词邀请入群状态失败")
}
_, err = db.UpdateCommand(queryKey, "B005Str", 0, string(configJSON))
if err != nil {
return vo.NewFail("更新关键词邀请入群配置失败")
}
return vo.NewSuccess(nil, "设置成功")
}
// GetInviteKeywordService 获取关键词邀请入群配置
func GetInviteKeywordService(queryKey string) vo.DTO {
command, err := db.QueryCommand(queryKey)
if err != nil {
return vo.NewFail("查询关键词邀请入群配置失败")
}
var config req.InviteKeywordConfig
if command.B005Str != "" {
err = json.Unmarshal([]byte(command.B005Str), &config)
if err != nil {
return vo.NewFail("解析关键词邀请入群配置失败")
}
}
// 设置启用状态
config.Enable = command.B005 == 1
return vo.NewSuccess(gin.H{
"config": config,
}, "获取成功")
}