diff --git a/controllers/guardian.go b/controllers/guardian.go new file mode 100644 index 0000000..b7d8db8 --- /dev/null +++ b/controllers/guardian.go @@ -0,0 +1,21 @@ +package controllers + +import ( + "Mmx/global" + "Mmx/util" + "time" +) + +func Guardian() { + for { + time.Sleep(time.Duration(global.Config.Settings.Guardian) * time.Second) + go func() { + defer func() { + _ = recover() + }() + if !util.Checker.NetOk() { + Login(false) + } + }() + } +} diff --git a/controllers/login.go b/controllers/login.go new file mode 100644 index 0000000..3c17aed --- /dev/null +++ b/controllers/login.go @@ -0,0 +1,105 @@ +package controllers + +import ( + "Mmx/global" + "Mmx/request" + "Mmx/util" + "encoding/json" + "fmt" + "time" +) + +func Login(output bool) { + global.Status.Output = output + util.Log.Println("Step0: 检查状态…") + G := global.Config.Generate() + + if !global.Status.Daemon && global.Config.Settings.QuitIfNetOk && util.Checker.NetOk() { + util.Log.Println("网络正常,程序退出") + return + } + + util.Log.Println("Step1: 正在获取客户端ip") + { + body, err := request.Get(G.UrlLoginPage, nil) + if err != nil { + util.ErrHandler(err) + return + } + G.Ip, err = util.GetIp(body) + if err != nil { + util.ErrHandler(err) + return + } + } + util.Log.Println("Step2: 正在获取Token") + { + data, err := request.Get(G.UrlGetChallengeApi, map[string]string{ + "callback": "jsonp1583251661367", + "username": G.Form.UserName, + "ip": G.Ip, + }) + if err != nil { + util.ErrHandler(err) + return + } + G.Token, err = util.GetToken(data) + if err != nil { + util.ErrHandler(err) + return + } + } + util.Log.Println("Step3: 执行登录…") + { + info, err := json.Marshal(map[string]string{ + "username": G.Form.UserName, + "password": G.Form.PassWord, + "ip": G.Ip, + "acid": G.Meta.Acid, + "enc_ver": G.Meta.Enc, + }) + if err != nil { + util.ErrHandler(err) + return + } + G.EncryptedInfo = "{SRBX1}" + util.Base64(util.XEncode(string(info), G.Token)) + G.Md5 = util.Md5(G.Token) + G.EncryptedMd5 = "{MD5}" + G.Md5 + + var chkstr = G.Token + G.Form.UserName + G.Token + G.Md5 + chkstr += G.Token + G.Meta.Acid + G.Token + G.Ip + chkstr += G.Token + G.Meta.N + G.Token + G.Meta.Type + chkstr += G.Token + G.EncryptedInfo + G.EncryptedChkstr = util.Sha1(chkstr) + + res, err := request.Get(G.UrlLoginApi, map[string]string{ + "callback": "jQuery112401157665", + "action": "login", + "username": G.Form.UserName, + "password": G.EncryptedMd5, + "ac_id": G.Meta.Acid, + "ip": G.Ip, + "info": G.EncryptedInfo, + "chksum": G.EncryptedChkstr, + "n": G.Meta.N, + "type": G.Meta.Type, + "os": "Windows 10", + "name": "windows", + "double_stack": "0", + "_": fmt.Sprint(time.Now().UnixNano()), + }) + if err != nil { + util.ErrHandler(err) + return + } + G.LoginResult, err = util.GetResult(res) + if err != nil { + util.ErrHandler(err) + return + } + util.Log.Println("登录结果: " + G.LoginResult) + if global.Config.Settings.DemoMode { + util.Log.Println(res) + } + } +} diff --git a/global/global.go b/global/global.go index 80aa849..7dfbd9a 100644 --- a/global/global.go +++ b/global/global.go @@ -3,3 +3,8 @@ package global import "Mmx/Modles" var Config *modles.Config + +var Status struct { + Output bool + Daemon bool +} diff --git a/main.go b/main.go index 86c1749..076a5a0 100644 --- a/main.go +++ b/main.go @@ -1,17 +1,22 @@ package main import ( - "Mmx/Global" - "Mmx/Request" "Mmx/Util" - "encoding/json" - "fmt" + "Mmx/controllers" + "Mmx/global" + "flag" "os" + "os/exec" "runtime" - "time" ) func main() { + goDaemon := flag.Bool("daemon", false, "") + flag.Parse() + if *goDaemon { + controllers.Guardian() + } + defer func() { if e := recover(); e != nil { util.Log.Println(e) @@ -20,74 +25,19 @@ func main() { os.Exit(1) } }() - util.Log.Println("Step0: 检查状态…") - G := global.Config.Generate() + controllers.Login(true) - if global.Config.Settings.QuitIfNetOk && util.Checker.NetOk() { - util.Log.Println("网络正常,程序退出") - return - } - - util.Log.Println("Step1: 正在获取客户端ip") - { - body, err := request.Get(G.UrlLoginPage, nil) - util.ErrHandler(err) - G.Ip, err = util.GetIp(body) - util.ErrHandler(err) - } - util.Log.Println("Step2: 正在获取Token") - { - data, err := request.Get(G.UrlGetChallengeApi, map[string]string{ - "callback": "jsonp1583251661367", - "username": G.Form.UserName, - "ip": G.Ip, - }) - util.ErrHandler(err) - G.Token, err = util.GetToken(data) - util.ErrHandler(err) - } - util.Log.Println("Step3: 执行登录…") - { - info, err := json.Marshal(map[string]string{ - "username": G.Form.UserName, - "password": G.Form.PassWord, - "ip": G.Ip, - "acid": G.Meta.Acid, - "enc_ver": G.Meta.Enc, - }) - util.ErrHandler(err) - G.EncryptedInfo = "{SRBX1}" + util.Base64(util.XEncode(string(info), G.Token)) - G.Md5 = util.Md5(G.Token) - G.EncryptedMd5 = "{MD5}" + G.Md5 - - var chkstr = G.Token + G.Form.UserName + G.Token + G.Md5 - chkstr += G.Token + G.Meta.Acid + G.Token + G.Ip - chkstr += G.Token + G.Meta.N + G.Token + G.Meta.Type - chkstr += G.Token + G.EncryptedInfo - G.EncryptedChkstr = util.Sha1(chkstr) - - res, err := request.Get(G.UrlLoginApi, map[string]string{ - "callback": "jQuery112401157665", - "action": "login", - "username": G.Form.UserName, - "password": G.EncryptedMd5, - "ac_id": G.Meta.Acid, - "ip": G.Ip, - "info": G.EncryptedInfo, - "chksum": G.EncryptedChkstr, - "n": G.Meta.N, - "type": G.Meta.Type, - "os": "Windows 10", - "name": "windows", - "double_stack": "0", - "_": fmt.Sprint(time.Now().UnixNano()), - }) - util.ErrHandler(err) - G.LoginResult, err = util.GetResult(res) - util.ErrHandler(err) - util.Log.Println("登录结果: " + G.LoginResult) - if global.Config.Settings.DemoMode { - util.Log.Println(res) + if global.Config.Settings.Guardian != 0 { + global.Status.Daemon = true + util.Log.Println("[Guardian mode]") + if global.Config.Settings.Daemon { + if err := exec.Command(os.Args[0], "-daemon").Start(); err != nil { + util.ErrHandler(err) + return + } + util.Log.Println("[Daemon mode entered]") + return } + controllers.Guardian() } } diff --git a/modles/config.go b/modles/config.go index eae30ee..4599d3f 100644 --- a/modles/config.go +++ b/modles/config.go @@ -1,7 +1,7 @@ package modles import ( - "Mmx/Modles/util" + "Mmx/modles/util" "reflect" ) @@ -9,7 +9,8 @@ type Settings struct { QuitIfNetOk bool `json:"quit_if_net_ok"` DemoMode bool `json:"demo_mode"` Dns string `json:"dns"` - Daemon uint `json:"daemon"` + Guardian uint `json:"guardian"` + Daemon bool `json:"daemon"` } type Config struct { diff --git a/util/file.go b/util/file.go index b65115d..15d578c 100644 --- a/util/file.go +++ b/util/file.go @@ -13,7 +13,11 @@ type file struct{} var File file func (a *file) Exists(path string) bool { - _, err := os.Stat(a.GetRootPath() + path) + root, err := a.GetRootPath() + if err != nil { + return false + } + _, err = os.Stat(root + path) if err != nil { if os.IsExist(err) { return true @@ -24,7 +28,11 @@ func (a *file) Exists(path string) bool { } func (a *file) Read(path string) ([]byte, error) { - return ioutil.ReadFile(a.GetRootPath() + path) + root, err := a.GetRootPath() + if err != nil { + return nil, err + } + return ioutil.ReadFile(root + path) } func (a *file) ReadJson(path string, receiver interface{}) error { @@ -36,7 +44,11 @@ func (a *file) ReadJson(path string, receiver interface{}) error { } func (a *file) Write(path string, data []byte) error { - return ioutil.WriteFile(a.GetRootPath()+path, data, 700) + root, err := a.GetRootPath() + if err != nil { + return err + } + return ioutil.WriteFile(root+path, data, 700) } func (a *file) WriteJson(path string, receiver interface{}) error { @@ -47,16 +59,21 @@ func (a *file) WriteJson(path string, receiver interface{}) error { return a.Write(path, data) } -func (*file) GetRootPath() string { +func (*file) GetRootPath() (string, error) { t, err := os.Executable() if err != nil { ErrHandler(err) + return "", err } - return filepath.Dir(t) + "/" + return filepath.Dir(t) + "/", nil } func (a *file) Add(path string, c string) error { - file, err := os.OpenFile(a.GetRootPath()+path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 700) + root, err := a.GetRootPath() + if err != nil { + return err + } + file, err := os.OpenFile(root+path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 700) defer file.Close() if err != nil { return err diff --git a/util/log.go b/util/log.go index ae2c694..9171849 100644 --- a/util/log.go +++ b/util/log.go @@ -39,6 +39,9 @@ func (c *loG) genTimeStamp() { } func (c *loG) Println(a ...interface{}) { + if !global.Status.Output { + return + } c.genTimeStamp() if global.Config.Settings.DemoMode { c.WriteLog("Login-"+c.timeStamp+".log", a...) @@ -47,6 +50,9 @@ func (c *loG) Println(a ...interface{}) { } func (c *loG) Fatalln(a ...interface{}) { + if !global.Status.Output { + return + } c.genTimeStamp() c.WriteLog("LoginError-"+c.timeStamp+".log", a...) log.Fatalln(a...) diff --git a/util/util.go b/util/util.go index 393851f..22e3f5f 100644 --- a/util/util.go +++ b/util/util.go @@ -52,13 +52,14 @@ func Sha1(content string) string { } func ErrHandler(err error) { - if err != nil { - Log.Println("运行出错,状态异常") - if global.Config.Settings.DemoMode { - Log.Fatalln(err) - } - os.Exit(1) + if !global.Status.Output { + return } + Log.Println("运行出错,状态异常") + if global.Config.Settings.DemoMode { + Log.Fatalln(err) + } + os.Exit(1) } func NetDailEr() func(ctx context.Context, network, address string) (net.Conn, error) {