package cmd import ( "context" "github.com/chromedp/cdproto/cdp" "github.com/chromedp/cdproto/network" "github.com/chromedp/chromedp" "github.com/spf13/cobra" "github.com/tidwall/gjson" "github.com/unknwon/goconfig" "github.com/ztino/jd_seckill/common" "github.com/ztino/jd_seckill/jd_seckill" "github.com/ztino/jd_seckill/log" "net/url" "os" "time" ) func init() { rootCmd.AddCommand(jdTdudfpCmd) jdTdudfpCmd.Flags().StringP("good_url","g","","") _=jdTdudfpCmd.MarkFlagRequired("good_url") } var jdTdudfpCmd = &cobra.Command{ Use: "jdTdudfp", Short: "auto get jd eid and fp", Run: startJdTdudfp, } func startJdTdudfp(cmd *cobra.Command, args []string) { session := jd_seckill.NewSession(common.CookieJar) err := session.CheckLoginStatus() if err != nil { log.Println("自动获取eid和fp失败,请重新登录") } else { log.Println("开始自动获取eid和fp,如遇卡住请结束进程,重新启动") options := []chromedp.ExecAllocatorOption{ chromedp.Flag("headless", false), //debug使用 chromedp.Flag("blink-settings", "imagesEnabled=false"), //禁用图片加载 chromedp.Flag("start-maximized", true), //最大化窗口 chromedp.Flag("no-sandbox", true), //禁用沙盒, 性能优先 chromedp.Flag("disable-setuid-sandbox", true), //禁用setuid沙盒, 性能优先 chromedp.Flag("no-default-browser-check", true), //不检查默认浏览器 chromedp.Flag("disable-plugins", true), //禁用扩展 chromedp.UserAgent(common.Config.MustValue("config", "default_user_agent", "")), } options = append(chromedp.DefaultExecAllocatorOptions[:], options...) c, cc := chromedp.NewExecAllocator(context.Background(), options...) defer cc() ctx, cancel := chromedp.NewContext(c) defer cancel() //获取cookie u, _ := url.Parse("http://jd.com") cookies := common.CookieJar.Cookies(u) //商品链接 good_url,_:=cmd.Flags().GetString("good_url") //返回的eid和fp returnEid:="" returnFp:="" //获取到的eid和fp eid := "" fp := "" var res []byte err = chromedp.Run(ctx, chromedp.Tasks{ chromedp.ActionFunc(func(ctx context.Context) error { //设置cookie expr := cdp.TimeSinceEpoch(time.Now().Add(180 * 24 * time.Hour)) for _, cookie := range cookies { network.SetCookie(cookie.Name, cookie.Value). WithExpires(&expr). WithPath("/"). WithDomain("." + cookie.Domain). Do(ctx) } return nil }), }, chromedp.Navigate(good_url), chromedp.WaitVisible("#InitCartUrl"), //加入购物车 chromedp.Sleep(2 * time.Second), chromedp.Click("#InitCartUrl"), chromedp.WaitVisible(".btn-addtocart"), //去购车结算 chromedp.Sleep(2 * time.Second), chromedp.Click(".btn-addtocart"), chromedp.WaitVisible(".common-submit-btn"), //去结算 chromedp.Sleep(2 * time.Second), chromedp.Click(".common-submit-btn"), chromedp.Sleep(3 * time.Second), chromedp.Evaluate("_JdTdudfp", &res), chromedp.Evaluate("_JdEid", &eid), chromedp.Evaluate("_JdJrTdRiskFpInfo", &fp), ) if err != nil { log.Println("chromedp 出错了") log.Fatal(err) } value := string(res) //判断_JdTdudfp是否能获取到eid和fp,如果不能去获取_JdEid和_JdJrTdRiskFpInfo获取到的值 if gjson.Valid(value) && gjson.Get(value, "eid").String() != "" && gjson.Get(value, "fp").String() != "" { returnEid = gjson.Get(value, "eid").String() returnFp = gjson.Get(value, "fp").String() }else{ if eid!="" && fp!=""{ returnEid=eid returnFp=fp } } //eid,fp合法性判断 if returnEid=="" || returnFp=="" { log.Println("获取失败,请重新尝试,返回信息:" + value) }else{ log.Println("eid:" + returnEid) log.Println("fp:" + returnFp) //修改配置文件 confFile := "./conf.ini" cfg, err := goconfig.LoadConfigFile(confFile) if err != nil { log.Println("配置文件不存在,程序退出") os.Exit(0) } cfg.SetValue("config", "eid", returnEid) cfg.SetValue("config", "fp", returnFp) if err := goconfig.SaveConfigFile(cfg, confFile); err != nil { log.Println("保存配置文件失败,请手动填入配置文件") }else{ log.Println("eid, fp参数已经自动填入配置文件") } } } }