This commit is contained in:
ZJY 2021-10-20 16:42:05 +08:00
commit 9adbbfdf96
13 changed files with 176 additions and 121 deletions

View File

@ -15,6 +15,7 @@ Wskey: # 填空默认禁用wskey转换 需要的填true
IsAddFriend: #填写true或者false false
Lim: #填写1-N 代表限制次数
Tyt: #填写1-N 代表推一推需要的互助值默认为8
Later: #延时防止黑IP自己设置 默认60 不怕黑的改为1即可 单位是秒
theme:
static: ./static
master:

View File

@ -210,15 +210,13 @@ func init() {
jd_token := k.(string)
vv := v.([]interface{})
if len(vv) >= 2 {
//cookie := vv[0].(string)
//okl_token := vv[1].(string)
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)
result, ck := CheckLogin(jd_token, cookie, okl_token)
// fmt.Println(result)
switch result {
case "成功":
@ -301,28 +299,40 @@ func (c *LoginController) Query() {
}
}
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))
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("redirectUrl", q.Data.RedirectURL)
req.Param("state", q.Data.State)
req.Param("tempCookie", q.Data.TempCookie)
req.Param("lSid", q.Data.LSid)
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 := StepThree1{}
sth := StepThree{}
err = json.Unmarshal(data, &sth)
if err != nil {
return "", nil //err.Error()
}
switch sth.Code {
switch sth.Errcode {
case 0:
cookies := strings.Join(rsp.Header.Values("Set-Cookie"), " ")
pt_key := FetchJdCookieValue("pt_key", cookies)
@ -355,19 +365,19 @@ func CheckLogin(q models.QQuery, token string) (string, *models.JdCookie) {
}()
JdCookieRunners.Store(token, []interface{}{pt_pin})
return "成功", &ck
case 500: //Token无效请退出重试
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
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)

View File

@ -123,7 +123,7 @@ func initCookie() {
cks := GetJdCookies()
//l := len(cks)
for i := range cks {
time.Sleep(time.Second * time.Duration(60))
time.Sleep(time.Second * time.Duration(Config.Later))
if cks[i].Available == True && !CookieOK(&cks[i]) {
logs.Info("开始禁用")
cks[i].OutPool()
@ -243,10 +243,10 @@ func CookieOK(ck *JdCookie) bool {
}
ui := &UserInfoResult{}
if nil != json.Unmarshal(data, ui) {
if !Config.IFC {
(&JdCookie{}).Push("第一个接口失效切换到第二个接口可能黑IP")
Config.IFC = true
}
//if !Config.IFC {
// (&JdCookie{}).Push("第一个接口失效切换到第二个接口可能黑IP会导致NickName获取失败可能会自行恢复。")
// Config.IFC = true
//}
b2 := av2(cookie)
if b2 == false {
if ck.Available == True {
@ -298,10 +298,10 @@ func CookieOK(ck *JdCookie) bool {
return true
}
}
if Config.IFC {
(&JdCookie{}).Push("第一个接口恢复切换回第一接口恭喜你IP洗白白了")
Config.IFC = false
}
//if Config.IFC {
// (&JdCookie{}).Push("第一个接口恢复切换回第一接口恭喜你IP洗白白了")
// Config.IFC = false
//}
switch ui.Retcode {
case "1001": //ck.BeanNum
if ui.Msg == "not login" {
@ -370,7 +370,7 @@ func CookieOK(ck *JdCookie) bool {
}
return true
}
(&JdCookie{}).Push("第一个接口失效切换到第二个接口可能黑IP")
//(&JdCookie{}).Push("第一个接口失效切换到第二个接口可能黑IP")
return av2(cookie)
}
@ -393,7 +393,10 @@ func av2(cookie string) bool {
} else if strings.Contains(data, "nickname") {
return true
} else {
(&JdCookie{}).Push("第二个接口失效可能黑IP")
if !Config.IFC {
(&JdCookie{}).Push("全部接口都失效现已无法检测可能黑IP会导致NickName获取失败可能会自行恢复。")
Config.IFC = true
}
return true
}
return !strings.Contains(data, "login")

View File

@ -119,9 +119,9 @@ var handleMessage = func(msgs ...interface{}) interface{} {
if err != nil {
logs.Error(err)
}
if strings.Contains(rsp, "错误") {
if strings.Contains(rsp, "fake_") {
logs.Error("wskey错误")
sender.Reply(fmt.Sprintf("wskey错误"))
sender.Reply(fmt.Sprintf("wskey错误 除京东APP皆不可用"))
} else {
ptKey := FetchJdCookieValue("pt_key", rsp)
ptPin := FetchJdCookieValue("pt_pin", rsp)
@ -197,7 +197,10 @@ var handleMessage = func(msgs ...interface{}) interface{} {
}
RemCoin(sender.UserID, 8)
sender.Reply(fmt.Sprintf("推一推即将开始,已扣除%d个互助值", Config.Tyt))
} else {
sender.Reply(fmt.Sprintf("推一推即将开始,已扣除%d个互助值管理员通道", Config.Tyt))
}
runTask(&Task{Path: "jd_tyt.js", Envs: []Env{
{Name: "tytpacketId", Value: ss[1]},
}}, sender)

View File

@ -1,13 +1,11 @@
package models
import (
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"github.com/beego/beego/v2/client/httplib"
"github.com/beego/beego/v2/core/logs"
"io/ioutil"
"github.com/beego/beego/v2/server/web"
"regexp"
"strings"
"time"
@ -142,28 +140,42 @@ var codeSignals = []CodeSignal{
{
Command: []string{"qrcode", "扫码", "二维码", "scan"},
Handle: func(sender *Sender) interface{} {
rsp, err := httplib.Post("https://api.kukuqaq.com/jd/qrcode").Response()
url := fmt.Sprintf("http://127.0.0.1:%d/api/login/qrcode.png?tp=%s&uid=%d&gid=%d", web.BConfig.Listen.HTTPPort, sender.Type, sender.UserID, sender.ChatID)
if sender.Type == "tgg" {
url += fmt.Sprintf("&mid=%v&unm=%v", sender.MessageID, sender.Username)
}
rsp, err := httplib.Get(url).Response()
if err != nil {
return nil
}
body, err1 := ioutil.ReadAll(rsp.Body)
if err1 == nil {
fmt.Println(string(body))
}
s := &QQuery{}
if len(body) > 0 {
json.Unmarshal(body, &s)
}
logs.Info(s.Data.QqLoginQrcode.Bytes)
ddd, _ := base64.StdEncoding.DecodeString(s.Data.QqLoginQrcode.Bytes) //成图片文件并把文件写入到buffer
err2 := ioutil.WriteFile("./output.jpg", ddd, 0666) //buffer输出到jpg文件中不做处理直接写到文件
if err2 != nil {
logs.Error(err2)
}
//ddd, _ := base64.StdEncoding.DecodeString("data:image/png;base64,"+s.Data.QqLoginQrcode.Bytes)
return "data:image/png;base64," + s.Data.QqLoginQrcode.Bytes
return rsp
},
},
//{
// Command: []string{"qrcode", "扫码", "二维码", "scan"},
// Handle: func(sender *Sender) interface{} {
// rsp, err := httplib.Post("https://api.kukuqaq.com/jd/qrcode").Response()
// if err != nil {
// return nil
// }
// body, err1 := ioutil.ReadAll(rsp.Body)
// if err1 == nil {
// fmt.Println(string(body))
// }
// s := &QQuery{}
// if len(body) > 0 {
// json.Unmarshal(body, &s)
// }
// logs.Info(s.Data.QqLoginQrcode.Bytes)
// ddd, _ := base64.StdEncoding.DecodeString(s.Data.QqLoginQrcode.Bytes) //成图片文件并把文件写入到buffer
// err2 := ioutil.WriteFile("./output.jpg", ddd, 0666) //buffer输出到jpg文件中不做处理直接写到文件
// if err2 != nil {
// logs.Error(err2)
// }
// //ddd, _ := base64.StdEncoding.DecodeString("data:image/png;base64,"+s.Data.QqLoginQrcode.Bytes)
// return "data:image/png;base64," + s.Data.QqLoginQrcode.Bytes
// },
//},
{
Command: []string{"sign", "打卡", "签到"},
Handle: func(sender *Sender) interface{} {
@ -380,6 +392,21 @@ var codeSignals = []CodeSignal{
return "已取消管理员"
},
},
{
Command: []string{"QQ转账"},
Admin: true,
Handle: func(sender *Sender) interface{} {
qq := Int(sender.Contents[0])
logs.Info(qq)
if len(sender.Contents) > 1 {
//sender.Contents = sender.Contents[1:]
logs.Info(sender.Contents[1:])
AdddCoin(qq, Int(sender.Contents[1]))
sender.Reply(fmt.Sprintf("%d已增加%d枚互助值。", qq, Int(sender.Contents[1])))
}
return nil
},
},
/*
{
Command: []string{"我要钱", "给点钱", "我干", "给我钱", "给我", "我要"},
@ -963,7 +990,7 @@ var codeSignals = []CodeSignal{
return nil
},
},
{
{
Command: []string{"导出wsk"},
Admin: true,
Handle: func(sender *Sender) interface{} {

View File

@ -43,6 +43,7 @@ type Yaml struct {
Lim int `yaml:"Lim"`
Tyt int `yaml:"Tyt"`
IFC bool `yaml:"IFC"`
Later int `yaml:"Later"`
Node string
Npm string
Python string
@ -108,6 +109,9 @@ func initConfig() {
if Config.Tyt == 0 {
Config.Tyt = 8
}
if Config.Later == 0 {
Config.Later = 60
}
if Config.Database == "" {
Config.Database = ExecPath + "/.xdd.db"
}

View File

@ -60,9 +60,9 @@ func initContainer() {
version, err := GetQlVersion(Config.Containers[i].Address)
if err == nil {
if Config.Containers[i].getToken() == nil {
logs.Info("青龙" + version + "登录成功")
logs.Info("青龙" + version + "通道登录成功")
} else {
logs.Warn("青龙" + version + "登录失败")
logs.Warn("青龙" + version + "通道登录失败")
}
Config.Containers[i].Type = "ql"
Config.Containers[i].Version = version
@ -116,7 +116,7 @@ func initContainer() {
func (c *Container) write(cks []JdCookie) error {
switch c.Type {
case "ql":
if c.Version == "2.9" || c.Version == "2.8" {
if c.Version == "openapi" {
if len(c.Delete) > 0 {
c.request("/api/envs", DELETE, fmt.Sprintf(`[%s]`, strings.Join(c.Delete, ",")))
}
@ -241,7 +241,7 @@ func (c *Container) read() error {
c.Available = true
switch c.Type {
case "ql":
if c.Version == "2.9" || c.Version == "2.8" {
if c.Version == "openapi" {
type AutoGenerated struct {
Code int `json:"code"`
Data []struct {
@ -355,35 +355,13 @@ func (c *Container) read() error {
func (c *Container) getToken() error {
version, err := GetQlVersion(c.Address)
logs.Debug(err)
if version == "2.9" {
token, err := getSqlToken(c.Address)
if err != nil {
logs.Error(err)
if version == "openapi" {
token := &Token{}
err, b2 := getT(c, token)
if b2 {
c.Token = token.Token
}
getT(c, token)
c.Token = token.Token
//if token == nil {
// err2, done := getT(c, token)
// if done {
// return err2
// }
//} else {
// logs.Info("缓存token")
// h, _ := time.ParseDuration("-624h")
// tZero := time.Now().Add(h)
// logs.Info(tZero)
// logs.Info(token.Expiration)
// t_ := token.Expiration.Sub(tZero)
// if t_ < 0 {
// err2, done := getT(c, token)
// if done {
// return err2
// }
// } else {
// logs.Info("获取缓存成功")
// c.Token = token.Token
// }
//}
return err
} else {
req := httplib.Post(c.Address + "/api/login")
req.Header("Content-Type", "application/json;charset=UTF-8")
@ -418,7 +396,6 @@ func getT(c *Container, token *Token) (error, bool) {
zero, _ := time.ParseInLocation("2006-01-02", time.Now().Local().Format("2006-01-02"), time.Local)
token.Expiration = zero
token.Address = c.Address
setSqlToken(token)
logs.Info(c.Token + token.Expiration.String())
} else {
return err, true
@ -432,7 +409,7 @@ func (c *Container) request(ss ...string) ([]byte, error) {
if s == GET || s == POST || s == PUT || s == DELETE {
method = s
} else if strings.Contains(s, "/api/") {
if c.Version == "2.9" {
if c.Version == "openapi" {
api = strings.ReplaceAll(s, "api", "open")
} else {
api = s
@ -491,14 +468,10 @@ func GetQlVersion(address string) (string, error) {
}
v := ""
//logs.Info(data)
if strings.Contains(data, "v2.8") {
v = "2.8"
} else if strings.Contains(data, "v2.2") {
v = "2.2"
} else if strings.Contains(data, "v2.9") {
v = "2.9"
if strings.Contains(data, "v2.2") {
v = "api"
} else {
v = "2.9"
v = "openapi"
}
return v, nil
}

View File

@ -321,17 +321,3 @@ func CheckIn(pin, key string) int {
}
return 2
}
func setSqlToken(token *Token) error {
tx := db.Begin()
if err := tx.Create(token).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
func getSqlToken(address string) (*Token, error) {
token := &Token{}
return token, db.Where(Address+" = ?", address).Order("expiration desc").First(token).Error
}

View File

@ -11,8 +11,8 @@ import (
"github.com/beego/beego/v2/core/logs"
)
var version = "20211002"
var describe = "国庆版本"
var version = "20211011"
var describe = "最终稳定版"
var AppName = "xdd"
var pname = regexp.MustCompile(`/([^/\s]+)`).FindStringSubmatch(os.Args[0])[1]

View File

@ -2,11 +2,33 @@
## 注意事项
1. master:的值即为密码后面不可带注释全匹配方可登录也不要pt_pin 可自定义
2. 2.9+版本需要配置 cid和secret 在青龙里面系统设置,添加应用后配置
1. master:的值即为密码后面不可带注释全匹配方可登录也不要pt_pin 可自定义
2. 2.9+版本需要配置 cid和secret 在青龙里面系统设置,添加应用后配置
# 支持作者
就当是支持支持作者更新吧 谢谢各位了。 几毛钱的包愿意就当支持我了 每天都可以领一次 建议保存到本地 辛苦了 不愿意也没事 几块钱的大家可以去买瓶水喝
<img src="https://i.loli.net/2021/10/11/odcbTfw4LM9svOS.jpg" alt="1.jpg" style="zoom:33%;" /><img src="https://i.loli.net/2021/10/11/ru73IykXez9g48K.jpg" alt="2.jpg" style="zoom: 23%;" />
# 更新日志
## 10-11
- 适配V2.8+版本包括即将来的3.0版本都适配了 = - 基本你们能用到黄了把
- 修复了QQ转账功能
## 10-07
- 新增延时设置,怕黑号调高,不怕的调低
## 10-04
- 新增QQ转账功能 格式 QQ转账 QQ 钱 例如 QQ转账 7647 100
- 各位大老爷支持支持作者吧 谢谢啦
## 10-03
- 修复空pin可导入问题
@ -123,6 +145,32 @@ fix 重大BUG修复解决以下几个问题
以及大大小小的模块作者
# 安装教程
xdd-plus安装教程
第一步下载go
cd /usr/local && wget https://golang.google.cn/dl/go1.16.7.linux-amd64.tar.gz -O go1.16.7.linux-amd64.tar.gz
第二步解压go
tar -xvzf go1.16.7.linux-amd64.tar.gz
第三步:设置环境变量
vi /etc/profile
将文本复制到最后一行
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
export GOROOT=/usr/local/go
export GOPATH=/usr/local/go/path
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
第五步:先按 esc
然后输入 :wq
保存文件后
source /etc/profile
第六步检查go安装
go env
第七步拉xdd-plus的库
cd ~ && git clone https://ghproxy.com/https://github.com/764763903a/xdd-plus.git
第八步编译xdd-plus
cd /root/xdd-plus && go build
# 常见问题
编码问题参考

View File

@ -42,7 +42,7 @@ let tools = []
data = await openRedEnvelopeInteract({redEnvelopeId: helps[0].redEnvelopeId,inviter: helps[0].markedPin, helpType:"1"})
errMsg = data?.data?.helpResult?.errMsg
if(errMsg){
console.log(`${tool.id}->${helps[0].id} ${errMsg}`)
// console.log(`${tool.id}->${helps[0].id} ${errMsg}`)
if(errMsg.indexOf("成功提现")!=-1){
console.log(errMsg)
helps.shift()

BIN
static/hb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
static/zfb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB