xdd-plus/models/task.go

219 lines
4.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package models
import (
"bufio"
"fmt"
"io"
"net/url"
"os"
"os/exec"
"regexp"
"strings"
"time"
"github.com/beego/beego/v2/client/httplib"
"github.com/beego/beego/v2/core/logs"
)
type Task struct {
ID int
EntryID int
Cron string
Path string
Enable string
Mode string
Word string
Name string
Timeout int
Args string
Hack string
Git string
Title string
Running string
Envs []Env `gorm:"-"`
}
func initTask() {
// for i := range Config.Tasks {
// if Config.Tasks[i].Cron != "" {
// createTask(&Config.Tasks[i])
// }
// }
}
func createTask(task *Task) {
id, err := c.AddFunc(task.Cron, func() {
runTask(task, &Sender{})
})
if err != nil {
logs.Warn(task.Word, "任务创建失败")
} else {
task.ID = int(id)
logs.Info(task.Word, "任务创建成功")
}
}
func runTask(task *Task, sender *Sender) string {
task.Running = True
path := ""
if task.Git != "" {
path = task.Git + "/" + task.Name
} else {
slice := strings.Split(task.Path, "/")
len := len(slice)
if len == 0 {
logs.Warn("取法识别的文件名")
return ""
}
task.Name = slice[len-1]
path = ExecPath + "/scripts/" + task.Name
if strings.Contains(task.Path, "http") {
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
if err != nil {
logs.Warn("打开%s失败", path, err)
return ""
}
url := task.Path
if strings.Contains(url, "raw.githubusercontent.com") {
url = GhProxy + url
}
r, err := httplib.Get(url).Response()
if err != nil {
logs.Warn("下载%s失败", task.Path, err)
}
io.Copy(f, r.Body)
f.Close()
} 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()
}
}
}
lan := Config.Node
if strings.Contains(task.Name, ".py") {
lan = Config.Python
}
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 {
logs.Warn("cmd.StdoutPipe: ", err)
return ""
}
if task.Git != "" {
cmd.Dir = task.Git
} else {
cmd.Dir = ExecPath + "/scripts/"
}
err = cmd.Start()
if err != nil {
logs.Warn("%v", err)
return ""
}
go func() {
msg := ""
reader := bufio.NewReader(stderr)
for {
line, err2 := reader.ReadString('\n')
if err2 != nil || io.EOF == err2 {
break
}
msg += line
}
if msg != "" {
sender.Reply(msg)
}
}()
msg := ""
reader := bufio.NewReader(stdout)
st := time.Now()
for {
line, err2 := reader.ReadString('\n')
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 {
sender.Reply(msg)
st = nt
msg = ""
}
}
if msg != "" {
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 ""
}
}