2021-08-15 09:48:05 +08:00
|
|
|
|
package models
|
2021-08-16 17:35:27 +08:00
|
|
|
|
|
2021-08-16 19:23:59 +08:00
|
|
|
|
import (
|
2021-08-16 23:08:04 +08:00
|
|
|
|
"bufio"
|
2021-08-28 09:52:25 +08:00
|
|
|
|
"fmt"
|
2021-08-16 19:23:59 +08:00
|
|
|
|
"io"
|
2021-08-28 09:52:25 +08:00
|
|
|
|
"net/url"
|
2021-08-16 19:23:59 +08:00
|
|
|
|
"os"
|
2021-08-16 22:14:06 +08:00
|
|
|
|
"os/exec"
|
2021-08-28 09:52:25 +08:00
|
|
|
|
"regexp"
|
2021-08-16 19:23:59 +08:00
|
|
|
|
"strings"
|
2021-08-20 15:45:59 +08:00
|
|
|
|
"time"
|
2021-08-16 19:23:59 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/beego/beego/v2/client/httplib"
|
|
|
|
|
|
"github.com/beego/beego/v2/core/logs"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2021-08-16 17:35:27 +08:00
|
|
|
|
type Task struct {
|
2021-08-21 16:23:34 +08:00
|
|
|
|
ID int
|
2021-08-22 21:10:37 +08:00
|
|
|
|
EntryID int
|
2021-08-21 16:23:34 +08:00
|
|
|
|
Cron string
|
|
|
|
|
|
Path string
|
2021-08-22 21:10:37 +08:00
|
|
|
|
Enable string
|
2021-08-21 16:23:34 +08:00
|
|
|
|
Mode string
|
|
|
|
|
|
Word string
|
|
|
|
|
|
Name string
|
|
|
|
|
|
Timeout int
|
|
|
|
|
|
Args string
|
2021-08-22 21:10:37 +08:00
|
|
|
|
Hack string
|
2021-08-21 16:23:34 +08:00
|
|
|
|
Git string
|
2021-08-21 21:27:06 +08:00
|
|
|
|
Title string
|
2021-08-22 21:10:37 +08:00
|
|
|
|
Running string
|
2021-08-28 09:52:25 +08:00
|
|
|
|
Envs []Env `gorm:"-"`
|
2021-08-16 17:35:27 +08:00
|
|
|
|
}
|
2021-08-16 19:23:59 +08:00
|
|
|
|
|
|
|
|
|
|
func initTask() {
|
2021-08-21 17:12:13 +08:00
|
|
|
|
// for i := range Config.Tasks {
|
|
|
|
|
|
// if Config.Tasks[i].Cron != "" {
|
|
|
|
|
|
// createTask(&Config.Tasks[i])
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
2021-08-16 19:23:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func createTask(task *Task) {
|
|
|
|
|
|
id, err := c.AddFunc(task.Cron, func() {
|
2021-08-28 09:52:25 +08:00
|
|
|
|
runTask(task, &Sender{})
|
2021-08-16 19:23:59 +08:00
|
|
|
|
})
|
|
|
|
|
|
if err != nil {
|
2021-08-16 22:14:06 +08:00
|
|
|
|
logs.Warn(task.Word, "任务创建失败")
|
2021-08-16 19:23:59 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
task.ID = int(id)
|
2021-08-16 22:14:06 +08:00
|
|
|
|
logs.Info(task.Word, "任务创建成功")
|
2021-08-16 19:23:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-08-28 09:52:25 +08:00
|
|
|
|
func runTask(task *Task, sender *Sender) string {
|
2021-08-22 21:10:37 +08:00
|
|
|
|
task.Running = True
|
2021-08-21 21:27:06 +08:00
|
|
|
|
path := ""
|
|
|
|
|
|
if task.Git != "" {
|
|
|
|
|
|
path = task.Git + "/" + task.Name
|
|
|
|
|
|
} else {
|
2021-08-16 23:08:04 +08:00
|
|
|
|
slice := strings.Split(task.Path, "/")
|
|
|
|
|
|
len := len(slice)
|
|
|
|
|
|
if len == 0 {
|
|
|
|
|
|
logs.Warn("取法识别的文件名")
|
2021-08-17 13:52:21 +08:00
|
|
|
|
return ""
|
2021-08-16 23:08:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
task.Name = slice[len-1]
|
2021-08-21 21:27:06 +08:00
|
|
|
|
path = ExecPath + "/scripts/" + task.Name
|
|
|
|
|
|
if strings.Contains(task.Path, "http") {
|
2021-08-17 17:53:42 +08:00
|
|
|
|
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
logs.Warn("打开%s失败,", path, err)
|
|
|
|
|
|
return ""
|
|
|
|
|
|
}
|
2021-08-21 21:27:06 +08:00
|
|
|
|
url := task.Path
|
|
|
|
|
|
if strings.Contains(url, "raw.githubusercontent.com") {
|
|
|
|
|
|
url = GhProxy + url
|
|
|
|
|
|
}
|
|
|
|
|
|
r, err := httplib.Get(url).Response()
|
2021-08-17 17:53:42 +08:00
|
|
|
|
if err != nil {
|
2021-08-21 21:27:06 +08:00
|
|
|
|
logs.Warn("下载%s失败,", task.Path, err)
|
2021-08-17 17:53:42 +08:00
|
|
|
|
}
|
2021-08-21 21:27:06 +08:00
|
|
|
|
io.Copy(f, r.Body)
|
2021-08-17 17:53:42 +08:00
|
|
|
|
f.Close()
|
2021-08-21 21:27:06 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
if path != task.Path && task.Name != task.Path {
|
|
|
|
|
|
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
logs.Warn("打开%s失败,", path, err)
|
|
|
|
|
|
return ""
|
|
|
|
|
|
}
|
|
|
|
|
|
f2, err := os.Open(task.Path)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
f.Close()
|
|
|
|
|
|
logs.Warn("打开%s失败,", path, err)
|
|
|
|
|
|
return ""
|
|
|
|
|
|
}
|
|
|
|
|
|
io.Copy(f, f2)
|
|
|
|
|
|
f2.Close()
|
|
|
|
|
|
f.Close()
|
|
|
|
|
|
}
|
2021-08-17 17:53:42 +08:00
|
|
|
|
}
|
2021-08-16 19:23:59 +08:00
|
|
|
|
}
|
2021-08-16 22:14:06 +08:00
|
|
|
|
lan := Config.Node
|
|
|
|
|
|
if strings.Contains(task.Name, ".py") {
|
|
|
|
|
|
lan = Config.Python
|
|
|
|
|
|
}
|
2021-08-23 10:58:36 +08:00
|
|
|
|
cmd := exec.Command(lan, task.Name)
|
2021-08-28 09:52:25 +08:00
|
|
|
|
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))
|
|
|
|
|
|
}
|
2021-08-16 23:08:04 +08:00
|
|
|
|
stdout, err := cmd.StdoutPipe()
|
2021-08-19 10:05:17 +08:00
|
|
|
|
stderr, err := cmd.StderrPipe()
|
2021-08-16 23:08:04 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
logs.Warn("cmd.StdoutPipe: ", err)
|
2021-08-17 13:52:21 +08:00
|
|
|
|
return ""
|
2021-08-16 23:08:04 +08:00
|
|
|
|
}
|
2021-08-21 21:27:06 +08:00
|
|
|
|
if task.Git != "" {
|
|
|
|
|
|
cmd.Dir = task.Git
|
|
|
|
|
|
} else {
|
|
|
|
|
|
cmd.Dir = ExecPath + "/scripts/"
|
|
|
|
|
|
}
|
2021-08-16 23:08:04 +08:00
|
|
|
|
err = cmd.Start()
|
2021-08-16 22:14:06 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
logs.Warn("%v", err)
|
2021-08-17 13:52:21 +08:00
|
|
|
|
return ""
|
2021-08-16 23:08:04 +08:00
|
|
|
|
}
|
2021-08-19 10:05:17 +08:00
|
|
|
|
go func() {
|
|
|
|
|
|
msg := ""
|
|
|
|
|
|
reader := bufio.NewReader(stderr)
|
|
|
|
|
|
for {
|
|
|
|
|
|
line, err2 := reader.ReadString('\n')
|
|
|
|
|
|
if err2 != nil || io.EOF == err2 {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
msg += line
|
|
|
|
|
|
}
|
2021-08-19 10:07:37 +08:00
|
|
|
|
if msg != "" {
|
2021-08-28 09:52:25 +08:00
|
|
|
|
sender.Reply(msg)
|
2021-08-19 10:07:37 +08:00
|
|
|
|
}
|
2021-08-19 10:05:17 +08:00
|
|
|
|
}()
|
2021-08-21 16:23:34 +08:00
|
|
|
|
msg := ""
|
2021-08-16 23:08:04 +08:00
|
|
|
|
reader := bufio.NewReader(stdout)
|
2021-08-21 16:23:34 +08:00
|
|
|
|
st := time.Now()
|
2021-08-16 23:08:04 +08:00
|
|
|
|
for {
|
|
|
|
|
|
line, err2 := reader.ReadString('\n')
|
|
|
|
|
|
if err2 != nil || io.EOF == err2 {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
2021-08-28 09:52:25 +08:00
|
|
|
|
if task.Name == "jd_get_share_code.js" {
|
|
|
|
|
|
rt := findShareCode(line)
|
|
|
|
|
|
if rt != "" {
|
|
|
|
|
|
sender.Reply(rt)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-08-17 14:15:35 +08:00
|
|
|
|
msg += line
|
2021-08-21 16:23:34 +08:00
|
|
|
|
nt := time.Now()
|
|
|
|
|
|
if (nt.Unix() - st.Unix()) > 1 {
|
2021-08-28 09:52:25 +08:00
|
|
|
|
sender.Reply(msg)
|
2021-08-21 16:23:34 +08:00
|
|
|
|
st = nt
|
|
|
|
|
|
msg = ""
|
2021-08-17 13:36:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-08-21 16:23:34 +08:00
|
|
|
|
if msg != "" {
|
2021-08-28 09:52:25 +08:00
|
|
|
|
sender.Reply(msg)
|
2021-08-16 22:14:06 +08:00
|
|
|
|
}
|
2021-08-22 21:10:37 +08:00
|
|
|
|
task.Running = False
|
2021-08-17 13:52:21 +08:00
|
|
|
|
return msg
|
2021-08-16 19:23:59 +08:00
|
|
|
|
}
|
2021-08-28 09:52:25 +08:00
|
|
|
|
|
|
|
|
|
|
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 ""
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|