Files
wechat_ipad_pro/api/controller/loginController.go

438 lines
12 KiB
Go

package controller
import (
"errors"
"fmt"
"math/rand"
"net/http"
"os"
"strings"
"time"
"xiawan/wx/api/req"
"xiawan/wx/api/service"
"xiawan/wx/api/vo"
"xiawan/wx/clientsdk/baseutils"
"xiawan/wx/db"
"github.com/gin-gonic/gin"
"github.com/gogf/guuid"
)
func init() {
rand.Seed(time.Now().UnixNano())
}
// 检查请求参数 key 对应的 license 是否可用
func checkLicense(ctx *gin.Context) (string, error) {
queryKey, isExist := ctx.GetQuery("key")
errMsg := fmt.Sprintf("%s 该 key 无效! 请 检查正确性 或 联系管理员生成", queryKey)
if !isExist || 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 "", errors.New(fmt.Sprintf("%s 该 key 已过期!", queryKey))
}
// license 可用
return queryKey, nil
}
// GetLoginQrCodeTempShow HTML展示登录二维码
func GetLoginQrCodeTempShow(ctx *gin.Context) {
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
//获取二维码
qrcodeResponse, dto := service.GetLoginQrCodeShow(queryKey)
// 二维码写入到文件
baseutils.WriteToFile(qrcodeResponse.GetQrcode().GetSrc(), "static/qrcode/"+qrcodeResponse.GetUuid()+".png")
// 延时删除图片
go func() {
time.Sleep(time.Second * 10)
err := os.Remove("static/qrcode/" + qrcodeResponse.GetUuid() + ".png")
if err != nil {
return
}
}()
if dto.Code == vo.SUCCESS {
ctx.HTML(http.StatusOK, "login.tmpl", gin.H{"img": qrcodeResponse.GetUuid()})
} else {
ctx.HTML(http.StatusOK, "err.tmpl", gin.H{"showlog": dto})
}
}
// GetLoginQrCodeNewApi 获取登录二维码-iPad(异地IP必须用代理! socks5://username:password@ipv4:port)
func GetLoginQrCodeNewApi(ctx *gin.Context) {
reqModel := new(req.GetLoginQrCodeModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.GetLoginQrCodeNewService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// GetLoginQrCodeNewApi 获取登录二维码-直登(异地IP必须用代理! socks5://username:password@ipv4:port)
func GetLoginQrCodeNewApiDirect(ctx *gin.Context) {
reqModel := new(req.GetLoginQrCodeModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.GetLoginQrCodeNewServiceDirect(queryKey, *reqModel, reqModel.IpadOrmac)
ctx.JSON(http.StatusOK, result)
}
// WxBindOpMobileForRegApi 获取验证码
func WxBindOpMobileForRegApi(ctx *gin.Context) {
reqModel := new(req.WxBindOpMobileForModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.WxBindOpMobileForRegService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// Get62DataApi 提取62数据
func Get62DataApi(ctx *gin.Context) {
queryKey, isExist := ctx.GetQuery("key")
if !isExist {
queryKey = guuid.New().String()
}
result := service.Get62DataService(queryKey)
ctx.JSON(http.StatusOK, result)
}
// PhoneDeviceLoginApi 辅助新手机登录
func PhoneDeviceLoginApi(ctx *gin.Context) {
reqModel := new(req.PhoneLoginModel)
queryKey, isExist := ctx.GetQuery("key")
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
//确保每次都有Key
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.PhoneDeviceLoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// DeviceIdLoginApi 62账号密码登录
func DeviceIdLoginApi(ctx *gin.Context) {
reqModel := new(req.DeviceIdLoginModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.DeviceIdLoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// SmsLoginApi 短信登录
func SmsLoginApi(ctx *gin.Context) {
reqModel := new(req.DeviceIdLoginModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
reqModel.Password = "strdm@," + reqModel.Password
result := service.SmsLoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// A16LoginApi A16数据登录
func A16LoginApi(ctx *gin.Context) {
reqModel := new(req.DeviceIdLoginModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.A16LoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// LoginNewApi 62LoginNew新疆号登录
func LoginNewApi(ctx *gin.Context) {
reqModel := new(req.DeviceIdLoginModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
reqModel.Type = 1
result := service.A16LoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// CheckLoginStatusApi 检测扫码状态
func CheckLoginStatusApi(ctx *gin.Context) {
queryKey, isExist := ctx.GetQuery("key")
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
//确保每次都有Key
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
return
}
result := service.CheckLoginQrCodeStatusService(queryKey)
ctx.JSON(http.StatusOK, result)
}
// GetInItStatusApi 初始化状态
func GetInItStatusApi(ctx *gin.Context) {
queryKey, isExist := ctx.GetQuery("key")
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
//确保每次都有Key
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
return
}
result := service.GetInItStatusService(queryKey)
ctx.JSON(http.StatusOK, result)
}
// WakeUpLoginApi 唤醒登录(只限扫码登录)
func WakeUpLoginApi(ctx *gin.Context) {
reqModel := new(req.GetLoginQrCodeModel)
queryKey, isExist := ctx.GetQuery("key")
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
//确保每次都有Key
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
return
}
result := service.WakeUpLoginService(queryKey, reqModel)
ctx.JSON(http.StatusOK, result)
}
// GetLoginStatusApi 获取在线状态
func GetLoginStatusApi(ctx *gin.Context) {
autoLogin := true
queryKey, isExist := ctx.GetQuery("key")
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
//确保每次都有Key
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
return
}
isAutoLogin, isExist := ctx.GetQuery("autoLogin")
if isExist {
if strings.Contains(isAutoLogin, "false") {
autoLogin = false
}
}
result := service.GetLoginStatusService(queryKey, false, autoLogin)
ctx.JSON(http.StatusOK, result)
}
// GetSafetyInfoApi 获取安全设备列表
func GetSafetyInfoApi(ctx *gin.Context) {
queryKey, _ := ctx.GetQuery("key")
result := service.GetSafetyInfoService(queryKey)
ctx.JSON(http.StatusOK, result)
}
// DelSafeDeviceApi 删除安全设备
func DelSafeDeviceApi(ctx *gin.Context) {
reqModel := new(req.DelSafeDeviceModel)
queryKey, _ := ctx.GetQuery("key")
if !validateData(ctx, &reqModel) {
return
}
result := service.DelSafeDeviceService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// GetBoundHardDevice 获取硬件设备情况
func GetBoundHardDevice(ctx *gin.Context) {
queryKey, _ := ctx.GetQuery("key")
result := service.GetBoundHardDeviceService(queryKey)
ctx.JSON(http.StatusOK, result)
}
// CheckCanSetAliasApi 检测微信登录环境
func CheckCanSetAliasApi(ctx *gin.Context) {
queryKey, _ := ctx.GetQuery("key")
result := service.CheckCanSetAliasService(queryKey)
ctx.JSON(http.StatusOK, result)
}
// IWXConnectMgrApi 打印链接数量
func IWXConnectMgrApi(ctx *gin.Context) {
result := service.IWXConnectMgrService()
ctx.JSON(http.StatusOK, result)
}
// GetConnectInfo 打印链接信息
func GetConnectInfo(ctx *gin.Context) {
result := service.GetConnectInfo()
ctx.JSON(http.StatusOK, result)
}
// LogOutRequestApi 退出登录
func LogOutRequestApi(ctx *gin.Context) {
queryKey, isExist := ctx.GetQuery("key")
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
//确保每次都有Key
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
return
}
result := service.LogOutService(queryKey)
ctx.JSON(http.StatusOK, result)
}
// MacLoginApi 获取Mac登录二维码 (异地IP必须用代理 socks5://username:password@ipv4:port)
func MacLoginApi(ctx *gin.Context) {
reqModel := new(req.GetLoginQrCodeModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.MacLoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// AndroidPadLoginApi 获取安卓平板登录二维码 (异地IP必须用代理 socks5://username:password@ipv4:port)
func AndroidPadLoginApi(ctx *gin.Context) {
reqModel := new(req.GetLoginQrCodeModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.AndroidPadLoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// CarLoginApi 获取车载登录二维码 (异地IP必须用代理 socks5://username:password@ipv4:port)
func CarLoginApi(ctx *gin.Context) {
reqModel := new(req.GetLoginQrCodeModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.CarLoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}
// VerifyCodeApi 验证码验证(输入iPad登录验证码)
func VerifyCodeApi(ctx *gin.Context) {
reqModel := new(req.VerifyCodeModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
param := req.VerifyCodeModel{
Code: reqModel.Code,
Data62: reqModel.Data62,
Ticket: reqModel.Ticket,
}
result := service.Verificationcode2(param, queryKey)
ctx.JSON(http.StatusOK, result)
}
// VerifyCodeSlideApi 过mac滑块验证
func VerifyCodeApiSlide(ctx *gin.Context) {
reqModel := new(req.SlideTicketModel)
queryKey, _ := ctx.GetQuery("key")
if queryKey != "408449830" {
ctx.JSON(http.StatusOK, vo.NewFail("key错误"))
return
}
if !validateData(ctx, &reqModel) {
return
}
param := req.SlideTicketModel{
Data62: reqModel.Data62,
Ticket: reqModel.Ticket,
RandStr: reqModel.RandStr,
SlideTicket: reqModel.SlideTicket,
}
result := service.VerificationcodeSlide(param)
ctx.JSON(http.StatusOK, result)
}
// WinLoginService win登录
func WinLoginService(ctx *gin.Context) {
reqModel := new(req.GetLoginQrCodeModel)
queryKey, err := checkLicense(ctx)
if err != nil {
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
return
}
if !validateData(ctx, &reqModel) {
return
}
result := service.WinLoginService(queryKey, *reqModel)
ctx.JSON(http.StatusOK, result)
}