選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

145 行
4.5 KiB

package cmd
import (
"context"
"fmt"
"github.com/chromedp/cdproto/cdp"
"github.com/chromedp/cdproto/network"
"github.com/chromedp/cdproto/target"
"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"
"log"
"net/url"
"os"
"strconv"
"time"
)
func init() {
rootCmd.AddCommand(jdTdudfpCmd)
}
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 {
retryTimes, _ := strconv.Atoi(common.Config.MustValue("config", "retry_times", "5"))
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)
_ = addNewTabListener(ctx)
defer cancel()
//设置cookie
u, _ := url.Parse("http://jd.com")
cookies := common.CookieJar.Cookies(u)
err = chromedp.Run(ctx,
chromedp.Tasks{
chromedp.ActionFunc(func(ctx context.Context) error {
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
}),
},
)
if err != nil {
log.Println("设置cookie出错了")
log.Fatal(err)
}
RETRY:
retryTimes--
log.Println("【重要提醒】自动获取eid和fp期间,建议鼠标跟随页面跳转,滑动到【加入购物车】【去购车结算】【去结算】按钮,但不要点击,可以提升获取成功率!")
log.Println(fmt.Sprintf("开始自动获取eid和fp,如遇卡住请耐心等待,重试次数剩余: %v 次", retryTimes))
var res []byte
testSkuId := common.Config.MustValue("config", "test_sku_id", "")
err = chromedp.Run(ctx,
chromedp.Tasks{
chromedp.Navigate(fmt.Sprintf("http://item.jd.com/%s.html", testSkuId)),
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),
},
)
if err != nil {
log.Println("chromedp 出错了")
log.Fatal(err)
}
value := string(res)
if !gjson.Valid(value) || gjson.Get(value, "eid").String() == "" || gjson.Get(value, "fp").String() == "" {
log.Println("获取失败,请重新尝试,返回信息:" + value)
if retryTimes > 0 {
goto RETRY
}
} else {
eid := gjson.Get(value, "eid").String()
fp := gjson.Get(value, "fp").String()
log.Println("eid:" + eid)
log.Println("fp:" + fp)
//修改配置文件
confFile := "./conf.ini"
cfg, err := goconfig.LoadConfigFile(confFile)
if err != nil {
log.Println("配置文件不存在,程序退出")
os.Exit(0)
}
cfg.SetValue("config", "eid", eid)
cfg.SetValue("config", "fp", fp)
if err := goconfig.SaveConfigFile(cfg, confFile); err != nil {
log.Println("保存配置文件失败,请手动填入配置文件")
}
log.Println("eid, fp参数已经自动填入配置文件")
}
}
}
func addNewTabListener(ctx context.Context) <-chan target.ID {
return chromedp.WaitNewTarget(ctx, func(info *target.Info) bool {
return true
})
}