Commit d8fe0a64 authored by 王明明's avatar 王明明

改写

parent 87247bb9
...@@ -4,6 +4,7 @@ go 1.20 ...@@ -4,6 +4,7 @@ go 1.20
require ( require (
github.com/andybalholm/brotli v1.0.4 // indirect 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/fhttp v0.5.18 // indirect
github.com/bogdanfinn/tls-client v1.3.6 // indirect github.com/bogdanfinn/tls-client v1.3.6 // indirect
github.com/bogdanfinn/utls v1.5.14 // indirect github.com/bogdanfinn/utls v1.5.14 // indirect
......
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
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= github.com/bogdanfinn/fhttp v0.5.18 h1:n3lnt5huD9Z35I5gXJCBLiJJo8JMckb0Z05Nqnh+tIQ=
github.com/bogdanfinn/fhttp v0.5.18/go.mod h1:S9yg7SmaUVpsY5QvGJ1jY0ZvJ68jkPLW5VEqWlhYWRI= github.com/bogdanfinn/fhttp v0.5.18/go.mod h1:S9yg7SmaUVpsY5QvGJ1jY0ZvJ68jkPLW5VEqWlhYWRI=
github.com/bogdanfinn/tls-client v1.3.6 h1:yUy2eaM1dZDZ1Aygx4omDipwA6JAvGNqc0M/7WY4o98= github.com/bogdanfinn/tls-client v1.3.6 h1:yUy2eaM1dZDZ1Aygx4omDipwA6JAvGNqc0M/7WY4o98=
......
...@@ -2,8 +2,10 @@ package main ...@@ -2,8 +2,10 @@ package main
import ( import (
"fmt" "fmt"
nested "github.com/antonfisher/nested-logrus-formatter"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"log" "log"
"net/http" "net/http"
"test/model" "test/model"
...@@ -15,15 +17,23 @@ func WelcomeHandler(w http.ResponseWriter, r *http.Request) { ...@@ -15,15 +17,23 @@ func WelcomeHandler(w http.ResponseWriter, r *http.Request) {
func main() { func main() {
logrus.SetLevel(logrus.TraceLevel) logrus.SetLevel(logrus.TraceLevel)
logrus.SetFormatter(&logrus.TextFormatter{ //logrus.SetFormatter(&logrus.TextFormatter{
//HideKeys: true, // //HideKeys: true,
// TimestampFormat: "2006-01-02 15:04:05.000", //时间格式
// FullTimestamp: true,
//})
logrus.SetFormatter(&nested.Formatter{
HideKeys: true,
FieldsOrder: []string{"type"},
TimestampFormat: "2006-01-02 15:04:05.000", //时间格式 TimestampFormat: "2006-01-02 15:04:05.000", //时间格式
FullTimestamp: true,
}) })
//str := "<noscript><img src=\"https://www.easyjet.com/akam/13/pixel_7b9d10f9?a=dD1lMmMzOTBjM2M4NWUyYz\nkzNjljOTNhZDUyNmRkOGJjMDdjNjM2MWJmJmpzPW9mZg==\" style=\"visibility: hidden; position: absolu\nte; left: -999px; top: -999px;\" /></noscript><script type=\"text/javascript\" src=\"/-Hzovq/uluGM/jHPdr/v3N7/m5OOLVXmDOwY/NG4dCQE/Zy/lnEF9qaQI\"></script></body>\n</html>" //str := "<noscript><img src=\"https://www.easyjet.com/akam/13/pixel_7b9d10f9?a=dD1lMmMzOTBjM2M4NWUyYz\nkzNjljOTNhZDUyNmRkOGJjMDdjNjM2MWJmJmpzPW9mZg==\" style=\"visibility: hidden; position: absolu\nte; left: -999px; top: -999px;\" /></noscript><script type=\"text/javascript\" src=\"/-Hzovq/uluGM/jHPdr/v3N7/m5OOLVXmDOwY/NG4dCQE/Zy/lnEF9qaQI\"></script></body>\n</html>"
//str = "<noscript><img src=\"https://www.easyjet.com/akam/13/pixel_4ac30e0f?a=dD1kZmQ1ODJiODRhNzUxMzAzMDJmN\nTczMjdhMGVlZGEyNWM3MTcwNDY5JmpzPW9mZg==\" style=\"visibility: hidden; position: absolute; left: -999\npx; top: -999px;\" /></noscript><script type=\"text/javascript\" src=\"/9dz5yx/00N2ob/cHtIJhA/oGemj3/BA/SaOXNNXpVab5wO/PVZtb1s9Aw/by/ZID307CB8\"></script></body>\n"
//
//reg, _ := regexp.Compile("</noscript><script type=\"text/javascript\" src=\"(.+?)\"></s") //reg, _ := regexp.Compile("</noscript><script type=\"text/javascript\" src=\"(.+?)\"></s")
//matchs := reg.FindStringSubmatch(str) //matchs := reg.FindStringSubmatch(str)
//fmt.Println(matchs) //fmt.Println(matchs[1])
//print(len(matchs))
router := mux.NewRouter() router := mux.NewRouter()
router.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { router.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
......
package model package model
import ( import (
"fmt" "encoding/json"
"errors"
http "github.com/bogdanfinn/fhttp" http "github.com/bogdanfinn/fhttp"
tls_client "github.com/bogdanfinn/tls-client" tls_client "github.com/bogdanfinn/tls-client"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
...@@ -18,11 +19,11 @@ type AkmClient struct { ...@@ -18,11 +19,11 @@ type AkmClient struct {
Jar tls_client.CookieJar Jar tls_client.CookieJar
Client tls_client.HttpClient Client tls_client.HttpClient
SensorUrl string SensorUrl string
uri string
logger *logrus.Entry
} }
var akmClient *AkmClient func NewAkmClient(proxyUrl string, logger *logrus.Entry) *AkmClient {
func NewAkmClient(proxyUrl string) *AkmClient {
jar := tls_client.NewCookieJar() jar := tls_client.NewCookieJar()
options := []tls_client.HttpClientOption{ options := []tls_client.HttpClientOption{
tls_client.WithTimeoutSeconds(30), tls_client.WithTimeoutSeconds(30),
...@@ -44,11 +45,54 @@ func NewAkmClient(proxyUrl string) *AkmClient { ...@@ -44,11 +45,54 @@ func NewAkmClient(proxyUrl string) *AkmClient {
client.SetProxy(proxyUrl) client.SetProxy(proxyUrl)
} }
return &AkmClient{Jar: jar, Client: client} 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 < 3; 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
func GetAbck(times int, urlInput string) []*http.Cookie { }
abck, bmsz := GetCookie() return -1, errors.New("请求三次都失败返回结果吧")
}
func (c *AkmClient) GetAbck(times int, urlInput string) error {
abck, bmsz := c.GetCookie()
//data := url.Values{} //data := url.Values{}
//data.Set("times", strconv.Itoa(times)) //data.Set("times", strconv.Itoa(times))
//data.Set("abck", abck) //data.Set("abck", abck)
...@@ -64,22 +108,23 @@ func GetAbck(times int, urlInput string) []*http.Cookie { ...@@ -64,22 +108,23 @@ func GetAbck(times int, urlInput string) []*http.Cookie {
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 := "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() t1 := time.Now()
res := sensor.GenData(abck, bmsz, ua, urlInput) res := sensor.GenData(abck, bmsz, ua, urlInput)
logrus.Info("生产一次 abck 耗时", time.Since(t1).String()) c.logger.Info("生成一次 abck 耗时", time.Since(t1).String())
t1 = time.Now() t1 = time.Now()
sensor_data := "{\"sensor_data\":\"" + string(res) + "\"}" sensor_data := "{\"sensor_data\":\"" + string(res) + "\"}"
akmRes, err := akmClient.Client.Post("https://www.easyjet.com"+akmClient.SensorUrl, "application/json", strings.NewReader(sensor_data)) //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 { if err != nil {
log.Fatalln(err) return err
} }
defer akmRes.Body.Close()
logrus.Info("第", times, "响应abck结果", akmRes.StatusCode, "请求耗时", time.Since(t1).String())
return akmRes.Cookies()
c.logger.Info("第", times, "响应abck结果", statusCode, "请求耗时", time.Since(t1).String())
//defer akmRes.Body.Close()
return nil
} }
func GetCookie() (string, string) { func (c *AkmClient) GetCookie() (string, string) {
uri, _ := url.Parse("https://www.easyjet.com/en") uri, _ := url.Parse("https://www.easyjet.com/en")
cookies := akmClient.Jar.Cookies(uri) cookies := c.Jar.Cookies(uri)
abck := "" abck := ""
bmsz := "" bmsz := ""
for _, v := range cookies { for _, v := range cookies {
...@@ -92,12 +137,13 @@ func GetCookie() (string, string) { ...@@ -92,12 +137,13 @@ func GetCookie() (string, string) {
} }
return abck, bmsz return abck, bmsz
} }
func initAbck(url string) string { func (c *AkmClient) init() error {
req, err := http.NewRequest(http.MethodGet, url, nil) 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) //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 { if err != nil {
log.Println(err) c.logger.WithError(err).Errorln("初始化abck请求失败")
return "" return err
} }
req.Header = http.Header{ req.Header = http.Header{
...@@ -111,59 +157,46 @@ func initAbck(url string) string { ...@@ -111,59 +157,46 @@ func initAbck(url string) string {
}, },
} }
resp, err := akmClient.Client.Do(req) resp, err := c.Client.Do(req)
defer resp.Body.Close()
if err != nil { if err != nil {
log.Println(err) c.logger.WithError(err).Errorln("abck请求失败")
return "" return err
} }
defer resp.Body.Close()
readBytes, _ := io.ReadAll(resp.Body) readBytes, _ := io.ReadAll(resp.Body)
//fmt.Println(string(readBytes))
reg, _ := regexp.Compile("</noscript><script type=\"text/javascript\" src=\"(.+?)\"></s") reg, _ := regexp.Compile("</noscript><script type=\"text/javascript\" src=\"(.+?)\"></s")
matchs := reg.FindStringSubmatch(string(readBytes)) matchs := reg.FindStringSubmatch(string(readBytes))
if len(matchs) == 2 { if len(matchs) == 2 {
return matchs[1] c.SensorUrl = matchs[1]
} else {
c.logger.Errorln("提取不到sensorUrl失败")
} }
return "" c.logger.Info("初始化abck 耗时", time.Since(startTime).String())
return nil
} }
func query() {
req, err := http.NewRequest("GET", "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) func EasyJet(carrierType, proxyUrl string) *Akm {
if err != nil { logger := logrus.WithField("typoe", carrierType)
panic(err) logger.Info("使用代理", proxyUrl)
} akmClient := NewAkmClient(proxyUrl, logger)
req.Header = http.Header{ akmClient.init()
"accept": {"*/*"}, logger.Info("请求sensor url:", akmClient.SensorUrl)
"accept-language": {"de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"}, if akmClient.SensorUrl == "" {
"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"}, logger.Info("sensorUrl 初始化失败")
http.HeaderOrderKey: { return nil
"accept",
"accept-language",
"user-agent",
},
}
resp, err := akmClient.Client.Do(req)
if err != nil {
panic(err)
} }
defer resp.Body.Close() for i := 0; i < 3; i++ {
fmt.Println("响应结果", resp.StatusCode) err := akmClient.GetAbck(i, "https://www.easyjet.com/en/buy/flights?isOneWay=on&pid=www.easyjet.com")
readBytes, _ := io.ReadAll(resp.Body) if err != nil {
fmt.Println(string(readBytes)) logger.WithError(err).Errorln("请求失败")
return nil
}
} }
func EasyJet(proxyUrl string) *Akm {
fmt.Println("使用代理", proxyUrl)
akmClient = NewAkmClient(proxyUrl)
url := "https://www.easyjet.com/en"
akmClient.SensorUrl = initAbck(url)
fmt.Println("请求sensor url:", akmClient.SensorUrl)
GetAbck(0, "https://www.easyjet.com/en/buy/flights?isOneWay=on&pid=www.easyjet.com")
GetAbck(1, "https://www.easyjet.com/en/buy/flights?isOneWay=on&pid=www.easyjet.com")
GetAbck(2, "https://www.easyjet.com/en/buy/flights?isOneWay=on&pid=www.easyjet.com")
akm := &Akm{ akm := &Akm{
Cookies: GetAllCookie(), 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: "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",
} }
//query() //query()
...@@ -171,10 +204,10 @@ func EasyJet(proxyUrl string) *Akm { ...@@ -171,10 +204,10 @@ func EasyJet(proxyUrl string) *Akm {
} }
func GetAllCookie() map[string]string { func (c *AkmClient) GetAllCookie() map[string]string {
res := make(map[string]string) res := make(map[string]string)
uri, _ := url.Parse("https://www.easyjet.com/en") uri, _ := url.Parse("https://www.easyjet.com/en")
cookies := akmClient.Jar.Cookies(uri) cookies := c.Jar.Cookies(uri)
for _, v := range cookies { for _, v := range cookies {
res[v.Name] = v.Value res[v.Name] = v.Value
......
...@@ -14,20 +14,26 @@ func routeToU2(w http.ResponseWriter, r *http.Request) { ...@@ -14,20 +14,26 @@ func routeToU2(w http.ResponseWriter, r *http.Request) {
logrus.Info("请求一次", data) logrus.Info("请求一次", data)
if err := checkPostRequire(data); err == false { if err := checkPostRequire(data); err == false {
util.WriteJson(w, util.ErrorJson("请求参数不正确")) util.WriteJson(w, util.ErrorJson("请求参数不正确"))
return
} }
carrierType := data["type"] carrierType := data["type"]
var akm *Akm var akm *Akm
switch carrierType { switch carrierType {
case "u2": case "u2":
akm = EasyJet(data["proxy"].(string)) akm = EasyJet(carrierType.(string), data["proxy"].(string))
default: default:
util.WriteJson(w, util.ErrorJson("不支持的航司")) util.WriteJson(w, util.ErrorJson("不支持的航司"))
return return
} }
logrus.Info("请求结束 耗时", time.Since(t1).String()) logrus.Info("请求结束 耗时", time.Since(t1).String())
if akm == nil {
util.WriteJson(w, &util.Response{
Code: 500,
Message: "请求超时",
})
return
}
cookies := akm.Cookies cookies := akm.Cookies
util.WriteJson(w, &util.Response{ util.WriteJson(w, &util.Response{
......
...@@ -16,7 +16,9 @@ import ( ...@@ -16,7 +16,9 @@ import (
func query(data []byte) { func query(data []byte) {
v := model.Akm{} v := model.Akm{}
json.Unmarshal(data, &v) json.Unmarshal(data, &v)
fmt.Println(string(data))
jar := tls_client.NewCookieJar() jar := tls_client.NewCookieJar()
options := []tls_client.HttpClientOption{ options := []tls_client.HttpClientOption{
tls_client.WithTimeoutSeconds(30), tls_client.WithTimeoutSeconds(30),
...@@ -24,7 +26,7 @@ func query(data []byte) { ...@@ -24,7 +26,7 @@ func query(data []byte) {
tls_client.WithNotFollowRedirects(), tls_client.WithNotFollowRedirects(),
tls_client.WithCookieJar(jar), // create cookieJar instance and pass it as argument tls_client.WithCookieJar(jar), // create cookieJar instance and pass it as argument
//tls_client.WithProxyUrl("http://user-unifflcc-region-us:q39CEBTs5A5YQXor@pr.roxlabs.cn:4600"), //tls_client.WithProxyUrl("http://user-unifflcc-region-us:q39CEBTs5A5YQXor@pr.roxlabs.cn:4600"),
tls_client.WithProxyUrl("http://127.0.0.1:8890"), tls_client.WithProxyUrl("http://127.0.0.1:8888"),
tls_client.WithInsecureSkipVerify(), tls_client.WithInsecureSkipVerify(),
} }
uri, _ := url.Parse("https://www.easyjet.com/") uri, _ := url.Parse("https://www.easyjet.com/")
...@@ -76,7 +78,7 @@ func main() { ...@@ -76,7 +78,7 @@ func main() {
//resp, err := http.Get("http://127.0.0.1:9999/ping") //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}")) //resp, err := http.Post("http://lcc.unififi.com/proxy/get-proxy", "application/json", strings.NewReader("{\n \"name\": \"NK\",\n \"type\": \"shopping\"\n}"))
t1 := time.Now() t1 := time.Now()
resp, err := http.Post("http://127.0.0.1:19999/akamai/gen", "application/json", strings.NewReader("{\"type\": \"u2\", \"proxy\": \"http://127.0.0.1:8890\"}")) resp, err := http.Post("http://127.0.0.1:19999/akamai/gen", "application/json", strings.NewReader("{\"type\": \"u2\", \"proxy\": \"http://127.0.0.1:8888\"}"))
if err != nil { if err != nil {
//panic(err) //panic(err)
fmt.Println(err) fmt.Println(err)
......
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