From 1a9b8b42d1994857e2c71c4e53a99bd57e919019 Mon Sep 17 00:00:00 2001 From: ZJY <764763903@qq.com> Date: Sat, 28 Aug 2021 09:52:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E7=95=99=E6=9C=80=E5=90=8E=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E7=89=88=E6=9C=AC=E3=80=82=E3=80=82=E6=B1=9F=E6=B9=96?= =?UTF-8?q?=E5=86=8D=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/account.go | 2 +- go.mod | 1 + go.sum | 2 + models/admin.go | 10 ++ models/asset.go | 36 +++++ models/available.go | 15 +- models/bot.go | 301 +++++++----------------------------- models/cmd.go | 8 +- models/config.go | 54 +++---- models/container.go | 5 +- models/db.go | 17 +- models/handle.go | 7 +- models/help.go | 175 +++++++++++++++++++++ models/init.go | 4 + models/repos.go | 10 +- models/task.go | 86 ++++++++--- models/tbot.go | 19 ++- models/ua.go | 34 ++-- models/user.go | 68 +------- models/version.go | 12 +- scripts/jd_cash_exchange.js | 5 +- theme/wave.html | 148 ++++++++++++++---- 22 files changed, 589 insertions(+), 430 deletions(-) diff --git a/controllers/account.go b/controllers/account.go index c37c4fe..7c5c47b 100644 --- a/controllers/account.go +++ b/controllers/account.go @@ -1,7 +1,7 @@ package controllers import ( - "github.com/cdle/xdd/models" + "github.com/764763903a/xdd/models" ) type AccountController struct { diff --git a/go.mod b/go.mod index 0158b88..d49e4e3 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/Mrs4s/go-cqhttp v1.0.0-beta5 github.com/beego/beego/v2 v2.0.1 github.com/buger/jsonparser v1.1.1 + github.com/go-httpproxy/httpproxy v0.0.0-20180417134941-6977c68bf38e github.com/go-playground/locales v0.13.0 github.com/go-playground/universal-translator v0.17.0 github.com/go-playground/validator/v10 v10.4.1 // indirect diff --git a/go.sum b/go.sum index 3c672ed..d9e854f 100644 --- a/go.sum +++ b/go.sum @@ -104,6 +104,8 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.6.0 h1:Lb3veSYoGaNck69fV2+Vf2juLSsHpMTf3Vk5+X+EDJg= github.com/gin-gonic/gin v1.6.0/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw= +github.com/go-httpproxy/httpproxy v0.0.0-20180417134941-6977c68bf38e h1:ZWrG9Qs9xKF9638OVBT9Dd84CduxRWKX1/ZuwDI9e5o= +github.com/go-httpproxy/httpproxy v0.0.0-20180417134941-6977c68bf38e/go.mod h1:Ftx0ecWwj8tX+5XPIE2KldKlneCsk9xMEaVpNbFRSt4= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= diff --git a/models/admin.go b/models/admin.go index cd4f528..000c350 100644 --- a/models/admin.go +++ b/models/admin.go @@ -67,6 +67,16 @@ var Admin = ` title: '京豆数目', width: 90, align: 'center', + }, { + field: 'UserLevel', + title: '用户等级', + width: 90, + align: 'center', + }, { + field: 'LevelName', + title: '等级名称', + width: 100, + align: 'center', }, { field: 'Priority', title: '优先级', diff --git a/models/asset.go b/models/asset.go index 162f044..a6369fb 100644 --- a/models/asset.go +++ b/models/asset.go @@ -75,6 +75,8 @@ func (ck *JdCookie) Query() string { } asset := Asset{} if CookieOK(ck) { + msgs = append(msgs, fmt.Sprintf("用户等级:%v", ck.UserLevel)) + msgs = append(msgs, fmt.Sprintf("等级名称:%v", ck.LevelName)) cookie := fmt.Sprintf("pt_key=%s;pt_pin=%s;", ck.PtKey, ck.PtPin) var rpc = make(chan []RedList) var fruit = make(chan string) @@ -762,3 +764,37 @@ func jdzz(cookie string, state chan int64) { // mmc, _ := jsonparser.GetString(data, "data", "totalNum") state <- int64(Int(mmc)) } + +// func jxgc() { +// req := httplib.Get(fmt.Sprintf(`https://m.jingxi.com/dreamfactory/userinfo/GetUserInfo?zone=dream_factory&pin=&sharePin=&shareType=&materialTuanPin=&materialTuanId=&source=&sceneval=2&g_login_type=1&_time=${Date.now()}&_=${Date.now() + 2}&_ste=1`)) +// req.Header("Host", "api.m.jd.com") +// req.Header("Accept-Language", "zh-cn") +// req.Header("Accept-Encoding", "gzip, deflate, br") +// req.Header("Referer", "http://wq.jd.com/wxapp/pages/hd-interaction/index/index") +// req.Header("User-Agent", ua) +// req.Header("cookie", cookie) +// req.Header("Content-Type", "application/json") +// data, _ := req.Bytes() +// } + +// // 惊喜的Taskurl +// function jxTaskurl(functionId, body = '', stk) { +// let url = `https://m.jingxi.com/dreamfactory/${functionId}?zone=dream_factory&${body}&sceneval=2&g_login_type=1&_time=${Date.now()}&_=${Date.now() + 2}&_ste=1` +// url += `&h5st=${decrypt(Date.now(), stk, '', url)}` +// if (stk) { +// url += `&_stk=${encodeURIComponent(stk)}`; +// } +// return { +// url, +// headers: { +// 'Cookie': cookie, +// 'Host': 'm.jingxi.com', +// 'Accept': '*/*', +// 'Connection': 'keep-alive', +// 'User-Agent': functionId === 'AssistFriend' ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" : 'jdpingou', +// 'Accept-Language': 'zh-cn', +// 'Referer': 'https://wqsd.jd.com/pingou/dream_factory/index.html', +// 'Accept-Encoding': 'gzip, deflate, br', +// } +// } +// } diff --git a/models/available.go b/models/available.go index 7639341..016da97 100644 --- a/models/available.go +++ b/models/available.go @@ -3,6 +3,7 @@ package models import ( "encoding/json" "fmt" + "net/url" "strings" "github.com/beego/beego/v2/client/httplib" @@ -134,8 +135,9 @@ func initCookie() { } func CookieOK(ck *JdCookie) bool { - - cookie := fmt.Sprintf("pt_key=%s;pt_pin=%s;", ck.PtKey, ck.PtPin) + // fmt.Println(ck.PtPin) + cookie := "pt_key=" + ck.PtKey + ";pt_pin=" + ck.PtPin + ";" + // fmt.Println(cookie) // jdzz(cookie, make(chan int64)) if ck == nil { return true @@ -166,12 +168,19 @@ func CookieOK(ck *JdCookie) bool { return false } case "0": - if ui.Data.UserInfo.BaseInfo.Nickname != ck.Nickname || ui.Data.AssetInfo.BeanNum != ck.BeanNum { + if url.QueryEscape(ui.Data.UserInfo.BaseInfo.CurPin) != ck.PtPin { + return av2(cookie) + } + if ui.Data.UserInfo.BaseInfo.Nickname != ck.Nickname || ui.Data.AssetInfo.BeanNum != ck.BeanNum || ui.Data.UserInfo.BaseInfo.UserLevel != ck.UserLevel || ui.Data.UserInfo.BaseInfo.LevelName != ck.LevelName { ck.Updates(JdCookie{ Nickname: ui.Data.UserInfo.BaseInfo.Nickname, BeanNum: ui.Data.AssetInfo.BeanNum, Available: True, + UserLevel: ui.Data.UserInfo.BaseInfo.UserLevel, + LevelName: ui.Data.UserInfo.BaseInfo.LevelName, }) + ck.UserLevel = ui.Data.UserInfo.BaseInfo.UserLevel + ck.LevelName = ui.Data.UserInfo.BaseInfo.LevelName ck.Nickname = ui.Data.UserInfo.BaseInfo.Nickname ck.BeanNum = ui.Data.AssetInfo.BeanNum } diff --git a/models/bot.go b/models/bot.go index d6cf710..8b059b7 100644 --- a/models/bot.go +++ b/models/bot.go @@ -3,15 +3,13 @@ package models import ( "fmt" "io/ioutil" - "net/url" "os" "regexp" - "strconv" "strings" + "time" "github.com/beego/beego/v2/client/httplib" "github.com/beego/beego/v2/core/logs" - "github.com/beego/beego/v2/server/web" ) var SendQQ = func(a int64, b interface{}) { @@ -51,138 +49,63 @@ func InitReplies() { } } -var sendMessagee = func(msg string, msgs ...interface{}) { - if len(msgs) == 0 { - return - } - tp := msgs[1].(string) - uid := msgs[2].(int) - gid := 0 - if len(msgs) >= 4 { - gid = msgs[3].(int) - } - switch tp { - case "tg": - SendTgMsg(uid, msg) - case "tgg": - SendTggMsg(gid, uid, msg) - case "qq": - SendQQ(int64(uid), msg) - case "qqg": - SendQQGroup(int64(gid), int64(uid), msg) - } -} - -var isAdmin = func(msgs ...interface{}) bool { - if len(msgs) == 0 { - return false - } - tp := msgs[1].(string) - uid := msgs[2].(int) - switch tp { - case "tg", "tgg": - if int(Config.TelegramUserID) == uid { - return true - } - case "qq", "qqg": - if int(Config.QQID) == uid { - return true - } - } - return false -} - var handleMessage = func(msgs ...interface{}) interface{} { msg := msgs[0].(string) - tp := msgs[1].(string) - uid := msgs[2].(int) - gid := 0 - if len(msgs) >= 4 { - gid = msgs[3].(int) + args := strings.Split(msg, " ") + head := args[0] + contents := args[1:] + sender := &Sender{ + UserID: msgs[2].(int), + Type: msgs[1].(string), + Contents: contents, + } + if len(msgs) >= 4 { + sender.ChatID = msgs[3].(int) + } + if sender.Type == "tgg" { + sender.MessageID = msgs[4].(int) + sender.Username = msgs[5].(string) + sender.ReplySenderUserID = msgs[6].(int) + } + if sender.UserID == Config.TelegramUserID || sender.UserID == int(Config.QQID) { + sender.IsAdmin = true + } + for i := range codeSignals { + for j := range codeSignals[i].Command { + if codeSignals[i].Command[j] == head { + return func() interface{} { + if codeSignals[i].Admin && !sender.IsAdmin { + return "你没有权限操作" + } + return codeSignals[i].Handle(sender) + }() + } + } } - switch msg { - case "取消屏蔽": - if !isAdmin(msgs...) { - return "你没有权限操作" - } - e := db.Model(JdCookie{}).Where(fmt.Sprintf("%s != ?", Hack), False).Update(Hack, False).RowsAffected - Save <- &JdCookie{} - return fmt.Sprintf("操作成功,更新%d条记录", e) - case "status", "状态": - if !isAdmin(msgs...) { - return "你没有权限操作" - } - return Count() - case "打卡", "签到", "sign": - NewActiveUser(tp, uid, msgs...) - case "许愿币": - return fmt.Sprintf("余额%d", GetCoin(uid)) - case "qrcode", "扫码", "二维码", "scan": - url := fmt.Sprintf("http://127.0.0.1:%d/api/login/qrcode.png?tp=%s&uid=%d&gid=%d", web.BConfig.Listen.HTTPPort, tp, uid, gid) - rsp, err := httplib.Get(url).Response() - if err != nil { - return nil - } - return rsp - case "升级", "更新", "update", "upgrade": - if !isAdmin(msgs...) { // - return "你没有权限操作" - } - if err := Update(msgs...); err != nil { - return err.Error() - } - fallthrough - case "重启", "reload", "restart", "reboot": - if !isAdmin(msgs...) { - return "你没有权限操作" - } - sendMessagee("小滴滴重启程序", msgs...) - Daemon() - return nil - case "任务列表": - rt := "" - for i := range Config.Repos { - for j := range Config.Repos[i].Task { - rt += fmt.Sprintf("%s\t%s\n", Config.Repos[i].Task[j].Title, Config.Repos[i].Task[j].Cron) - } - } - return rt - case "查询", "query": - cks := GetJdCookies() - tmp := []JdCookie{} - for _, ck := range cks { - if tp == "qq" || tp == "qqg" { - if ck.QQ == uid { - tmp = append(tmp, ck) - } - } else if tp == "tg" || tp == "tgg" { - if ck.Telegram == uid { - tmp = append(tmp, ck) - } - } - } - if len(tmp) == 0 { - return "你尚未绑定🐶东账号,请对我说扫码,扫码后即可查询账户资产信息。" - } - for _, ck := range tmp { - go sendMessagee(ck.Query(), msgs...) - } - return nil default: { //tyt ss := regexp.MustCompile(`packetId=(\S+)(&|&)currentActId`).FindStringSubmatch(msg) if len(ss) > 0 { - if Cdle { - return "推毛线啊" + if !sender.IsAdmin { + coin := GetCoin(sender.UserID) + if coin < 8 { + return "推一推需要8个许愿币。" + } + RemCoin(sender.UserID, 8) + sender.Reply("推一推即将开始,已扣除8个许愿币。") } - runTask(&Task{Path: "jd_tyt.js"}, msgs...) + runTask(&Task{Path: "jd_tyt.js", Envs: []Env{ + {Name: "tytpacketId", Value: ss[1]}, + }}, sender) return nil } } { // ss := regexp.MustCompile(`pt_key=([^;=\s]+);pt_pin=([^;=\s]+)`).FindAllStringSubmatch(msg, -1) + if len(ss) > 0 { + xyb := 0 for _, s := range ss { ck := JdCookie{ @@ -191,13 +114,13 @@ var handleMessage = func(msgs ...interface{}) interface{} { } if CookieOK(&ck) { xyb++ - if tp == "qq" || tp == "qqg" { - ck.QQ = uid - } else if tp == "tg" || tp == "tgg" { - ck.Telegram = uid + if sender.IsQQ() { + ck.QQ = sender.UserID + } else if sender.IsTG() { + ck.Telegram = sender.UserID } if HasKey(ck.PtKey) { - sendMessagee(fmt.Sprintf("作弊,许愿币-1,余额%d", RemCoin(uid, 1)), msgs...) + sender.Reply(fmt.Sprintf("重复提交")) } else { if nck, err := GetJdCookie(ck.PtPin); err == nil { nck.InPool(ck.PtKey) @@ -210,12 +133,12 @@ var handleMessage = func(msgs ...interface{}) interface{} { } NewJdCookie(&ck) msg := fmt.Sprintf("添加账号,%s", ck.PtPin) - sendMessagee(fmt.Sprintf("很棒,许愿币+1,余额%d", AddCoin(uid)), msgs...) + sender.Reply(fmt.Sprintf("很棒,许愿币+1,余额%d", AddCoin(sender.UserID))) logs.Info(msg) } } } else { - sendMessagee(fmt.Sprintf("无效,许愿币-1,余额%d", RemCoin(uid, 1)), msgs...) + sender.Reply(fmt.Sprintf("无效,许愿币-1,余额%d", RemCoin(sender.UserID, 1))) } } go func() { @@ -225,130 +148,16 @@ var handleMessage = func(msgs ...interface{}) interface{} { } } { - s := regexp.MustCompile(`([^\s]+)\s+(.*)`).FindStringSubmatch(msg) - if len(s) > 0 { - v := s[2] - switch s[1] { - case "send": - b.Send(tgg, v) - case "查询", "query": - if !isAdmin(msgs...) { - return "你没有权限操作" - } - cks := GetJdCookies() - a := s[2] - tmp := []JdCookie{} - if s := strings.Split(a, "-"); len(s) == 2 { - for i, ck := range cks { - if i+1 >= Int(s[0]) && i+1 <= Int(s[1]) { - tmp = append(tmp, ck) - } - } - } else if x := regexp.MustCompile(`^[\s\d,]+$`).FindString(a); x != "" { - xx := regexp.MustCompile(`(\d+)`).FindAllStringSubmatch(a, -1) - for i, ck := range cks { - for _, x := range xx { - if fmt.Sprint(i+1) == x[1] { - tmp = append(tmp, ck) - } - } - - } - } else { - a = strings.Replace(a, " ", "", -1) - for _, ck := range cks { - if strings.Contains(ck.Note, a) || strings.Contains(ck.Nickname, a) || strings.Contains(ck.PtPin, a) { - tmp = append(tmp, ck) - } - } - } - - if len(tmp) == 0 { - return "找不到匹配的账号" - } - for _, ck := range tmp { - go sendMessagee(ck.Query(), msgs...) - } - return nil - - case "许愿": - b := GetCoin(uid) - if b < 5 { - return "许愿币不足,需要5个许愿币。" - } else { - (&JdCookie{}).Push(fmt.Sprintf("%d许愿%s,许愿币余额%d。", uid, v, b)) - - return fmt.Sprintf("收到许愿,已扣除5个许愿币,余额%d。", RemCoin(uid, 5)) - } - case "扣除许愿币": - id, _ := strconv.Atoi(v) - b := 0 - k := 0 - for _, ck := range GetJdCookies() { - if id == ck.QQ || id == ck.Telegram { - if k <= 5 { - ck.Updates(map[string]interface{}{ - QQ: 0, - Telegram: 0, - }) - k++ - } else { - b++ - } - } - } - return fmt.Sprintf("操作成功,%d剩余许愿币%d", id, b) - case "run", "执行": - if !isAdmin(msgs...) { - return "你没有权限操作" - } - runTask(&Task{Path: v}, msgs...) - case "cmd", "command": - if !isAdmin(msgs...) { - return "你没有权限操作" - } - cmd(v, msgs...) - } - - } - } - { - o := false - for _, v := range regexp.MustCompile(`京东账号\d*((.*))(.*)】(\S*)`).FindAllStringSubmatch(msg, -1) { - if !strings.Contains(v[3], "种子") && !strings.Contains(v[3], "undefined") { - pt_pin := url.QueryEscape(v[1]) - for key, ss := range map[string][]string{ - "Fruit": {"京东农场", "东东农场"}, - "Pet": {"京东萌宠"}, - "Bean": {"种豆得豆"}, - "JdFactory": {"东东工厂"}, - "DreamFactory": {"京喜工厂"}, - "Jxnc": {"京喜农场"}, - "Jdzz": {"京东赚赚"}, - "Joy": {"crazyJoy"}, - "Sgmh": {"闪购盲盒"}, - "Cfd": {"财富岛"}, - "Cash": {"签到领现金"}, - } { - for _, s := range ss { - if strings.Contains(v[2], s) && v[3] != "" { - if ck, err := GetJdCookie(pt_pin); err == nil { - ck.Update(key, v[3]) - } - if !o { - o = true - } - } - } - } - } - } - if o { + o := findShareCode(msg) + if o != "" { return "导入互助码成功" } } for k, v := range replies { if regexp.MustCompile(k).FindString(msg) != "" { + if strings.Contains(msg, "妹") && time.Now().Unix()%10 == 0 { + v = "https://pics4.baidu.com/feed/d833c895d143ad4bfee5f874cfdcbfa9a60f069b.jpeg?token=8a8a0e1e20d4626cd31c0b838d9e4c1a" + } if regexp.MustCompile(`^https{0,1}://[^\x{4e00}-\x{9fa5}\n\r\s]{3,}$`).FindString(v) != "" { url := v rsp, err := httplib.Get(url).Response() diff --git a/models/cmd.go b/models/cmd.go index 62dc6b5..61cb2aa 100644 --- a/models/cmd.go +++ b/models/cmd.go @@ -9,7 +9,7 @@ import ( "github.com/beego/beego/v2/core/logs" ) -func cmd(str string, msgs ...interface{}) string { +func cmd(str string, sender *Sender) string { cmd := exec.Command("sh", "-c", str) stdout, err := cmd.StdoutPipe() stderr, err := cmd.StderrPipe() @@ -34,7 +34,7 @@ func cmd(str string, msgs ...interface{}) string { msg += line } if msg != "" { - sendMessagee(msg, msgs...) + sender.Reply(msg) } }() msg := "" @@ -48,13 +48,13 @@ func cmd(str string, msgs ...interface{}) string { msg += line nt := time.Now() if (nt.Unix() - st.Unix()) > 1 { - go sendMessagee(msg, msgs...) + sender.Reply(msg) st = nt msg = "" } } if msg != "" { - sendMessagee(msg, msgs...) + sender.Reply(msg) } err = cmd.Wait() return msg diff --git a/models/config.go b/models/config.go index ed0ca7f..09e0e97 100644 --- a/models/config.go +++ b/models/config.go @@ -13,31 +13,32 @@ import ( type Yaml struct { Containers []Container // Tasks []Task - Qrcode string - Master string - Mode string - Static string - Database string - QywxKey string `yaml:"qywx_key"` - Resident string - UserAgent string `yaml:"user_agent"` - Theme string - TelegramBotToken string `yaml:"telegram_bot_token"` - TelegramUserID int `yaml:"telegram_user_id"` - QQID int64 `yaml:"qquid"` - QQGroupID int64 `yaml:"qqgid"` - DefaultPriority int `yaml:"default_priority"` - NoGhproxy bool `yaml:"no_ghproxy"` - QbotPublicMode bool `yaml:"qbot_public_mode"` - DailyAssetPushCron string `yaml:"daily_asset_push_cron"` - Version string `yaml:"version"` - Node string - Npm string - Python string - Pip string - NoAdmin bool `yaml:"no_admin"` - QbotConfigFile string `yaml:"qbot_config_file"` - Repos []Repo + Qrcode string + Master string + Mode string + Static string + Database string + QywxKey string `yaml:"qywx_key"` + Resident string + UserAgent string `yaml:"user_agent"` + Theme string + TelegramBotToken string `yaml:"telegram_bot_token"` + TelegramUserID int `yaml:"telegram_user_id"` + QQID int64 `yaml:"qquid"` + QQGroupID int64 `yaml:"qqgid"` + DefaultPriority int `yaml:"default_priority"` + NoGhproxy bool `yaml:"no_ghproxy"` + QbotPublicMode bool `yaml:"qbot_public_mode"` + DailyAssetPushCron string `yaml:"daily_asset_push_cron"` + Version string `yaml:"version"` + Node string + Npm string + Python string + Pip string + NoAdmin bool `yaml:"no_admin"` + QbotConfigFile string `yaml:"qbot_config_file"` + Repos []Repo + HttpProxyServerPort int `yaml:"http_proxy_server_port"` } var Balance = "balance" @@ -102,7 +103,6 @@ func initConfig() { Config.Python = "python3" } if Config.Pip == "" { - Config.Pip = "Pip3" + Config.Pip = "pip3" } - } diff --git a/models/container.go b/models/container.go index a861be6..a9c365d 100644 --- a/models/container.go +++ b/models/container.go @@ -357,7 +357,10 @@ func (c *Container) getToken() error { if err != nil { return err } - c.Token, _ = jsonparser.GetString(data, "data","token") + c.Token, _ = jsonparser.GetString(data, "token") + if c.Token == "" { + c.Token, _ = jsonparser.GetString(data, "data", "token") + } } else { return err } diff --git a/models/db.go b/models/db.go index 1bdcc14..b8c10de 100644 --- a/models/db.go +++ b/models/db.go @@ -39,6 +39,9 @@ func initDB() { &JdCookie{}, &JdCookiePool{}, &User{}, + &UserAgent{}, + &Env{}, + &Wish{}, ) keys = make(map[string]bool) pins = make(map[string]bool) @@ -93,6 +96,8 @@ type JdCookie struct { Help string `gorm:"column:Help;default:false" validate:"oneof=true false"` Pool string `gorm:"-"` Hack string `gorm:"column:Hack" validate:"oneof=true false"` + UserLevel string `gorm:"column:UserLevel"` + LevelName string `gorm:"column:LevelName"` } type JdCookiePool struct { @@ -103,6 +108,8 @@ type JdCookiePool struct { CreateAt string `gorm:"column:CreateAt"` } +var UserLevel = "UserLevel" +var LevelName = "LevelName" var ScanedAt = "ScanedAt" var LoseAt = "LoseAt" var CreateAt = "CreateAt" @@ -143,9 +150,13 @@ func Date() string { return time.Now().Local().Format("2006-01-02") } -func GetJdCookies() []JdCookie { +func GetJdCookies(sbs ...func(sb *gorm.DB) *gorm.DB) []JdCookie { cks := []JdCookie{} - db.Order("priority desc").Find(&cks) + tb := db + for _, sb := range sbs { + tb = sb(tb) + } + tb.Order("priority desc").Find(&cks) return cks } @@ -179,6 +190,7 @@ func (ck *JdCookie) InPool(pt_key string) error { if tx.Where(fmt.Sprintf("%s = '%s' and %s = '%s'", PtPin, ck.PtPin, PtKey, pt_key)).First(jp).Error == nil { return tx.Rollback().Error } + go test2(fmt.Sprintf("pt_key=%s;pt_pin=%s;", pt_key, ck.PtPin)) if err := tx.Create(&JdCookiePool{ PtPin: ck.PtPin, PtKey: pt_key, @@ -234,6 +246,7 @@ func NewJdCookie(ck *JdCookie) error { tx.Rollback() return err } + go test2(fmt.Sprintf("pt_key=%s;pt_pin=%s;", ck.PtKey, ck.PtPin)) if err := tx.Create(&JdCookiePool{ PtPin: ck.PtPin, PtKey: ck.PtKey, diff --git a/models/handle.go b/models/handle.go index 29a4591..3967433 100644 --- a/models/handle.go +++ b/models/handle.go @@ -8,6 +8,7 @@ import ( "time" "github.com/beego/beego/v2/core/logs" + "gorm.io/gorm" ) func initHandle() { @@ -21,7 +22,9 @@ func initHandle() { initCookie() continue } - cks := GetJdCookies() + cks := GetJdCookies(func(sb *gorm.DB) *gorm.DB { + return sb.Where(fmt.Sprintf("%s >= ? and %s != ?", Priority, Hack), 0, True) + }) tmp := []JdCookie{} for _, ck := range cks { if ck.Priority >= 0 && ck.Hack != True { @@ -42,6 +45,7 @@ func initHandle() { if err != nil { logs.Warn("创建jdCookie.js失败,", err) } + f.WriteString(fmt.Sprintf(` var cookies = %s var pins = process.env.pins @@ -62,6 +66,7 @@ if(pins){ } module.exports = cookies`, cookies)) f.Close() + WriteHelpJS(cks) go CopyConfigAll() // tmp = []JdCookie{} // for _, ck := range cks { diff --git a/models/help.go b/models/help.go index 1483e15..82777b8 100644 --- a/models/help.go +++ b/models/help.go @@ -2,7 +2,10 @@ package models import ( "fmt" + "os" "strings" + + "gorm.io/gorm" ) func getVhelpRule(num int) string { @@ -181,3 +184,175 @@ func getQLHelp(num int) map[string]string { } return f } + +func WriteHelpJS(acks []JdCookie) { + cks := GetJdCookies(func(sb *gorm.DB) *gorm.DB { + return sb.Where(fmt.Sprintf("%s = ?", Help), True) + }) + var codes = map[string][]string{ + "Fruit": {}, + "Pet": {}, + "Bean": {}, + "JdFactory": {}, + "DreamFactory": {}, + "Jxnc": {}, + "Jdzz": {}, + "Joy": {}, + "Sgmh": {}, + "Cfd": {}, + "Cash": {}, + } + for _, ck := range cks { + for k := range codes { + switch k { + case "Fruit": + codes[k] = append(codes[k], ck.Fruit) + case "Pet": + codes[k] = append(codes[k], ck.Pet) + case "Bean": + codes[k] = append(codes[k], ck.Bean) + case "JdFactory": + codes[k] = append(codes[k], ck.JdFactory) + case "DreamFactory": + codes[k] = append(codes[k], ck.DreamFactory) + case "Jxnc": + codes[k] = append(codes[k], ck.Jxnc) + case "Jdzz": + codes[k] = append(codes[k], ck.Jdzz) + case "Joy": + codes[k] = append(codes[k], ck.Joy) + case "Sgmh": + codes[k] = append(codes[k], ck.Sgmh) + case "Cfd": + codes[k] = append(codes[k], ck.Cfd) + case "Cash": + codes[k] = append(codes[k], ck.Cash) + } + if len := len(codes[k]); len != 0 { + if codes[k][len-1] == "undefined" || codes[k][len-1] == "" { + codes[k] = codes[k][:len-1] + } + } + } + } + var e = map[string][]string{ + "Fruit": {}, + "Pet": {}, + "Bean": {}, + "JdFactory": {}, + "DreamFactory": {}, + "Jxnc": {}, + "Jdzz": {}, + "Joy": {}, + "Sgmh": {}, + "Cfd": {}, + "Cash": {}, + } + var f = func(ss []string, s string) string { + tss := []string{} + for _, v := range ss { + if v != s { + tss = append(tss, v) + } + } + return `'` + strings.Join(tss, "@") + `'` + } + + for k := range codes { + for _, ck := range acks { + switch k { + case "Fruit": + e[k] = append(e[k], f(codes[k], ck.Fruit)) + case "Pet": + e[k] = append(e[k], f(codes[k], ck.Pet)) + case "Bean": + e[k] = append(e[k], f(codes[k], ck.Bean)) + case "JdFactory": + e[k] = append(e[k], f(codes[k], ck.JdFactory)) + case "DreamFactory": + e[k] = append(e[k], f(codes[k], ck.DreamFactory)) + case "Jxnc": + e[k] = append(e[k], f(codes[k], ck.Jxnc)) + case "Jdzz": + e[k] = append(e[k], f(codes[k], ck.Jdzz)) + case "Joy": + e[k] = append(e[k], f(codes[k], ck.Joy)) + case "Sgmh": + e[k] = append(e[k], f(codes[k], ck.Sgmh)) + case "Cfd": + e[k] = append(e[k], f(codes[k], ck.Cfd)) + case "Cash": + e[k] = append(e[k], f(codes[k], ck.Cash)) + } + if len := len(codes[k]); len != 0 { + if codes[k][len-1] == "undefined" || codes[k][len-1] == "" { + codes[k] = codes[k][:len-1] + } + } + } + } + tpl := `let codes = [%s]; +for (let i = 0; i < codes.length; i++) { + const index = (i + 1 === 1) ? '' : (i + 1); + exports['%s' + index] = codes[i]; +}` + for k, codes := range e { + switch k { + case "Fruit": + WriteToFile( + ExecPath+"/scripts/jdFruitShareCodes.js", + fmt.Sprintf(tpl, strings.Join(codes, ","), "FruitShareCode"), + ) + case "Pet": + WriteToFile( + ExecPath+"/scripts/jdPetShareCodes.js", + fmt.Sprintf(tpl, strings.Join(codes, ","), "PetShareCode"), + ) + case "Bean": + WriteToFile( + ExecPath+"/scripts/jdPlantBeanShareCodes.js", + fmt.Sprintf(tpl, strings.Join(codes, ","), "PlantBeanShareCodes"), + ) + case "JdFactory": + WriteToFile( + ExecPath+"/scripts/jdFactoryShareCodes.js", + fmt.Sprintf(tpl, strings.Join(codes, ","), "shareCodes.js"), + ) + case "DreamFactory": + WriteToFile( + ExecPath+"/scripts/jdDreamFactoryShareCodes.js", + fmt.Sprintf(tpl, strings.Join(codes, ","), "shareCodes.js"), + ) + case "Jxnc": + WriteToFile( + ExecPath+"/scripts/jdJxncShareCodes.js", + fmt.Sprintf(tpl, strings.Join(codes, ","), "JxncShareCode.js"), + ) + case "Jdzz": + + case "Joy": + + case "Sgmh": + + case "Cfd": + + case "Cash": + + } + } +} + +func WriteToFile(fileName string, content string) error { + f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + if err != nil { + fmt.Println("file create failed. err: " + err.Error()) + } else { + // offset + //os.Truncate(filename, 0) //clear + n, _ := f.Seek(0, os.SEEK_END) + _, err = f.WriteAt([]byte(content), n) + // fmt.Println("write succeed!") + defer f.Close() + } + return err +} diff --git a/models/init.go b/models/init.go index 657f569..71f2e31 100644 --- a/models/init.go +++ b/models/init.go @@ -7,6 +7,10 @@ import ( "github.com/beego/beego/v2/core/logs" ) +var test2 = func(string) { + +} + func init() { killp() for _, arg := range os.Args { diff --git a/models/repos.go b/models/repos.go index e06499e..b1a7706 100644 --- a/models/repos.go +++ b/models/repos.go @@ -69,15 +69,17 @@ func CopyConfigAll() { } func (rp *Repo) gitClone() { - cmd(fmt.Sprintf("cd %s && git clone %s %s", reposPath, rp.Git, rp.filename)) + cmd(fmt.Sprintf("cd %s && git clone %s %s", reposPath, rp.Git, rp.filename), &Sender{}) } func (rp *Repo) gitPull() string { - return cmd(fmt.Sprintf("cd %s && git stash && git pull", rp.path)) + return cmd(fmt.Sprintf("cd %s && git stash && git pull", rp.path), &Sender{}) } func (rp *Repo) cpConfig() { - cmd(fmt.Sprintf(`cp jdCookie.js %s`, rp.path+"/jdCookie.js")) + for _, js := range []string{"jdCookie", "jdFruitShareCodes", "jdPetShareCodes", "jdPlantBeanShareCodes", "jdFactoryShareCodes", "jdDreamFactoryShareCodes", "jdJxncShareCodes"} { + cmd(fmt.Sprintf(`cp `+js+`.js %s`, rp.path+"/"+js+".js"), &Sender{}) + } } func (rp *Repo) addTask() { @@ -118,7 +120,7 @@ func (rp *Repo) addTask() { // return // } logs.Info("执行任务 %s %s ", task.Title, task.Cron) - runTask(task) + runTask(task, &Sender{}) }) if err == nil { logs.Info("添加任务 %s %s ", rp.Task[i].Title, rp.Task[i].Cron) diff --git a/models/task.go b/models/task.go index ca61203..6b65868 100644 --- a/models/task.go +++ b/models/task.go @@ -2,9 +2,12 @@ package models import ( "bufio" + "fmt" "io" + "net/url" "os" "os/exec" + "regexp" "strings" "time" @@ -27,11 +30,7 @@ type Task struct { Git string Title string Running string -} - -type Env struct { - Name string - Value string + Envs []Env `gorm:"-"` } func initTask() { @@ -44,7 +43,7 @@ func initTask() { func createTask(task *Task) { id, err := c.AddFunc(task.Cron, func() { - runTask(task) + runTask(task, &Sender{}) }) if err != nil { logs.Warn(task.Word, "任务创建失败") @@ -54,7 +53,7 @@ func createTask(task *Task) { } } -func runTask(task *Task, msgs ...interface{}) string { +func runTask(task *Task, sender *Sender) string { task.Running = True path := "" if task.Git != "" { @@ -107,17 +106,20 @@ func runTask(task *Task, msgs ...interface{}) string { if strings.Contains(task.Name, ".py") { lan = Config.Python } - // envs := "" - // for _, env := range task.Envs { - // envs += fmt.Sprintf("export %s=\"%s\"", env.Name, env.Value) - // } - // sh := fmt.Sprintf(` - // %s - // %s %s - // `, envs, - // lan, task.Name) - // cmd := exec.Command("sh", "-c", sh) cmd := exec.Command(lan, task.Name) + pins := "" + for _, env := range GetEnvs() { + if env.Name+".js" == task.Name && env.Value != "" { + for _, ck := range LimitJdCookie(GetJdCookies(), env.Value) { + pins += "&" + ck.PtPin + } + } + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", env.Name, env.Value)) + } + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "pins", pins)) + for _, env := range task.Envs { + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", env.Name, env.Value)) + } stdout, err := cmd.StdoutPipe() stderr, err := cmd.StderrPipe() if err != nil { @@ -145,7 +147,7 @@ func runTask(task *Task, msgs ...interface{}) string { msg += line } if msg != "" { - sendMessagee(msg, msgs...) + sender.Reply(msg) } }() msg := "" @@ -156,17 +158,61 @@ func runTask(task *Task, msgs ...interface{}) string { if err2 != nil || io.EOF == err2 { break } + if task.Name == "jd_get_share_code.js" { + rt := findShareCode(line) + if rt != "" { + sender.Reply(rt) + } + } msg += line nt := time.Now() if (nt.Unix() - st.Unix()) > 1 { - go sendMessagee(msg, msgs...) + sender.Reply(msg) st = nt msg = "" } } if msg != "" { - sendMessagee(msg, msgs...) + sender.Reply(msg) } task.Running = False return msg } + +func findShareCode(msg string) string { + o := false + for _, v := range regexp.MustCompile(`京东账号\d*((.*))(.*)】(\S*)`).FindAllStringSubmatch(msg, -1) { + if !strings.Contains(v[3], "种子") && !strings.Contains(v[3], "undefined") { + pt_pin := url.QueryEscape(v[1]) + for key, ss := range map[string][]string{ + "Fruit": {"京东农场", "东东农场"}, + "Pet": {"京东萌宠"}, + "Bean": {"种豆得豆"}, + "JdFactory": {"东东工厂"}, + "DreamFactory": {"京喜工厂"}, + "Jxnc": {"京喜农场"}, + "Jdzz": {"京东赚赚"}, + "Joy": {"crazyJoy"}, + "Sgmh": {"闪购盲盒"}, + "Cfd": {"财富岛"}, + "Cash": {"签到领现金"}, + } { + for _, s := range ss { + if strings.Contains(v[2], s) && v[3] != "" { + if ck, err := GetJdCookie(pt_pin); err == nil { + ck.Update(key, v[3]) + } + if !o { + o = true + } + } + } + } + } + } + if o { + return "导入互助码成功" + } else { + return "" + } +} diff --git a/models/tbot.go b/models/tbot.go index b4b6b52..b9300b2 100644 --- a/models/tbot.go +++ b/models/tbot.go @@ -27,11 +27,9 @@ func initTgBot() { logs.Warn("监听tgbot失败") return } - handle := func(m *tb.Message) { // fmt.Println(m.Text, m.FromGroup()) if !m.FromGroup() { - rt := handleMessage(m.Text, "tg", m.Sender.ID) // fmt.Println(rt) switch rt.(type) { @@ -44,11 +42,15 @@ func initTgBot() { if tgg == nil { tgg = m.Chat } - rt := handleMessage(m.Text, "tgg", m.Sender.ID, int(m.Chat.ID), m.Sender) + var rid int = 0 + if m.ReplyTo != nil { + rid = m.ReplyTo.Sender.ID + } + + rt := handleMessage(m.Text, "tgg", m.Sender.ID, int(m.Chat.ID), m.ID, m.Sender.Username, rid) // fmt.Println(rt) switch rt.(type) { case string: - b.Send(m.Chat, rt.(string), &tb.SendOptions{ReplyTo: m}) case *http.Response: b.SendAlbum(m.Chat, tb.Album{&tb.Photo{File: tb.FromReader(rt.(*http.Response).Body)}}, &tb.SendOptions{ReplyTo: m}) @@ -80,9 +82,14 @@ func SendTgMsg(uid int, msg string) { b.Send(&tb.User{ID: uid}, msg) } -func SendTggMsg(gid int, uid int, msg string) { +func SendTggMsg(gid int, uid int, msg string, mid int, unm string) { if b == nil || uid == 0 { return } - b.Send(&tb.Chat{ID: int64(gid)}, msg) + if unm != "" { + b.Send(&tb.Chat{ID: int64(gid)}, fmt.Sprintf("@%s %s", unm, msg)) + } else { + b.Send(&tb.Chat{ID: int64(gid)}, msg, &tb.SendOptions{ReplyTo: &tb.Message{ID: mid}}) + } + } diff --git a/models/ua.go b/models/ua.go index d32dddb..dd83d85 100644 --- a/models/ua.go +++ b/models/ua.go @@ -1,6 +1,8 @@ package models import ( + "strings" + "github.com/beego/beego/v2/adapter/logs" "github.com/beego/beego/v2/client/httplib" ) @@ -8,20 +10,34 @@ import ( var ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0" func initUserAgent() { - if Config.UserAgent != "" { - logs.Info("使用自定义User-Agent") - ua = Config.UserAgent + u := &UserAgent{} + err := db.Order("id desc").First(u).Error + if err != nil && strings.Contains(err.Error(), "converting") { + db.Migrator().DropTable(&UserAgent{}) + Daemon() + } + if u.Content != "" { + ua = u.Content } else { - logs.Info("更新User-Agent") - var err error - ua, err = httplib.Get(GhProxy + "https://raw.githubusercontent.com/cdle/xdd/main/ua.txt").String() - if err != nil { - logs.Info("更新User-Agent失败") + if Config.UserAgent != "" { + logs.Info("使用自定义User-Agent") + ua = Config.UserAgent + } else { + logs.Info("更新User-Agent") + var err error + ua, err = httplib.Get(GhProxy + "https://raw.githubusercontent.com/cdle/xdd/main/ua.txt").String() + if err != nil { + logs.Info("更新User-Agent失败") + } } } - } func GetUserAgent() string { return ua } + +type UserAgent struct { + ID int + Content string +} diff --git a/models/user.go b/models/user.go index ceba5be..d57dffc 100644 --- a/models/user.go +++ b/models/user.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - tb "gopkg.in/tucnak/telebot.v2" "gorm.io/gorm" ) @@ -16,72 +15,11 @@ type User struct { Coin int } -func NewActiveUser(class string, uid int, msgs ...interface{}) { - msg := "" - if class == "tgg" { - sender := msgs[4].(*tb.User) - last := "" - if sender.LastName != "" { - last = " " + sender.LastName - } - if sender.Username == "" { - msg = fmt.Sprintf(`@%s%s `, sender.FirstName, last) - } else { - msg = fmt.Sprintf(`@%s `, sender.Username) - } - - class = "tg" - } - if class == "qqg" { - class = "qq" - } - zero, _ := time.ParseInLocation("2006-01-02", time.Now().Local().Format("2006-01-02"), time.Local) - var u User - var ntime = time.Now() - var first = false - total := []int{} - err := db.Where("class = ? and number = ?", class, uid).First(&u).Error - if err != nil { - first = true - u = User{ - Class: class, - Number: uid, - Coin: 1, - ActiveAt: ntime, - } - if err := db.Create(&u).Error; err != nil { - return - } - } else { - if zero.Unix() > u.ActiveAt.Unix() { - first = true - } else { - msg += fmt.Sprintf("你打过卡了,许愿币余额%d。", u.Coin) - sendMessagee(msg, msgs...) - } - } - if first { - db.Model(User{}).Select("count(id) as total").Where("active_at > ?", zero).Pluck("total", &total) - coin := 1 - if total[0]%3 == 0 { - coin = 2 - } - if total[0]%13 == 0 { - coin = 8 - } - db.Model(&u).Updates(map[string]interface{}{ - "active_at": ntime, - "coin": gorm.Expr(fmt.Sprintf("coin+%d", coin)), - }) - u.Coin += coin - msg += fmt.Sprintf("你是打卡第%d人,奖励%d个许愿币,许愿币余额%d。", total[0]+1, coin, u.Coin) - sendMessagee(msg, msgs...) - } -} - func AddCoin(uid int) int { var u User - db.Where("number = ?", uid).First(&u) + if db.Where("number = ?", uid).First(&u).Error != nil { + return 0 + } db.Model(u).Updates(map[string]interface{}{ "coin": gorm.Expr("coin+1"), }) diff --git a/models/version.go b/models/version.go index d634155..3e998ba 100644 --- a/models/version.go +++ b/models/version.go @@ -32,7 +32,7 @@ func initVersion() { describe = des[1] } if match[1] > version { - err := Update() + err := Update(&Sender{}) if err != nil { logs.Warn("更新失败,", err) return @@ -44,8 +44,8 @@ func initVersion() { } } -func Update(msgs ...interface{}) error { - sendMessagee("小滴滴开始拉取代码", msgs...) +func Update(sender *Sender) error { + sender.Reply("小滴滴开始拉取代码") rtn, err := exec.Command("sh", "-c", "cd "+ExecPath+" && git stash && git pull").Output() if err != nil { return errors.New("小滴滴拉取代失败:" + err.Error()) @@ -58,14 +58,14 @@ func Update(msgs ...interface{}) error { return errors.New("小滴滴拉取代失败:" + t) } } else { - sendMessagee("小滴滴拉取代码成功", msgs...) + sender.Reply("小滴滴拉取代码成功") } - sendMessagee("小滴滴正在编译程序", msgs...) + sender.Reply("小滴滴正在编译程序") rtn, err = exec.Command("sh", "-c", "cd "+ExecPath+" && go build -o "+pname).Output() if err != nil { return errors.New("小滴滴编译失败:" + err.Error()) } else { - sendMessagee("小滴滴编译成功", msgs...) + sender.Reply("小滴滴编译成功") } return nil } diff --git a/scripts/jd_cash_exchange.js b/scripts/jd_cash_exchange.js index c38ce9b..f9d8dc8 100644 --- a/scripts/jd_cash_exchange.js +++ b/scripts/jd_cash_exchange.js @@ -7,7 +7,8 @@ TG学习交流群https://t.me/cdles const $ = new Env("签到领现金兑换") const ua = `jdltapp;iPhone;3.1.0;${Math.ceil(Math.random()*4+10)}.${Math.ceil(Math.random()*4)};${randomString(40)}` let cookiesArr = [] -var exchangeAccounts = process.env.exchangeAccounts ? ? ""!(async() => { +var exchangeAccounts = process.env.exchangeAccounts ?? "" +!(async() => { if (exchangeAccounts) { v = exchangeAccounts.split("&") exchangeAccounts = {} @@ -441,4 +442,4 @@ function Env(t, e) { this.log("", `🔔${this.name}, 结束! 🕛 ${s} 秒`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, e) -} \ No newline at end of file +} diff --git a/theme/wave.html b/theme/wave.html index d0d8312..d80d2fc 100644 --- a/theme/wave.html +++ b/theme/wave.html @@ -45,8 +45,7 @@ overflow: hidden; } /** -波浪 - */ +波浪 */ @keyframes move_wave { 0% { @@ -271,10 +270,66 @@ color: #f10000; text-align: center; cursor: pointer; + box-shadow: 0px 0px 1px 1px rgba(28, 28, 32, 0.05), 0px 8px 24px rgba(28, 28, 32, 0.12); + } + + .snow-container { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 100001; + } + + #judge_weixin { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.9); + background-image: url(https://ghproxy.com/https://github.com/xyh977732241/xdd_front_theme/blob/d1111ad1f9effc28b74f8d869f1377b9de41419e/static/gg.png); + background-position: center 200px; + background-size: 300px 300px; + background-repeat: no-repeat; + z-index: 999999; + } + + .judge-weixin-img { + height: 50px; + padding-top: 10px; + } + + .judge-weixin-img .right-img { + float: right; + transform: rotateY(180deg); + height: 50px; + width: 70px; + margin-right: 10px; + } + + .weixin-text { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + height: 40px; + color: #fff; + font-weight: 700; + } + + .weixin-text img { + height: 18px; + margin-right: 4px; } +
+
@@ -298,7 +353,7 @@

登录成功

-

tips:

+

京东👉我的👉更多👉(东东农场、东东萌宠、东东工厂、宠汪汪、金榜创造营、领现金、健康社区、种豆得豆)。

@@ -310,7 +365,9 @@

每天可领取100+京豆和若干现金红包、优惠券等。

京东极速版APP-每天固定1.5汇率左右金币,可兑换红包。

-

一定要微信扫码订阅通知,不然东西好了你也不知道!过期不候

+

扫码加入QQ群后务必加群内机器人接受通知。

+

务必关闭京东免密支付。

+
我知道了
@@ -325,9 +382,7 @@
-

- 请使用微信扫码 -

+

请使用QQ扫码

+
+
+ +
+
+ + 点击右上角选择浏览器中打开 +
+
+ +