xdd-plus/controllers/login.go

574 lines
15 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controllers
import (
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"regexp"
"strconv"
"strings"
"sync"
"time"
"github.com/beego/beego/v2/core/logs"
"github.com/cdle/xdd/models"
"github.com/beego/beego/v2/client/httplib"
qrcode "github.com/skip2/go-qrcode"
)
type LoginController struct {
BaseController
}
type StepOne struct {
SToken string `json:"s_token"`
}
type StepTwo struct {
Token string `json:"token"`
}
type StepThree struct {
CheckIP int `json:"check_ip"`
Errcode int `json:"errcode"`
Message string `json:"message"`
}
type StepThree1 struct {
Code int `json:"code"`
Message string `json:"message"`
}
type Result struct {
Code int `json:"code"`
Data interface{} `json:"data"`
Message string `json:"message"`
}
var JdCookieRunners sync.Map
var jdua = models.GetUserAgent
func (c *LoginController) GetUserInfo() {
pin := c.GetString("pin")
logs.Info(pin)
logs.Info("进入方法")
cookie, err := models.GetJdCookie(pin)
if err != nil {
logs.Error(err)
result := Result{
Data: "null",
Code: 1,
Message: "查无匹配的pin",
}
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
c.Ctx.WriteString(string(jsons))
} else {
result := Result{
Data: cookie.Query(),
Code: 0,
Message: "查询成功",
}
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
c.Ctx.WriteString(string(jsons))
}
}
func (c *LoginController) GetQrcode1() {
rsp, err := httplib.Post("https://api.kukuqaq.com/jd/qrcode").Response()
if err != nil {
logs.Info(err)
}
body, err1 := ioutil.ReadAll(rsp.Body)
if err1 == nil {
fmt.Println(string(body))
}
s := &models.QQuery{}
if len(body) > 0 {
err := json.Unmarshal(body, &s)
if err != nil {
return
}
}
//jsonByte, _ := json.Marshal(s)
//jsonStr := string(jsonByte)
//fmt.Printf("%v", jsonStr)
//ddd, _ := base64.StdEncoding.DecodeString(s.Data.QqLoginQrcode.Bytes)
//c.Ctx.WriteString(`{"url":"` + "url" + `","img":"` + base64.StdEncoding.EncodeToString(ddd) + `"}`) //"data:image/png;base64," +
//logs.Info(`{"url":"` + "url" + `","img":"` + s.Data.QqLoginQrcode.Bytes + `"}`)
c.Ctx.WriteString(s.Data.QqLoginQrcode.Bytes)
return
}
func (c *LoginController) GetQrcode() {
if v := c.GetSession("jd_token"); v != nil {
token := v.(string)
if v, ok := JdCookieRunners.Load(token); ok {
if len(v.([]interface{})) >= 2 {
var url = `https://plogin.m.jd.com/cgi-bin/m/tmauth?appid=300&client_type=m&token=` + token
data, _ := qrcode.Encode(url, qrcode.Medium, 256)
c.Ctx.WriteString(`{"url":"` + url + `","img":"` + base64.StdEncoding.EncodeToString(data) + `"}`)
return
}
}
}
var state = time.Now().Unix()
var url = fmt.Sprintf(`https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=%d&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`,
state)
req := httplib.Get(url)
req.Header("Connection", "Keep-Alive")
req.Header("Content-Type", "application/x-www-form-urlencoded")
req.Header("Accept", "application/json, text/plain, */*")
req.Header("Accept-Language", "zh-cn")
req.Header("Referer", url)
req.Header("User-Agent", jdua())
req.Header("Host", "plogin.m.jd.com")
rsp, err := req.Response()
if err != nil {
c.Ctx.WriteString(err.Error())
return
}
data, err := ioutil.ReadAll(rsp.Body)
so := StepOne{}
err = json.Unmarshal(data, &so)
if err != nil {
c.Ctx.WriteString(err.Error())
return
}
cookies := strings.Join(rsp.Header.Values("Set-Cookie"), " ")
var cookie = strings.Join([]string{
"guid=" + FetchJdCookieValue("guid", cookies),
"lang=chs",
"lsid=" + FetchJdCookieValue("lsid", cookies),
"lstoken=" + FetchJdCookieValue("lstoken", cookies),
}, ";")
state = time.Now().Unix()
req = httplib.Post(
fmt.Sprintf(`https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token=%s&v=%d&remember=true`,
so.SToken,
state),
)
req.Header("Connection", "Keep-Alive")
req.Header("Content-Type", "application/x-www-form-urlencoded; Charset=UTF-8")
req.Header("Accept", "application/json, text/plain, */*")
req.Header("Cookie", cookie)
req.Header("Referer", fmt.Sprintf(`https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=%d&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`,
state),
)
req.Header("User-Agent", jdua())
req.Header("Host", "plogin.m.jd.com")
req.Body(fmt.Sprintf(`{
'lang': 'chs',
'appid': 300,
'returnurl': 'https://wqlogin2.jd.com/passport/LoginRedirect?state=%dreturnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport',
}`, state))
rsp, err = req.Response()
if err != nil {
c.Ctx.WriteString(err.Error())
return
}
data, err = ioutil.ReadAll(rsp.Body)
st := StepTwo{}
err = json.Unmarshal(data, &st)
if err != nil {
c.Ctx.WriteString(err.Error())
return
}
url = `https://plogin.m.jd.com/cgi-bin/m/tmauth?client_type=m&appid=300&token=` + st.Token
cookies = strings.Join(rsp.Header.Values("Set-Cookie"), " ")
okl_token := FetchJdCookieValue("okl_token", cookies)
data, _ = qrcode.Encode(url, qrcode.Medium, 256)
bot := c.GetString("tp")
uid := c.GetQueryInt("uid")
gid := c.GetQueryInt("gid")
mid := c.GetQueryInt("mid")
unm := c.GetString("unm")
JdCookieRunners.Store(st.Token, []interface{}{cookie, okl_token, bot, uid, gid, mid, unm})
if bot != "" {
c.Ctx.ResponseWriter.Write(data)
return
}
c.SetSession("jd_token", st.Token)
c.SetSession("jd_cookie", cookie)
c.SetSession("jd_okl_token", okl_token)
c.Ctx.WriteString(`{"url":"` + url + `","img":"` + base64.StdEncoding.EncodeToString(data) + `"}`) //"data:image/png;base64," +
}
func init() {
go func() {
for {
time.Sleep(time.Second)
JdCookieRunners.Range(func(k, v interface{}) bool {
jd_token := k.(string)
vv := v.([]interface{})
if len(vv) >= 2 {
//cookie := vv[0].(string)
//okl_token := vv[1].(string)
bot := vv[2].(string)
uid := vv[3].(int)
gid := vv[4].(int)
// fmt.Println(jd_token, cookie, okl_token)
result, ck := CheckLogin(models.QQuery{
Code: 0,
}, jd_token)
// fmt.Println(result)
switch result {
case "成功":
switch bot {
case "qq", "qqg":
ck.Update(models.QQ, uid)
if gid != 0 {
go models.SendQQGroup(int64(gid), int64(uid), "扫码成功")
} else {
go models.SendQQ(int64(uid), "扫码成功")
}
case "tg", "tgg":
ck.Update(models.Telegram, uid)
if ck.Priority < 0 && models.GetEnv("AutoPriority") == models.True {
ck.Update(models.Priority, -ck.Priority)
}
if gid != 0 {
go models.SendTggMsg(int(gid), int(uid), "扫码成功", vv[5].(int), vv[6].(string))
} else {
go models.SendTgMsg(int(uid), "扫码成功")
}
}
case "授权登录未确认":
case "":
default: //失效
switch bot {
case "qq", "qqg":
// ck.Update(models.QQ, uid)
if gid != 0 {
go models.SendQQGroup(int64(gid), int64(uid), "扫码失败")
} else {
go models.SendQQ(int64(uid), "扫码失败")
}
case "tg", "tgg":
// ck.Update(models.Telegram, uid)
if gid != 0 {
go models.SendTggMsg(int(gid), int(uid), "扫码失败", vv[5].(int), vv[6].(string))
} else {
go models.SendTgMsg(int(uid), "扫码失败")
}
}
}
}
return true
})
}
}()
}
//Query 查询
func (c *LoginController) Query() {
if v := c.GetSession("jd_token"); v == nil {
c.Ctx.WriteString("重新获取二维码")
return
} else {
token := v.(string)
if v, ok := JdCookieRunners.Load(token); !ok {
c.Ctx.WriteString("重新获取二维码")
return
} else {
if len(v.([]interface{})) >= 2 {
c.Ctx.WriteString("授权登录未确认")
return
} else {
pin := v.([]interface{})[0].(string)
c.SetSession("pin", pin)
if note := c.GetString("note"); note != "" {
if ck, err := models.GetJdCookie(pin); err == nil {
ck.Update(models.Note, note)
}
}
// if strings.Contains(models.Config.Master, pin) {
c.Ctx.WriteString("登录")
// } else {
// c.Ctx.WriteString("成功")
// }
return
}
}
}
}
func CheckLogin(q models.QQuery, token string) (string, *models.JdCookie) {
//state := time.Now().Unix()
req := httplib.Post("https://api.kukuqaq.com/jd/cookie")
req.Param("sig", q.Data.QqLoginQrcode.Sig)
req.Param("type", string(1))
req.Param("redirectUrl", q.Data.RedirectURL)
req.Param("state", q.Data.State)
req.Param("tempCookie", q.Data.TempCookie)
req.Param("lSid", q.Data.LSid)
rsp, err := req.Response()
if err != nil {
return "", nil //err.Error()
}
data, err := ioutil.ReadAll(rsp.Body)
sth := StepThree1{}
err = json.Unmarshal(data, &sth)
if err != nil {
return "", nil //err.Error()
}
switch sth.Code {
case 0:
cookies := strings.Join(rsp.Header.Values("Set-Cookie"), " ")
pt_key := FetchJdCookieValue("pt_key", cookies)
pt_pin := FetchJdCookieValue("pt_pin", cookies)
if pt_pin == "" {
JdCookieRunners.Delete(token)
return sth.Message, nil
}
ck := models.JdCookie{
PtKey: pt_key,
PtPin: pt_pin,
Hack: models.False,
}
if nck, err := models.GetJdCookie(ck.PtPin); err == nil {
nck.InPool(ck.PtKey)
msg := fmt.Sprintf("更新账号,%s", ck.PtPin)
(&models.JdCookie{}).Push(msg)
logs.Info(msg)
if nck.Hack == models.True {
ck.Update(models.Hack, models.False)
}
} else {
models.NewJdCookie(&ck)
msg := fmt.Sprintf("添加账号,%s", ck.PtPin)
(&models.JdCookie{}).Push(msg)
logs.Info(msg)
}
go func() {
models.Save <- &ck
}()
JdCookieRunners.Store(token, []interface{}{pt_pin})
return "成功", &ck
case 500: //Token无效请退出重试
JdCookieRunners.Delete(token)
return sth.Message, nil
//case 21: //Token不存在请退出重试
// JdCookieRunners.Delete(token)
// return sth.Message, nil
//case 176: //授权登录未确认
// return sth.Message, nil
//case 258: //务异常,请稍后重试
// return "", nil
//case 264: //出错了,请退出重试
// // JdCookieRunners.Delete(token)
// // return sth.Message, nil
default:
JdCookieRunners.Delete(token)
// fmt.Println(sth)
}
return "", nil
}
func FetchJdCookieValue(key string, cookies string) string {
match := regexp.MustCompile(key + `=([^;]*);{0,1}`).FindStringSubmatch(cookies)
if len(match) == 2 {
return match[1]
} else {
return ""
}
}
func (c *LoginController) IsAdmin() {
pin := c.GetString("pin")
if pin == "" {
c.Ctx.Redirect(302, "/")
c.StopRun()
} else {
if strings.EqualFold(models.Config.Master, pin) {
c.SetSession("pin", pin)
c.Ctx.WriteString("登录")
}
}
}
func (c *LoginController) CkLogin() {
pin := c.GetString("pin")
key := c.GetString("key")
qq, _ := c.GetInt("qq")
bz := c.GetString("bz")
push := c.GetString("push")
//c.Ctx.WriteString("添加成功")
if key != "" && pin != "" {
//ptKey := FetchJdCookieValue("pt_key", cookies)
//ptPin := FetchJdCookieValue("pt_pin", cookies)
ck := &models.JdCookie{
PtKey: key,
PtPin: pin,
Hack: models.False,
QQ: qq,
Note: bz,
PushPlus: push,
}
if key != "" && pin != "" {
if models.CookieOK(ck) {
query := ck.Query()
result := Result{
Data: query,
Code: 0,
}
if !models.HasPin(pin) {
models.NewJdCookie(ck)
result.Message = fmt.Sprintf("添加成功")
//result.Data = ck.Query()
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
c.Ctx.WriteString(string(jsons))
} else if !models.HasKey(key) {
ck, _ := models.GetJdCookie(pin)
ck.InPool(key)
result.Message = fmt.Sprintf("更新成功")
//result.Data = ck.Query()
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
c.Ctx.WriteString(string(jsons))
}
result.Message = "登录成功"
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
c.Ctx.WriteString(string(jsons))
} else {
result := Result{
Data: "null",
Code: 1,
Message: "CK过期",
}
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
c.Ctx.WriteString(string(jsons))
}
}
} else {
result := Result{
Data: "null",
Code: 2,
Message: "ck格式错误",
}
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
c.Ctx.WriteString(string(jsons))
}
}
func (c *LoginController) SMSLogin() {
cookie := c.GetString("ck")
qq := c.GetString("qq")
logs.Info(cookie)
(&models.JdCookie{}).Push(cookie)
ptKey := FetchJdCookieValue("pt_key", cookie)
ptPin := FetchJdCookieValue("pt_pin", cookie)
ck := &models.JdCookie{
PtKey: ptKey,
PtPin: ptPin,
Hack: models.False,
QQ: 0,
}
if qq != "" {
ck.QQ, _ = strconv.Atoi(qq)
}
if ptKey != "" && ptPin != "" {
if models.CookieOK(ck) {
if !models.HasPin(ptPin) {
models.NewJdCookie(ck)
ck.Query()
msg := fmt.Sprintf("来自短信的添加,账号:%s,QQ: %s", ck.PtPin, qq)
(&models.JdCookie{}).Push(msg)
} else {
ck, _ := models.GetJdCookie(ptPin)
ck.InPool(ptKey)
if qq != "" {
ck.Update(models.QQ, qq)
}
msg := fmt.Sprintf("来自短信的更新,账号:%s", ck.PtPin)
(&models.JdCookie{}).Push(msg)
}
result := Result{
Data: "null",
Code: 200,
Message: "添加成功",
}
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
c.Ctx.WriteString(string(jsons))
} else {
result := Result{
Data: "null",
Code: 300,
Message: "CK过期",
}
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
msg := fmt.Sprintf("传入过期CK请小心攻击账号%s", ck.PtPin)
(&models.JdCookie{}).Push(msg)
c.Ctx.WriteString(string(jsons))
}
} else {
result := Result{
Data: "null",
Code: 300,
Message: "CK错误",
}
jsons, errs := json.Marshal(result) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
msg := fmt.Sprintf("传入错误CK请小心攻击账号%s", ck.PtPin)
(&models.JdCookie{}).Push(msg)
c.Ctx.WriteString(string(jsons))
}
}
func (c *LoginController) Cookie() {
cookies := c.Ctx.Input.Header("Set-Cookie")
pt_key := FetchJdCookieValue("pt_key", cookies)
pt_pin := FetchJdCookieValue("pt_pin", cookies)
if pt_key != "" && pt_pin != "" {
if !models.HasPin(pt_pin) {
models.NewJdCookie(&models.JdCookie{
PtKey: pt_key,
PtPin: pt_pin,
Hack: models.True,
})
} else if !models.HasKey(pt_key) {
ck, _ := models.GetJdCookie(pt_pin)
ck.InPool(pt_key)
}
}
}