diff --git a/cmd/seckill.go b/cmd/seckill.go index df5b740..89f1622 100644 --- a/cmd/seckill.go +++ b/cmd/seckill.go @@ -17,6 +17,7 @@ import ( func init() { rootCmd.AddCommand(seckillCmd) + seckillCmd.Flags().BoolP("run","r",false,"Run directly without waiting for the time to buy") } var seckillCmd = &cobra.Command{ @@ -26,6 +27,8 @@ var seckillCmd = &cobra.Command{ } func startSeckill(cmd *cobra.Command, args []string) { + //获取是否直接运行抢购 + isRun,_:=cmd.Flags().GetBool("run") session:=jd_seckill.NewSession(common.CookieJar) err:=session.CheckLoginStatus() if err!=nil { @@ -34,34 +37,29 @@ func startSeckill(cmd *cobra.Command, args []string) { //活跃用户会话,当会话失效自动退出程序 user:=jd_seckill.NewUser(common.Client,common.Config) go KeepSession(user) - //计算抢购时间 - startTime, err := common.Hour2Unix(common.Config.MustValue("config", "buy_time", "09:59:59")) - if err != nil { - log.Fatal("抢购开始时间初始化失败,请检查时间格式", err) - } - if startTime.Unix() < time.Now().Unix() { - startTime = startTime.AddDate(0, 0, 1) - } - log.Println("抢购开始时间:", startTime) - - localTime := time.Now().UnixNano() / 1e6 - log.Println("本地系统时间:", localTime) - jdTime, _ := GetJdTime() - log.Println("京东云端时间:", jdTime) - diffTime := localTime - jdTime - log.Println(fmt.Sprintf("本地时间与京东服务器时间误差为【%d】毫秒", diffTime)) - - buyTime := startTime.UnixNano() / 1e6 - timerTime := (buyTime + diffTime) - jdTime - if timerTime <= 0 { - log.Println("请设置抢购开始时间,或直接清空") - os.Exit(0) + //直接运行抢购跳过等待抢购时间 + if !isRun { + //计算抢购时间 + nowLocalTime:=time.Now().UnixNano()/1e6 + jdTime,_:=GetJdTime() + buyDate:=common.Config.MustValue("config","buy_time","") + loc, _ := time.LoadLocation("Local") + t,_:=time.ParseInLocation("2006-01-02 15:04:05",buyDate,loc) + buyTime:=t.UnixNano()/1e6 + diffTime:=nowLocalTime-jdTime + log.Println(fmt.Sprintf("正在等待到达设定时间:%s,检测本地时间与京东服务器时间误差为【%d】毫秒",buyDate,diffTime)) + timerTime:=(buyTime+diffTime)-jdTime + if timerTime<=0 { + log.Println("请设置抢购时间") + os.Exit(0) + } + //等待抢购 + time.Sleep(time.Duration(timerTime)*time.Millisecond) + //开始抢购 + log.Println("时间到达,开始执行……") + }else{ + log.Println("开始执行……") } - //等待抢购 - log.Println("等待抢购中……") - time.Sleep(time.Duration(timerTime) * time.Millisecond) - //开始抢购 - log.Println("时间到达,开始执行……") seckill:=jd_seckill.NewSeckill(common.Client,common.Config) //开启抢购任务,第二个参数为开启几个协程 //怕封号的可以减少协程数量,相反抢到的成功率也减低了 diff --git a/jd_seckill/seckill.go b/jd_seckill/seckill.go index 96e5b0e..74e8524 100644 --- a/jd_seckill/seckill.go +++ b/jd_seckill/seckill.go @@ -79,20 +79,6 @@ func (this *Seckill) getSeckillUrl() (string, error) { url := "" for { _, body, _ := req.Send().End() - //临时打印数据 - log.Println("返回信息:"+body) - //先注释,测试过gjson可以解析jQuery1153906({"type":"3","state":"13","url":""})格式 -/* var cbBody string - cbBody = body - spBody := strings.Split(body, "(") - if len(spBody) >= 2 { - cbBody = strings.Trim(spBody[1], ")") - } - - if gjson.Get(cbBody, "url").Exists() && gjson.Get(cbBody, "url").String() != "" { - url = gjson.Get(cbBody, "url").String() - break - }*/ if gjson.Get(body, "url").Exists() && gjson.Get(body, "url").String() != "" { url = gjson.Get(body, "url").String() break @@ -160,16 +146,23 @@ func (this *Seckill) SeckillInitInfo() (string, error) { req.SetData("sku", skuId) req.SetData("num", seckillNum) req.SetData("isModifyAddress", "false") - resp, body, err := req.SetUrl("https://marathon.jd.com/seckillnew/orderService/pc/init.action").SetMethod("post").Send().End() - if err != nil || resp.StatusCode != http.StatusOK { - log.Println("初始化秒杀信息失败") - return "", errors.New("初始化秒杀信息失败") - } - if !gjson.Valid(body) { - log.Println("抢购失败,返回信息:" + body) - return "", errors.New("抢购失败,返回信息:" + body) + req.SetUrl("https://marathon.jd.com/seckillnew/orderService/pc/init.action").SetMethod("post") + //尝试获取三次 + errorCount:=3 + errorMsg:="" + for errorCount > 0 { + _, body, _ := req.Send().End() + if body!="null" && gjson.Valid(body) { + log.Println("获取秒杀初始化信息成功") + return body,nil + }else{ + log.Println("获取秒杀初始化信息失败,返回信息:"+body) + errorMsg=body + } + errorCount=errorCount-1 + time.Sleep(300*time.Millisecond) } - return body, nil + return "", errors.New(errorMsg) } func (this *Seckill) SubmitSeckillOrder() bool { @@ -184,6 +177,10 @@ func (this *Seckill) SubmitSeckillOrder() bool { return false } address := gjson.Get(initInfo, "addressList").Array() + if !gjson.Get(initInfo, "addressList").Exists() || len(address)<1 { + log.Println("抢购失败,可能你还未设置默认收货地址") + return false + } defaultAddress := address[0] isinvoiceInfo := gjson.Get(initInfo, "invoiceInfo").Exists() invoiceTitle := "-1" @@ -243,6 +240,10 @@ func (this *Seckill) SubmitSeckillOrder() bool { _ = service.SendMessage(this.conf, "茅台抢购通知", "抢购失败,网络错误") return false } + + //临时打印数据 + log.Println("返回信息:"+body) + if !gjson.Valid(body) { log.Println("抢购失败,返回信息:" + body) _ = service.SendMessage(this.conf, "茅台抢购通知", "抢购失败,返回信息:"+body)