first commit
This commit is contained in:
@@ -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, "查询成功")
|
||||
}
|
||||
@@ -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, "")
|
||||
})
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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, "设置成功!")
|
||||
})
|
||||
}
|
||||
@@ -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("FavSyncService!err :" + 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("FavSyncService!err :" + 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("BatchDelFavItemService!err :" + 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("GetFavInfoService!err :" + 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("GetFavInfoService!err :" + err.Error())
|
||||
}
|
||||
return vo.NewSuccessObj(resp, "")
|
||||
})
|
||||
}
|
||||
@@ -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, "上传文件成功")
|
||||
})
|
||||
}
|
||||
@@ -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("GetFinderSearchService!err :" + 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("FinderUserPrepareService!err :" + 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("FinderUserPrepareService!err :" + err.Error())
|
||||
}
|
||||
return vo.NewSuccessObj(resp, "")
|
||||
})
|
||||
}
|
||||
@@ -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, "")
|
||||
})
|
||||
}
|
||||
@@ -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, "任务启动成功")
|
||||
})
|
||||
}
|
||||
@@ -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("GetQrCode!err :" + 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("InviteChatroomMembersService!err :" + 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("InviteChatroomMembersService!err :" + 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("InviteChatroomMembersService!err :" + 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("InviteChatroomMembersService!err :" + 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("SendAddChatroomAdminRequest!err :" + 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("SendDelChatroomAdminRequest!err :" + err.Error())
|
||||
}
|
||||
return vo.NewSuccessObj(resp, "")
|
||||
})
|
||||
}
|
||||
@@ -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,
|
||||
}, "获取成功")
|
||||
}
|
||||
@@ -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
@@ -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, "操作成功!")
|
||||
})
|
||||
}
|
||||
@@ -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, "")
|
||||
})
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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, "操作成功")
|
||||
})
|
||||
}
|
||||
@@ -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>


</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, "上传朋友圈视频成功")
|
||||
})
|
||||
}
|
||||
@@ -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)
|
||||
})
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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,
|
||||
}, "获取成功")
|
||||
}
|
||||
Reference in New Issue
Block a user