package models import ( "fmt" "io/ioutil" "os" "regexp" "strconv" "strings" "time" "github.com/beego/beego/v2/client/httplib" "github.com/beego/beego/v2/core/logs" ) var SendQQ = func(a int64, b interface{}) { } var SendQQGroup = func(a int64, b int64, c interface{}) { } var ListenQQPrivateMessage = func(uid int64, msg string) { SendQQ(uid, handleMessage(msg, "qq", int(uid))) } var ListenQQGroupMessage = func(gid int64, uid int64, msg string) { if gid == Config.QQGroupID { if Config.QbotPublicMode { SendQQGroup(gid, uid, handleMessage(msg, "qqg", int(uid), int(gid))) } else { SendQQ(uid, handleMessage(msg, "qq", int(uid))) } } } var replies = map[string]string{} func AggQQ() { } func InitReplies() { f, err := os.Open(ExecPath + "/conf/reply.php") if err == nil { defer f.Close() data, _ := ioutil.ReadAll(f) ss := regexp.MustCompile("`([^`]+)`\\s*=>\\s*`([^`]+)`").FindAllStringSubmatch(string(data), -1) for _, s := range ss { replies[s[1]] = s[2] } } if _, ok := replies["壁纸"]; !ok { replies["壁纸"] = "https://acg.toubiec.cn/random.php" } } var handleMessage = func(msgs ...interface{}) interface{} { msg := msgs[0].(string) 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 } if sender.IsAdmin == false { if IsUserAdmin(strconv.Itoa(sender.UserID)) { 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 { default: { //沃邮箱 ss := regexp.MustCompile(`https://nyan.mail.*3D`).FindStringSubmatch(msg) if len(ss) > 0 { var u User if db.Where("number = ?", sender.UserID).First(&u).Error != nil { return 0 } db.Model(u).Updates(map[string]interface{}{ "womail": ss[0], }) sender.Reply(fmt.Sprintf("沃邮箱提交成功!")) return nil } } { ss := regexp.MustCompile(`pin=([^;=\s]+);wskey=([^;=\s]+)`).FindAllStringSubmatch(msg, -1) if len(ss) > 0 { for _, s := range ss { wkey := "pin=" + s[1] + ";wskey=" + s[2] + ";" //rsp := cmd(fmt.Sprintf(`python3 test.py "%s"`, wkey), &Sender{}) rsp, err := getKey(wkey) if err != nil { logs.Error(err) } if strings.Contains(rsp, "fake_") { logs.Error("wskey错误") sender.Reply(fmt.Sprintf("wskey错误 除京东APP皆不可用")) } else { ptKey := FetchJdCookieValue("pt_key", rsp) ptPin := FetchJdCookieValue("pt_pin", rsp) ck := JdCookie{ PtPin: ptPin, PtKey: ptKey, WsKey: s[2], } if CookieOK(&ck) { if sender.IsQQ() { ck.QQ = sender.UserID } else if sender.IsTG() { ck.Telegram = sender.UserID } if nck, err := GetJdCookie(ck.PtPin); err == nil { nck.InPool(ck.PtKey) if nck.WsKey == "" || len(nck.WsKey) == 0 { if sender.IsQQ() { ck.Update(QQ, ck.QQ) } nck.Update(WsKey, ck.WsKey) msg := fmt.Sprintf("写入WsKey,并更新账号%s", ck.PtPin) sender.Reply(fmt.Sprintf(msg)) (&JdCookie{}).Push(msg) logs.Info(msg) } else { if nck.WsKey == ck.WsKey { msg := fmt.Sprintf("重复写入") sender.Reply(fmt.Sprintf(msg)) (&JdCookie{}).Push(msg) logs.Info(msg) } else { nck.Updates(JdCookie{ WsKey: ck.WsKey, }) msg := fmt.Sprintf("更新WsKey,并更新账号%s", ck.PtPin) sender.Reply(fmt.Sprintf(msg)) (&JdCookie{}).Push(msg) logs.Info(msg) } } } else { NewJdCookie(&ck) msg := fmt.Sprintf("添加账号,账号名:%s", ck.PtPin) if sender.IsQQ() { ck.Update(QQ, ck.QQ) } sender.Reply(fmt.Sprintf(msg)) sender.Reply(ck.Query()) (&JdCookie{}).Push(msg) } } go func() { Save <- &JdCookie{} }() return nil } } } } { //tyt ss := regexp.MustCompile(`packetId=(\S+)(&|&)currentActId`).FindStringSubmatch(msg) if len(ss) > 0 { if !sender.IsAdmin { coin := GetCoin(sender.UserID) if coin < Config.Tyt { return fmt.Sprintf("推一推需要%d个互助值", Config.Tyt) } RemCoin(sender.UserID, Config.Tyt) 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) return nil } } { if strings.Contains(msg, "pt_key") { ptKey := FetchJdCookieValue("pt_key", msg) ptPin := FetchJdCookieValue("pt_pin", msg) if len(ptPin) > 0 && len(ptKey) > 0 { ck := JdCookie{ PtKey: ptKey, PtPin: ptPin, } if CookieOK(&ck) { if sender.IsQQ() { ck.QQ = sender.UserID } else if sender.IsTG() { ck.Telegram = sender.UserID } if HasKey(ck.PtKey) { sender.Reply(fmt.Sprintf("重复提交")) } else { if nck, err := GetJdCookie(ck.PtPin); err == nil { nck.InPool(ck.PtKey) msg := fmt.Sprintf("更新账号,%s", ck.PtPin) if sender.IsQQ() { ck.Update(QQ, ck.QQ) } sender.Reply(fmt.Sprintf(msg)) (&JdCookie{}).Push(msg) logs.Info(msg) } else { if Cdle { ck.Hack = True } NewJdCookie(&ck) msg := fmt.Sprintf("添加账号,账号名:%s", ck.PtPin) if sender.IsQQ() { ck.Update(QQ, ck.QQ) } sender.Reply(fmt.Sprintf(msg)) sender.Reply(ck.Query()) (&JdCookie{}).Push(msg) logs.Info(msg) } } } else { sender.Reply(fmt.Sprintf("无效")) } } go func() { Save <- &JdCookie{} }() return nil } } { 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() if err != nil { return nil } ctp := rsp.Header.Get("content-type") if ctp == "" { rsp.Header.Get("Content-Type") } if strings.Contains(ctp, "text") || strings.Contains(ctp, "json") { data, _ := ioutil.ReadAll(rsp.Body) return string(data) } return rsp } return v } } } 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 "" } }