579 lines
16 KiB
Go
579 lines
16 KiB
Go
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 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(jd_token, cookie, okl_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(token, cookie, okl_token string) (string, *models.JdCookie) {
|
||
state := time.Now().Unix()
|
||
req := httplib.Post(
|
||
fmt.Sprintf(`https://plogin.m.jd.com/cgi-bin/m/tmauthchecktoken?&token=%s&ou_state=0&okl_token=%s`,
|
||
token,
|
||
okl_token,
|
||
),
|
||
)
|
||
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("Cookie", cookie)
|
||
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("User-Agent", jdua())
|
||
req.Header("Host", "plogin.m.jd.com")
|
||
|
||
req.Param("lang", "chs")
|
||
req.Param("appid", "300")
|
||
req.Param("returnurl", fmt.Sprintf("https://wqlogin2.jd.com/passport/LoginRedirect?state=%d&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action", state))
|
||
req.Param("source", "wq_passport")
|
||
|
||
rsp, err := req.Response()
|
||
if err != nil {
|
||
return "", nil //err.Error()
|
||
}
|
||
data, err := ioutil.ReadAll(rsp.Body)
|
||
sth := StepThree{}
|
||
err = json.Unmarshal(data, &sth)
|
||
if err != nil {
|
||
return "", nil //err.Error()
|
||
}
|
||
switch sth.Errcode {
|
||
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 19: //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 if !models.HasKey(ptKey) {
|
||
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)
|
||
}
|
||
}
|
||
}
|