You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.1 KiB
Go

package main
import (
"b612.me/starlog"
"b612.me/starnet"
"b612.me/staros"
"errors"
"fmt"
"net/url"
"os"
"path/filepath"
)
func main() {
myDir := filepath.Dir(os.Args[0])
baseName := filepath.Base(os.Args[0])
procs, err := staros.FindProcessByName(baseName)
if err != nil {
starlog.Errorln(err)
os.Exit(2)
}
for _, v := range procs {
if int(v.Pid) == os.Getpid() {
continue
}
if len(v.Args) > 1 {
starlog.Errorf("another process already run:%+v\n", v)
os.Exit(3)
}
}
if len(os.Args) < 2 {
pid, err := staros.Daemon(os.Args[0], "-f")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println("pid :", pid)
return
}
starlog.SetLogFile(filepath.Join(myDir, "icbcauth.log"), starlog.Std, true)
defer starlog.Close(starlog.Std)
//sig := make(chan os.Signal)
//signal.Notify(sig, os.Kill, os.Interrupt)
//for {
data, err := CheckNeedAuth(starlog.Std)
if err != nil {
return
}
if data != nil {
err = Auth(starlog.Std, data)
if err != nil {
return
}
}
// return
// select {
// case <-sig:
// starlog.Infoln("Stopped By Signal")
// return
// case <-time.After(time.Second * 300):
// }
// }
}
func CheckNeedAuth(log *starlog.StarLogger) (*url.URL, error) {
log.Noticeln("Checking If Need Auth")
res, err := starnet.Curl(starnet.NewRequests("http://139.199.163.65/", nil, "GET",
starnet.WithDisableRedirect(true)))
if err != nil {
log.Errorln("Checking Failed:", err)
return nil, err
}
if res.Location != nil {
log.Warningln("Checking Finished:Need Auth,Auth Url:", res.Location.String())
return res.Location, nil
}
log.Infoln("Checking Finished,No Need Auth")
return nil, nil
}
func Auth(log *starlog.StarLogger, authUrl *url.URL) error {
log.Noticeln("Trying to Auth...")
strUrl := "http://" + authUrl.Host + "/portallogin?" + authUrl.RawQuery
log.Noticeln("Auth Url is:", strUrl)
res, err := starnet.Curl(starnet.NewRequests(strUrl, nil, "GET",
starnet.WithDisableRedirect(true)))
if err != nil {
log.Errorln("Auth Failed:", err)
return err
}
if res.Location == nil {
starlog.Errorln("Cannot Got Redirect Url")
return errors.New("Cannot Got Redirect Url")
}
starlog.Infoln("Redirect Url is:", res.Location.String())
starlog.Noticeln("Getting Cookie...")
cok, err := starnet.Curl(starnet.NewRequests(res.Location.String(), nil, "GET"))
if err != nil {
log.Errorln("Auth Failed:", err)
return err
}
if len(cok.RespCookies) == 0 {
log.Errorln("Cannot Got Cookies")
return errors.New("Get Cookie Failed")
}
starlog.Infoln("Got Cookie:", cok.RespCookies)
starlog.Noticeln("Trying to Using Auth Url:", `http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true`)
res, err = starnet.Curl(starnet.NewRequests(`http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true`,
nil, "GET", starnet.WithDisableRedirect(true),
starnet.WithHeader("Referer", res.Location.String()),
starnet.WithCookies(cok.RespCookies)))
if err != nil {
log.Errorln("Auth Failed:", err)
return err
}
log.Infoln("Auth Result:", res.RespHttpCode, string(res.RecvData))
return nil
}