Commit 5b15f433 authored by 王明明's avatar 王明明

vy 转换完成

parent b4001da5
......@@ -2,24 +2,25 @@ module test
go 1.20
require (
github.com/PuerkitoBio/goquery v1.8.1
github.com/antonfisher/nested-logrus-formatter v1.3.1
github.com/bogdanfinn/fhttp v0.5.18
github.com/bogdanfinn/tls-client v1.3.6
github.com/gorilla/mux v1.8.0
github.com/sirupsen/logrus v1.9.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
)
require (
github.com/andybalholm/brotli v1.0.4 // indirect
github.com/antonfisher/nested-logrus-formatter v1.3.1 // indirect
github.com/bogdanfinn/fhttp v0.5.18 // indirect
github.com/bogdanfinn/tls-client v1.3.6 // indirect
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/bogdanfinn/utls v1.5.14 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/imroc/biu v0.0.0-20170329141542-0376ce6761c0 // indirect
github.com/klauspost/compress v1.15.12 // indirect
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
github.com/lestrrat-go/strftime v1.0.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5 // indirect
golang.org/x/crypto v0.1.0 // indirect
golang.org/x/net v0.1.0 // indirect
golang.org/x/sys v0.1.0 // indirect
golang.org/x/term v0.1.0 // indirect
golang.org/x/text v0.4.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
golang.org/x/net v0.7.0 // indirect
golang.org/x/sys v0.5.0 // indirect
golang.org/x/text v0.7.0 // indirect
)
github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM=
github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/antonfisher/nested-logrus-formatter v1.3.1 h1:NFJIr+pzwv5QLHTPyKz9UMEoHck02Q9L0FP13b/xSbQ=
github.com/antonfisher/nested-logrus-formatter v1.3.1/go.mod h1:6WTfyWFkBc9+zyBaKIqRrg/KwMqBbodBjgbHjDz7zjA=
github.com/bogdanfinn/fhttp v0.5.18 h1:n3lnt5huD9Z35I5gXJCBLiJJo8JMckb0Z05Nqnh+tIQ=
......@@ -11,40 +15,57 @@ github.com/bogdanfinn/utls v1.5.14/go.mod h1:mHeRCi69cUiEyVBkKONB1cAbLjRcZnlJbGz
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/imroc/biu v0.0.0-20170329141542-0376ce6761c0 h1:pkyNAS9IQiZgseFrdhZC4cloBo2k2O2Son/k+3NquwY=
github.com/imroc/biu v0.0.0-20170329141542-0376ce6761c0/go.mod h1:wscexmyH+oDXfQr1q8PAZUXfKnxCUcNm62D/M5Ec8Lw=
github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ=
github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5 h1:YqAladjX7xpA6BM04leXMWAEjS0mTZ5kUU9KRBriQJc=
github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5/go.mod h1:2JjD2zLQYH5HO74y5+aE3remJQvl6q4Sn6aWA2wD1Ng=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
......
package model
import (
"encoding/json"
"errors"
"fmt"
"github.com/PuerkitoBio/goquery"
http "github.com/bogdanfinn/fhttp"
tls_client "github.com/bogdanfinn/tls-client"
"github.com/sirupsen/logrus"
"io"
"log"
"net/url"
"strings"
"test/sensor"
"time"
)
type AkmClient struct {
Jar tls_client.CookieJar
Client tls_client.HttpClient
SensorUrl string
initUrl string
postUrl string
logger *logrus.Entry
ua string
}
func (akm *AkmClient) init() error {
startTime := time.Now()
req, err := http.NewRequest(http.MethodGet, akm.initUrl, nil)
//req, err := http.NewRequest(http.MethodGet, "https://www.easyjet.com/ejavailability/api/v66/availability/query?AdditionalSeats=0&AdultSeats=1&ArrivalIata=LGW&ChildSeats=0&DepartureIata=BFS&IncludeAdminFees=true&IncludeFlexiFares=false&IncludeLowestFareSeats=true&IncludePrices=true&Infants=0&IsTransfer=false&LanguageCode=EN&MaxDepartureDate=2023-03-20&MinDepartureDate=2023-03-18", nil)
if err != nil {
akm.logger.WithError(err).Errorln("初始化abck请求失败")
return err
}
req.Header = http.Header{
"accept": {"*/*"},
"accept-language": {"de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"},
"user-agent": {akm.ua},
http.HeaderOrderKey: {
"accept",
"accept-language",
"user-agent",
},
}
resp, err := akm.Client.Do(req)
if err != nil {
akm.logger.WithError(err).Errorln("abck请求失败")
return err
}
defer resp.Body.Close()
uri, _ := url.Parse(akm.initUrl)
doc, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
akm.logger.WithError(err).Info("解析html出错")
return err
}
scripts := doc.Find("script")
sensorurl, ok := scripts.Last().Attr("src")
if ok {
akm.SensorUrl = fmt.Sprintf("%s://%s%s", uri.Scheme, uri.Host, sensorurl)
//reg, _ := regexp.Compile("</noscript><script type=\"text/javascript\" src=\"(.+?)\"></s")
//matchs := reg.FindStringSubmatch(string(readBytes))
//
//if len(matchs) == 2 {
// akm.SensorUrl = fmt.Sprintf("%s://%s%s", uri.Scheme, uri.Host, matchs[1])
} else {
akm.logger.Errorln("提取不到sensorUrl失败")
return errors.New("提取不到sensorUrl 失败")
}
akm.logger.Info("请求sensor url:", akm.SensorUrl)
akm.logger.Info("初始化abck 耗时", time.Since(startTime).String())
return nil
}
func NewAkmClient(initUrl, postUrl, proxyUrl string, logger *logrus.Entry) *AkmClient {
jar := tls_client.NewCookieJar()
options := []tls_client.HttpClientOption{
tls_client.WithTimeoutSeconds(30),
tls_client.WithClientProfile(tls_client.Chrome_110),
tls_client.WithNotFollowRedirects(),
tls_client.WithCookieJar(jar), // create cookieJar instance and pass it as argument
//tls_client.WithProxyUrl("http://user:pass@host:port"),
//tls_client.WithInsecureSkipVerify(),
}
client, err := tls_client.NewHttpClient(tls_client.NewNoopLogger(), options...)
if err != nil {
log.Println(err)
}
//client.SetProxy("http://user-unifflcc-region-us:q39CEBTs5A5YQXor@pr.roxlabs.cn:4600")
if proxyUrl == "" {
client.SetProxy("http://127.0.0.1:8890")
} else {
client.SetProxy(proxyUrl)
}
return &AkmClient{Jar: jar, Client: client, initUrl: initUrl, postUrl: postUrl, logger: logger}
}
func (akm *AkmClient) GetCookie() (string, string) {
uri, _ := url.Parse(akm.initUrl)
cookies := akm.Jar.Cookies(uri)
abck := ""
bmsz := ""
for _, v := range cookies {
if v.Name == "_abck" {
abck = v.Value
}
if v.Name == "bm_sz" {
bmsz = v.Value
}
}
return abck, bmsz
}
func (akm *AkmClient) GetAllCookie() map[string]string {
res := make(map[string]string)
uri, _ := url.Parse(akm.initUrl)
cookies := akm.Jar.Cookies(uri)
for _, v := range cookies {
res[v.Name] = v.Value
}
return res
}
func (akm *AkmClient) postSensor(times int) error {
abck, bmsz := akm.GetCookie()
t1 := time.Now()
res := sensor.GenData(times, abck, bmsz, akm.ua, akm.postUrl)
t2 := time.Now()
sensor_data := "{\"sensor_data\":\"" + res + "\"}"
statusCode, err := akm.PostJson(times, akm.SensorUrl, sensor_data)
if err != nil {
return err
}
akm.logger.Info("第", times, "生成一次 abck 耗时 ", t2.Sub(t1).String(), " 响应abck结果 ", statusCode, " 请求耗时 ", time.Since(t2).String())
return nil
}
func (akm *AkmClient) PostJson(times int, url, data string) (int, error) {
req, err := http.NewRequest(http.MethodPost, url, strings.NewReader(data))
//req, err := http.NewRequest(http.MethodGet, "https://www.easyjet.com/ejavailability/api/v66/availability/query?AdditionalSeats=0&AdultSeats=1&ArrivalIata=LGW&ChildSeats=0&DepartureIata=BFS&IncludeAdminFees=true&IncludeFlexiFares=false&IncludeLowestFareSeats=true&IncludePrices=true&Infants=0&IsTransfer=false&LanguageCode=EN&MaxDepartureDate=2023-03-20&MinDepartureDate=2023-03-18", nil)
if err != nil {
akm.logger.WithError(err).Errorln("初始化abck请求失败")
return -1, err
}
req.Header = http.Header{
"accept": {"*/*"},
"accept-language": {"de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"},
"content-type": {"application/json"},
"user-agent": {akm.ua},
http.HeaderOrderKey: {
"accept",
"accept-language",
"user-agent",
},
}
for i := 0; i < 1; i++ {
//startTime := time.Now()
response, err := akm.Client.Do(req)
if err != nil {
akm.logger.WithError(err).Info("post sensor_data 错误")
continue
}
defer response.Body.Close()
readAll, err := io.ReadAll(response.Body)
if err != nil {
akm.logger.WithError(err).Info("post sensor_data 读取返回值 错误")
continue
}
resJson := make(map[string]bool)
err = json.Unmarshal(readAll, &resJson)
if err != nil {
akm.logger.WithError(err).Info("序列化 sensor_data 返回值 错误")
continue
}
//akm.logger.Infof("第%d次snesor请求第%d次尝试结果%v 耗时 %s", times, i, resJson["success"], time.Since(startTime).String())
return response.StatusCode, nil
}
return -1, errors.New("请求三次都失败返回结果吧")
}
package model
import (
"encoding/json"
"errors"
http "github.com/bogdanfinn/fhttp"
tls_client "github.com/bogdanfinn/tls-client"
"github.com/sirupsen/logrus"
"io"
"log"
"net/url"
"regexp"
"strings"
"test/sensor"
"time"
)
type AkmClient struct {
Jar tls_client.CookieJar
Client tls_client.HttpClient
SensorUrl string
uri string
logger *logrus.Entry
}
func NewAkmClient(initUrl, postUrl, proxyUrl string, logger *logrus.Entry) *AkmClient {
jar := tls_client.NewCookieJar()
options := []tls_client.HttpClientOption{
tls_client.WithTimeoutSeconds(30),
tls_client.WithClientProfile(tls_client.Chrome_110),
tls_client.WithNotFollowRedirects(),
tls_client.WithCookieJar(jar), // create cookieJar instance and pass it as argument
//tls_client.WithProxyUrl("http://user:pass@host:port"),
//tls_client.WithInsecureSkipVerify(),
}
client, err := tls_client.NewHttpClient(tls_client.NewNoopLogger(), options...)
if err != nil {
log.Println(err)
}
//client.SetProxy("http://user-unifflcc-region-us:q39CEBTs5A5YQXor@pr.roxlabs.cn:4600")
if proxyUrl == "" {
client.SetProxy("http://127.0.0.1:8890")
} else {
client.SetProxy(proxyUrl)
}
return &AkmClient{Jar: jar, Client: client, uri: "https://www.easyjet.com/en", logger: logger}
}
func (c *AkmClient) PostJson(times int, url, data string) (int, error) {
req, err := http.NewRequest(http.MethodPost, url, strings.NewReader(data))
//req, err := http.NewRequest(http.MethodGet, "https://www.easyjet.com/ejavailability/api/v66/availability/query?AdditionalSeats=0&AdultSeats=1&ArrivalIata=LGW&ChildSeats=0&DepartureIata=BFS&IncludeAdminFees=true&IncludeFlexiFares=false&IncludeLowestFareSeats=true&IncludePrices=true&Infants=0&IsTransfer=false&LanguageCode=EN&MaxDepartureDate=2023-03-20&MinDepartureDate=2023-03-18", nil)
if err != nil {
c.logger.WithError(err).Errorln("初始化abck请求失败")
return -1, err
}
req.Header = http.Header{
"accept": {"*/*"},
"accept-language": {"de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"},
"content-type": {"application/json"},
"user-agent": {"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"},
http.HeaderOrderKey: {
"accept",
"accept-language",
"user-agent",
},
}
for i := 0; i < 1; i++ {
startTime := time.Now()
response, err := c.Client.Do(req)
if err != nil {
c.logger.WithError(err).Info("post sensor_data 错误")
continue
}
defer response.Body.Close()
readAll, err := io.ReadAll(response.Body)
if err != nil {
c.logger.WithError(err).Info("post sensor_data 读取返回值 错误")
continue
}
resJson := make(map[string]bool)
err = json.Unmarshal(readAll, &resJson)
if err != nil {
c.logger.WithError(err).Info("序列化 sensor_data 返回值 错误")
continue
}
c.logger.Infof("第%d次snesor请求第%d次尝试结果%v 耗时 %s", times, i, resJson["success"], time.Since(startTime).String())
return response.StatusCode, nil
}
return -1, errors.New("请求三次都失败返回结果吧")
}
func (c *AkmClient) GetAbck(times int, urlInput string) error {
abck, bmsz := c.GetCookie()
//data := url.Values{}
//data.Set("times", strconv.Itoa(times))
//data.Set("abck", abck)
//data.Set("bm_sz", bmsz)
//data.Set("url", urlInput)
//'url': 'https://www.easyjet.com/en/buy/flights?isOneWay=on&pid=www.easyjet.com'
//resp, err := http.PostForm("http://127.0.0.1:3033/akm2t", data)
//defer resp.Body.Close()
//if err != nil {
// log.Println(err)
//}
//res, _ := io.ReadAll(resp.Body)
ua := "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.50"
t1 := time.Now()
res := sensor.GenData(abck, bmsz, ua, urlInput)
c.logger.Info("生成一次 abck 耗时", time.Since(t1).String())
t1 = time.Now()
sensor_data := "{\"sensor_data\":\"" + string(res) + "\"}"
//akmRes, err := c.Client.Post("https://www.easyjet.com"+c.SensorUrl, "application/json", strings.NewReader(sensor_data))
statusCode, err := c.PostJson(times, "https://www.easyjet.com"+c.SensorUrl, sensor_data)
if err != nil {
return err
}
c.logger.Info("第", times, "响应abck结果", statusCode, "请求耗时", time.Since(t1).String())
//defer akmRes.Body.Close()
return nil
}
func (c *AkmClient) GetCookie() (string, string) {
uri, _ := url.Parse("https://www.easyjet.com/en")
cookies := c.Jar.Cookies(uri)
abck := ""
bmsz := ""
for _, v := range cookies {
if v.Name == "_abck" {
abck = v.Value
}
if v.Name == "bm_sz" {
bmsz = v.Value
}
}
return abck, bmsz
}
func (c *AkmClient) init() error {
startTime := time.Now()
req, err := http.NewRequest(http.MethodGet, c.uri, nil)
//req, err := http.NewRequest(http.MethodGet, "https://www.easyjet.com/ejavailability/api/v66/availability/query?AdditionalSeats=0&AdultSeats=1&ArrivalIata=LGW&ChildSeats=0&DepartureIata=BFS&IncludeAdminFees=true&IncludeFlexiFares=false&IncludeLowestFareSeats=true&IncludePrices=true&Infants=0&IsTransfer=false&LanguageCode=EN&MaxDepartureDate=2023-03-20&MinDepartureDate=2023-03-18", nil)
if err != nil {
c.logger.WithError(err).Errorln("初始化abck请求失败")
return err
}
req.Header = http.Header{
"accept": {"*/*"},
"accept-language": {"de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"},
"user-agent": {"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"},
http.HeaderOrderKey: {
"accept",
"accept-language",
"user-agent",
},
}
resp, err := c.Client.Do(req)
if err != nil {
c.logger.WithError(err).Errorln("abck请求失败")
return err
}
defer resp.Body.Close()
readBytes, _ := io.ReadAll(resp.Body)
reg, _ := regexp.Compile("</noscript><script type=\"text/javascript\" src=\"(.+?)\"></s")
matchs := reg.FindStringSubmatch(string(readBytes))
if len(matchs) == 2 {
c.SensorUrl = matchs[1]
} else {
c.logger.Errorln("提取不到sensorUrl失败")
}
c.logger.Info("初始化abck 耗时", time.Since(startTime).String())
return nil
}
func EasyJet(carrierType, proxyUrl string) *Akm {
func EasyJet(carrierType, proxyUrl string) (*Akm, error) {
logger := logrus.WithField("typoe", carrierType)
logger.Info("使用代理", proxyUrl)
akmClient := NewAkmClient(U2Url, U2Url, proxyUrl, logger)
akmClient.init()
logger.Info("请求sensor url:", akmClient.SensorUrl)
if akmClient.SensorUrl == "" {
logger.Info("sensorUrl 初始化失败")
return nil
akmClient := NewAkmClient(U2Url, U2PostUrl, proxyUrl, logger)
akmClient.ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.50"
err := akmClient.init()
if err != nil {
return nil, err
}
for i := 0; i < 3; i++ {
err := akmClient.GetAbck(i, "https://www.easyjet.com/en/buy/flights?isOneWay=on&pid=www.easyjet.com")
err := akmClient.postSensor(i)
if err != nil {
logger.WithError(err).Errorln("请求失败")
return nil
akmClient.logger.WithError(err).Errorln("请求失败")
return nil, err
}
}
akm := &Akm{
Cookies: akmClient.GetAllCookie(),
Ua: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.50",
Ua: akmClient.ua,
}
//query()
return akm
}
func (c *AkmClient) GetAllCookie() map[string]string {
res := make(map[string]string)
uri, _ := url.Parse("https://www.easyjet.com/en")
cookies := c.Jar.Cookies(uri)
for _, v := range cookies {
res[v.Name] = v.Value
return akm, nil
}
return res
}
......@@ -9,7 +9,7 @@ import (
"time"
)
func routeToU2(w http.ResponseWriter, r *http.Request) {
func routeAkm(w http.ResponseWriter, r *http.Request) {
t1 := time.Now()
data := util.GetPostJson(r)
logrus.Info("请求一次", data)
......@@ -20,18 +20,21 @@ func routeToU2(w http.ResponseWriter, r *http.Request) {
carrierType := data["type"]
var akm *Akm
var akmErr error
switch strings.ToUpper(carrierType) {
case "U2":
akm = EasyJet(carrierType, data["proxy"])
akm, akmErr = EasyJet(carrierType, data["proxy"])
case "VY":
akm, akmErr = VueLing(carrierType, data["proxy"])
default:
util.WriteJson(w, util.ErrorJson("不支持的航司"))
return
}
logrus.Info("请求结束 耗时", time.Since(t1).String())
if akm == nil {
if akmErr != nil {
util.WriteJson(w, &util.Response{
Code: 500,
Message: "请求超时",
Message: akmErr.Error(),
})
return
}
......@@ -59,5 +62,5 @@ func checkPostRequire(data map[string]string) bool {
}
func InitRouter(r *mux.Router) {
r.HandleFunc("/gen", routeToU2)
r.HandleFunc("/gen", routeAkm)
}
......@@ -9,5 +9,7 @@ type Akm struct {
const (
U2Url = "https://www.easyjet.com/en"
U2PostUrl = "https://www.easyjet.com/en/buy/flights?isOneWay=on&pid=www.easyjet.com"
VYUrl = "https://m.vueling.com"
VYPostUrl = "https://m.vueling.com"
)
package model
import "github.com/sirupsen/logrus"
func VueLing(carrierType, proxyUrl string) (*Akm, error) {
logger := logrus.WithField("typoe", carrierType)
logger.Info("使用代理", proxyUrl)
akmClient := NewAkmClient(VYUrl, VYPostUrl, proxyUrl, logger)
akmClient.ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
err := akmClient.init()
if err != nil {
return nil, err
}
for i := 0; i < 3; i++ {
err := akmClient.postSensor(i)
if err != nil {
akmClient.logger.WithError(err).Errorln("请求失败")
return nil, err
}
}
akm := &Akm{
Cookies: akmClient.GetAllCookie(),
Ua: akmClient.ua,
}
//query()
return akm, nil
}
......@@ -118,7 +118,7 @@ func (akm *AkmEvent) event111(delay int64) {
e := -1
n := -1
o := -1
akm.dmact = akm.dmact + fmt.Sprintf("%d,%d,%d,%d,%d;", akm.doe_cnt, s, e, n, o)
akm.doact = akm.doact + fmt.Sprintf("%d,%d,%d,%d,%d;", akm.doe_cnt, s, e, n, o)
akm.ta += s
akm.doe_vel = akm.doe_vel + akm.doe_cnt + int(s)
akm.doe_cnt++
......
This diff is collapsed.
......@@ -17,6 +17,7 @@ func query(data []byte) {
v := model.Akm{}
json.Unmarshal(data, &v)
fmt.Println(v.Ua)
jar := tls_client.NewCookieJar()
options := []tls_client.HttpClientOption{
tls_client.WithTimeoutSeconds(30),
......@@ -62,24 +63,12 @@ func query(data []byte) {
//fmt.Println(string(readBytes))
}
func main() {
for i := 0; i < 1; i++ {
t1 := time.Now()
fmt.Println(t1)
wg := sync.WaitGroup{}
for i := 0; i < 1; i++ {
wg.Add(1)
go func() {
defer wg.Done()
//172.29.204.120
//resp, err := http.Post("http://172.29.199.203:9999/get-proxy", "application/x-www-form-urlencoded", strings.NewReader("name=NK&type=other&country=us"))
//resp, err := http.Get("http://127.0.0.1:9999/ping")
//resp, err := http.Post("http://lcc.unififi.com/proxy/get-proxy", "application/json", strings.NewReader("{\n \"name\": \"NK\",\n \"type\": \"shopping\"\n}"))
func actU2() {
t1 := time.Now()
//resp, err := http.Post("http://lcc.unififi.com/akamai/gen",
resp, err := http.Post("http://127.0.0.1:59001/akamai/gen",
//"application/json", strings.NewReader("{\"type\": \"u2\", \"proxy\": \"http://unfflcc:76cc14-47b8dd-1f8ace-827836-0c740e@usa.rotating.proxyrack.net:6521\"}"))
"application/json", strings.NewReader("{\"type\": \"u2\", \"proxy\": \"http://127.0.0.1:8890\"}"))
"application/json", strings.NewReader("{\"type\": \"U2\", \"proxy\": \"http://127.0.0.1:8890\"}"))
//resp, err := http.Post("http://127.0.0.1:59001/akamai/gen", "application/json", strings.NewReader("{\"type\": \"u2\", \"proxy\": \"http://user-unifflcc-region-us:q39CEBTs5A5YQXor@pr.roxlabs.cn:4600\"}"))
if err != nil {
//panic(err)
......@@ -89,6 +78,34 @@ func main() {
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("abck cost", time.Since(t1).String())
query(body)
}
func actVY() {
t1 := time.Now()
//resp, err := http.Post("http://lcc.unififi.com/akamai/gen",
resp, err := http.Post("http://127.0.0.1:59001/akamai/gen",
//"application/json", strings.NewReader("{\"type\": \"u2\", \"proxy\": \"http://unfflcc:76cc14-47b8dd-1f8ace-827836-0c740e@usa.rotating.proxyrack.net:6521\"}"))
"application/json", strings.NewReader("{\"type\": \"VY\", \"proxy\": \"http://127.0.0.1:8890\"}"))
//resp, err := http.Post("http://127.0.0.1:59001/akamai/gen", "application/json", strings.NewReader("{\"type\": \"u2\", \"proxy\": \"http://user-unifflcc-region-us:q39CEBTs5A5YQXor@pr.roxlabs.cn:4600\"}"))
if err != nil {
//panic(err)
fmt.Println(err)
return
}
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("abck cost", time.Since(t1).String())
testU2Data(body)
}
func main() {
for i := 0; i < 1; i++ {
t1 := time.Now()
fmt.Println(t1)
wg := sync.WaitGroup{}
for i := 0; i < 1; i++ {
wg.Add(1)
go func() {
defer wg.Done()
actVY()
actU2()
}()
}
......@@ -99,3 +116,56 @@ func main() {
}
}
func testU2Data(data []byte) {
datas := "{\n\t\"DeviceType\": \"WEB\",\n\t\"UserAgent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1\",\n\t\"Udid\": \"c4bf-275d-76b1-ff7f-83c3-cfcd\",\n\t\"IP\": \"235.231.34.152\",\n\t\"AppVersion\": \"17.2.0\",\n\t\"Domain\": \"https://m.vueling.com\",\n\t\"DiscountType\": 0,\n\t\"Paxs\": [{\n\t\t\"PaxType\": \"ADT\",\n\t\t\"Quantity\": \"1\"\n\t}, {\n\t\t\"PaxType\": \"CHD\",\n\t\t\"Quantity\": \"0\"\n\t}, {\n\t\t\"PaxType\": \"INF\",\n\t\t\"Quantity\": \"0\"\n\t}],\n\t\"CurrencyCode\": \"EUR\",\n\t\"AirportDateTimeList\": [{\n\t\t\"ArrivalStation\": \"LON\",\n\t\t\"DepartureStation\": \"LCG\",\n\t\t\"MarketDateDeparture\": \"2023-03-16\"\n\t}],\n\t\"Language\": \"en-GB\"\n}"
v := model.Akm{}
json.Unmarshal(data, &v)
fmt.Println(v.Ua)
jar := tls_client.NewCookieJar()
options := []tls_client.HttpClientOption{
tls_client.WithTimeoutSeconds(30),
tls_client.WithClientProfile(tls_client.Chrome_110),
tls_client.WithCookieJar(jar), // create cookieJar instance and pass it as argument
tls_client.WithProxyUrl("http://127.0.0.1:8890"),
//tls_client.WithProxyUrl("http://unfflcc:76cc14-47b8dd-1f8ace-827836-0c740e@usa.rotating.proxyrack.net:6521"),
tls_client.WithInsecureSkipVerify(),
}
uri, _ := url.Parse("https://m.vueling.com/")
var cookies []*http.Cookie
for key, value := range v.Cookies {
cookies = append(cookies, &http.Cookie{
Name: key,
Value: value,
})
}
jar.SetCookies(uri, cookies)
Client, err := tls_client.NewHttpClient(tls_client.NewNoopLogger(), options...)
req, err := http.NewRequest("POST", "https://apimobile.vueling.com/Vueling.Mobile.AvailabilityService.WebAPI/api/V2/AvailabilityController/DoAirPriceSB", strings.NewReader(datas))
if err != nil {
panic(err)
}
req.Header.Set("Host", "apimobile.vueling.com")
req.Header.Set("Upgrade-Insecure-Requests", "1")
req.Header.Set("user-agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("sec-fetch-site", "same-site")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("Sec-Fetch-User", "?1")
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("accept-language", "en-US,en;q=0.9")
req.Header.Set("pragma", "no-cache")
req.Header.Set("cache-control", "no-cache")
req.Header.Set("content-type", "application/json")
req.Header.Set("origin", "https://m.vueling.com")
req.Header.Set("referer", "https://m.vueling.com/")
req.Header.Set("Content-Type", "application/json")
resp, err := Client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("响应结果", resp.StatusCode)
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment