package g import ( "TripUpRate/models" "TripUpRate/yjy/utils" "crypto/md5" "encoding/hex" "encoding/json" "fmt" "gitee.com/nanqis/bigtires/big" "github.com/beego/beego/v2/core/logs" "strconv" "strings" "sync" "time" ) var ( TaskList sync.Map AgencyTag = "BLTL" ) /** 初始化Cookie 返回: cookies:初始化后的cookies proxy:代理IP:端口 idc:IDC服务商 */ func InitCookies() (cookies string, proxy string, idc string) { //获取代理IP proxy = utils.GetProxyIpNiuYun() idc, _, cookies, _ = big.HttpSend(&big.HttpParms{ Url: "https://us.trip.com/", Headers: `accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 accept-encoding: gzip, deflate, br accept-language: zh-CN,zh;q=0.9 user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36`, ProxyIP: proxy, }) idc = big.StrGetSub(idc, "data-idc=\"", "\"") _, _, cookies, _ = big.HttpSend(&big.HttpParms{ Url: "https://us.trip.com/flights/graphql/hotCitySearch", Mode: "POST", DataStr: "{\"operationName\":\"hotCitySearch\",\"variables\":{},\"extensions\":{\"persistedQuery\":{\"version\":1,\"sha256Hash\":\"a70a7532ccd91276029469dbf61c18b8ff88a7c68119575ba3f2e8af717aada2\"}}}", Cookies: cookies, Headers: `accept: */* accept-encoding: gzip, deflate, br accept-language: zh-CN,zh;q=0.9 content-type: application/json referer: https://us.trip.com/ user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36`, ProxyIP: proxy, }) _, _, cookies, _ = big.HttpSend(&big.HttpParms{ Url: "https://us.trip.com/flights/graphql/location", Mode: "POST", DataStr: "{\"operationName\":\"location\",\"variables\":{},\"extensions\":{\"persistedQuery\":{\"version\":1,\"sha256Hash\":\"bcb092764f217e77a1a82d863b276e63ea7d67db287255563a7f70844624fa2b\"}}}", Cookies: cookies, Headers: `accept: */* accept-encoding: gzip, deflate, br accept-language: zh-CN,zh;q=0.9 content-type: application/json referer: https://us.trip.com/ user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36`, ProxyIP: proxy, }) _, _, cookies, _ = big.HttpSend(&big.HttpParms{ Url: "https://chloro.trip.com/v2/d", Mode: "POST", DataStr: "data=" + big.ProgRandChar(big.ProgRangeRand(1600, 2000, 0), 0, false) + "&version=7&serverName=https://www.trip.com", Cookies: cookies, Headers: `Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Accept: */* Referer: https://www.trip.com/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9`, ProxyIP: proxy, }) return } type TaskInfo struct { Dptcity string `json:"dptcity"` // 出发地 XNN Arrcity string `json:"arrcity"` // 到达地 MIG Fromdate string `json:"fromdate"` // 出发日期 2021-04-13 Enddate time.Time `json:"enddate"` //任务结束时间 } func ForClick(key string) { for { //判断时间是否过期,过期则删除并结束协程 info, _ := TaskList.Load(key) parm := info.(TaskInfo) if parm.Enddate.Before(time.Now()) { logs.Error(fmt.Sprintf("任务过期\t%s-%s\t%s", parm.Dptcity, parm.Arrcity, parm.Fromdate)) TaskList.Delete(key) break } //初始化Cookies cookies, proxy, idc := InitCookies() temp := "" dayStr := "" //判断有无找到,没有则新加一天,最多加7天 for i := 0; i < 7; i++ { day, _ := time.Parse("2006-01-02", parm.Fromdate) dayStr = day.AddDate(0, 0, i).Format("2006-01-02") logs.Warn(fmt.Sprintf("正在查询\t%s-%s\t%s", parm.Dptcity, parm.Arrcity, dayStr)) //查询列表 temp, _, _, _ = big.HttpSend(&big.HttpParms{ Url: "https://us.trip.com/flights/graphql/intlFlightListSearchAll", Mode: "POST", DataStr: fmt.Sprintf("{\"operationName\":\"intlFlightListSearch\",\"variables\":{\"request\":{\"Head\":{\"Currency\":\"USD\"},\"mode\":1,\"searchNo\":1,\"criteriaToken\":\"\",\"productKeyInfo\":null,\"searchInfo\":{\"tripType\":\"OW\",\"cabinClass\":\"YS\",\"searchSegmentList\":[{\"dCityCode\":\"%s\",\"aCityCode\":\"%s\",\"dDate\":\"%s\"}],\"travelerNum\":{\"adult\":1,\"child\":0,\"infant\":0},\"openRtMergeSearch\":false}}},\"extensions\":{\"persistedQuery\":{\"version\":1,\"sha256Hash\":\"af100ae907a5c8e83e24542d42e83b6ecd24ad9a9072900f1fa0b5483f41d32f\"}}}", parm.Dptcity, parm.Arrcity, dayStr), Cookies: cookies, Headers: `accept: */* accept-encoding: gzip, deflate, br accept-language: zh-CN,zh;q=0.9 content-type: application/json referer: https://us.trip.com/flights/denver-to-cancun/tickets-den-cun?FlightWay=OW&class=Y&Quantity=1&ChildQty=0&BabyQty=0&dcity=den&acity=cun&ddate=2021-07-20 user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36`, ProxyIP: proxy, }) if strings.Contains(temp, AgencyTag) { break } //如果没有找到,则重新获取Cookies为下一次刷新做准备 cookies, proxy, idc = InitCookies() } if !strings.Contains(temp, AgencyTag) { //增加7天都没有找到,结束本次循环 logs.Error(fmt.Sprintf("查询失败\t%s-%s\t%s\t近7天查询无果等待下轮查询", parm.Dptcity, parm.Arrcity, dayStr)) big.TimeSleepRangeRand(2, 4, time.Minute) continue } //反序列化 var query models.Query err := json.Unmarshal([]byte(temp), &query) if err != nil { logs.Error(fmt.Sprintf("查询失败\t%s-%s\t%s\t响应结果参数效验错误等待下轮查询\t错误信息:%s", parm.Dptcity, parm.Arrcity, dayStr, err.Error())) big.TimeSleepRangeRand(2, 4, time.Minute) continue } //遍历结果,直至找到 var infolist models.PolicyInfoList for _, flightlist := range query.Data.IntlFlightListSearch.ProductInfoList { for _, infoList := range flightlist.PolicyInfoList { if strings.Contains(infoList.AgencyTag, AgencyTag) { //找到了跳出循环 infolist = infoList goto click } } } click: //判断是否找到 if infolist.RemarkTokenKey == "" { logs.Error(fmt.Sprintf("查询失败\t%s-%s\t%s\t响应结果遍历没有找到等待下轮查询", parm.Dptcity, parm.Arrcity, dayStr)) big.TimeSleepRangeRand(2, 4, time.Minute) continue } //找到了,开始点击 tokens := strings.Split(infolist.ProductKeyInfo.GroupKey, "^") flightInfo := strings.Split(tokens[0], "-") temp, _, cookies, _ = big.HttpSend(&big.HttpParms{ Url: "https://us.trip.com/flights/graphql/getFlightBookingInfo", Mode: "POST", DataStr: "{\"operationName\":\"getFlightBookingInfo\",\"variables\":{\"Head\":{\"Currency\":\"USD\"},\"source\":null,\"remarkTokenKey\":\"" + infolist.RemarkTokenKey + "\",\"criteriaToken\":\"tripType:OW|criteriatoken:" + tokens[2] + "|cabinClass:YSGroup|adult:1|dCity_1:" + flightInfo[1] + "|aCity_1:" + flightInfo[2] + "|date_1:" + dayStr + "|idc:" + idc + "\",\"productKeyInfo\":{\"shoppingId\":\"" + infolist.ProductKeyInfo.ShoppingID + "\",\"groupKey\":\"" + infolist.ProductKeyInfo.GroupKey + "\"}},\"extensions\":{\"persistedQuery\":{\"version\":1,\"sha256Hash\":\"22cbc6b7f0ffa46f8d533c0eddf844cff0edbf3ae3272e40d8c5cdf6dc6abfd6\"}}}", Cookies: cookies, Headers: `Connection: keep-alive accept: */* User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 content-type: application/json Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9`, ProxyIP: proxy, }) if strings.Contains(temp, "cabinClass:YSGroup") { logs.Info(fmt.Sprintf("验价成功\t%s-%s\t%s", parm.Dptcity, parm.Arrcity, dayStr)) //判断是否需要生单 if big.ProgRangeRand(1, 20, 0) == 5 { //延迟几十秒后执行生单操作 big.TimeSleepRangeRand(15, 30, time.Second) //随机生成乘客姓名 userLastName := big.ProgRandChar(big.ProgRangeRand(3, 5, 0), 2, false) userFirstName := big.ProgRandChar(big.ProgRangeRand(5, 8, 0), 2, false) usereMail := big.ProgRandChar(big.ProgRangeRand(5, 10, 0), 3, false) + "@gmail.com" userPhone := "1" + big.ProgLenRand(9, 0) userBirthday := strconv.Itoa(big.ProgRangeRand(1970, 2002, 0)) + "-0" + strconv.Itoa(big.ProgRangeRand(1, 9, 0)) + "-" + strconv.Itoa(big.ProgRangeRand(10, 28, 0)) md5 := md5.New() md5.Write([]byte(userLastName + "/" + userFirstName)) userCardNo := hex.EncodeToString(md5.Sum(nil)) if userCardNo[:1] == "0" { userCardNo = userCardNo[1:] } for len(userCardNo) < 9 { userCardNo += "0" } userLimit := strconv.Itoa(big.ProgRangeRand(2023, 2027, 0)) + "-0" + strconv.Itoa(big.ProgRangeRand(1, 9, 0)) + "-" + strconv.Itoa(big.ProgRangeRand(10, 28, 0)) userLimitTime, _ := time.Parse("2006-01-02", userLimit) userSex := "M" if big.ProgRangeRand(0, 1, 0) == 1 { userSex = "F" } UserRandomid, _ := big.TimeStamp(16) UserClientTime := time.Now().Format("2006-01-02T15:04:05+08:00") UserVid, _ := big.TimeStamp(13) UserVid += "." + strings.ToLower(big.ProgRandChar(5, 0, false)) data := "{\"operationName\":\"intlCreateOrder\",\"variables\":{\"request\":{\"Head\":{\"Currency\":\"USD\",\"clientTime\":\"" + UserClientTime + "\",\"ExtendFields\":{\"onex\":\"open\",\"cardAgeLimit\":\"true\",\"Source\":null},\"AbTesting\":\"\"},\"remarkTokenKey\":\"" + infolist.RemarkTokenKey + "\",\"criteriaToken\":\"tripType:OW|criteriatoken:" + tokens[2] + "|cabinClass:YSGroup|adult:1|dCity_1:" + flightInfo[1] + "|aCity_1:" + flightInfo[2] + "|date_1:" + dayStr + "|idc:" + idc + "\",\"productKeyInfo\":{\"groupKey\":\"" + infolist.ProductKeyInfo.GroupKey + "\",\"shoppingId\":\"" + infolist.ProductKeyInfo.ShoppingID + "\"},\"xProductOrderInfo\":{\"baggageInfoList\":[],\"loungeInfoList\":null,\"checkInProductList\":null,\"servicePackageInfoList\":null,\"blueRibbonBagInfo\":null,\"insuranceDetail\":{\"insuranceInfoList\":[]}},\"basicInfo\":{\"enableRePricingNote\":true,\"checkRepeatOrders\":true,\"enableQuickBooking\":true,\"gdprRecord\":{\"pageId\":\"10320667455\",\"content\":\"By proceeding, I acknowledge that I have read and agree to Trip.com's Flight Booking Policies and Privacy Statement.\",\"hasCheckBox\":false,\"checked\":false}},\"flightPassengerList\":[{\"randomid\":\"" + UserRandomid + "\",\"travelerType\":\"ADT\",\"passengerId\":\"\",\"surName\":\"" + userLastName + "\",\"givenName\":\"" + userFirstName + "\",\"nationalityname\":\"United States\",\"nationality\":\"US\",\"gender\":\"" + userSex + "\",\"birthday\":\"" + userBirthday + "\",\"cardName\":\"Passport\",\"cardType\":2,\"cardNo\":\"" + userCardNo + "\",\"cardTimelimitTime\":" + strconv.FormatInt(userLimitTime.Unix(), 10) + ",\"passportLimit\":\"" + userLimit + "\",\"airLineCardList\":[{\"cardNumber\":\"\",\"airlineCode\":\"\"}]}],\"contactInfo\":{\"contactName\":\"" + userLastName + "/" + userFirstName + "\",\"phoneArea\":\"+1\",\"mobilePhone\":\"" + userPhone + "\",\"email\":\"" + usereMail + "\",\"postCode\":\"\"},\"couponInfo\":{},\"promotionId\":null,\"vid\":\"" + UserVid + "\",\"sid\":1,\"pvid\":8,\"riskControlInfo\":{\"rmsToken\":\"fp=krjmmc-1frht1k-nyd0if&vid=" + UserVid + "&pageId=10320667452&r=" + strings.ReplaceAll(big.HttpGetCookie(cookies, "_RGUID"), "-", "") + "&ip=" + big.StrGetLeft(proxy, ":") + "&rg=fin&kpData=0_0_0&kpControl=0_0_0-0_0_0&kpEmp=0_0_0_0_0_0_0_0_0_0-0_0_0_0_0_0_0_0_0_0-0_0_0_0_0_0_0_0_0_0&screen=2560x1440&tz=+8&blang=zh-CN&oslang=zh-CN&ua=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20WOW64)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F86.0.4240.198%20Safari%2F537.36&d=us.trip.com&v=23&kpg=0_0_0_0_0_0_0_0_0_0&adblock=F&cck=F\"}}},\"extensions\":{\"persistedQuery\":{\"version\":1,\"sha256Hash\":\"8cc07d02934afbabdd82d7d957fab1a9cbda1944db419bb7208374bf06f00bb6\"}}}" cookies = big.HttpMergeCookies(cookies, "cticket=89B755E40A1B7CAE31103C48EC693B1EFAC59C231FD0FA2D8CED0ACF0B7061AA") temp, _, cookies, _ = big.HttpSend(&big.HttpParms{ Url: "https://us.trip.com/flights/graphql/intlCreateOrder", Mode: "POST", DataStr: data, Cookies: cookies, Headers: `Connection: keep-alive accept: */* User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 content-type: application/json Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9`, ProxyIP: proxy, }) if strings.Contains(temp, "PaymentGlobalizationOnline/NewPay") { logs.Info(fmt.Sprintf("生单成功\t%s-%s\t%s", parm.Dptcity, parm.Arrcity, dayStr)) } else { logs.Info(fmt.Sprintf("生单失败\t%s-%s\t%s", parm.Dptcity, parm.Arrcity, dayStr)) } } } else { logs.Error(fmt.Sprintf("验价失败\t%s-%s\t%s", parm.Dptcity, parm.Arrcity, dayStr)) } big.TimeSleepRangeRand(2, 4, time.Minute) } }