Spaces:
Runtime error
Runtime error
| package funcaptcha | |
| import ( | |
| "WarpGPT/pkg/env" | |
| "encoding/json" | |
| http "github.com/bogdanfinn/fhttp" | |
| tls_client "github.com/bogdanfinn/tls-client" | |
| "github.com/bogdanfinn/tls-client/profiles" | |
| "net/url" | |
| "os" | |
| "path" | |
| "path/filepath" | |
| "strings" | |
| "time" | |
| ) | |
| type arkVer int | |
| const ( | |
| ArkVerAuth arkVer = 0 | |
| ArkVerReg arkVer = 1 | |
| ArkVerChat3 arkVer = 3 | |
| ArkVerChat4 arkVer = 4 | |
| ) | |
| type Solver struct { | |
| initVer string | |
| initHex string | |
| arks map[arkVer][]arkReq | |
| client *tls_client.HttpClient | |
| } | |
| type solverArg func(*Solver) | |
| func NewSolver(args ...solverArg) *Solver { | |
| var ( | |
| jar = tls_client.NewCookieJar() | |
| options = []tls_client.HttpClientOption{ | |
| tls_client.WithTimeoutSeconds(360), | |
| tls_client.WithClientProfile(profiles.Chrome_117), | |
| tls_client.WithRandomTLSExtensionOrder(), | |
| tls_client.WithNotFollowRedirects(), | |
| tls_client.WithCookieJar(jar), | |
| } | |
| client, _ = tls_client.NewHttpClient(tls_client.NewNoopLogger(), options...) | |
| ) | |
| s := &Solver{ | |
| arks: make(map[arkVer][]arkReq), | |
| client: &client, | |
| initVer: "1.5.4", | |
| initHex: "cd12da708fe6cbe6e068918c38de2ad9", | |
| } | |
| for _, arg := range args { | |
| arg(s) | |
| } | |
| return s | |
| } | |
| func WithInitVer(ver string) solverArg { | |
| return func(s *Solver) { | |
| s.initVer = ver | |
| } | |
| } | |
| func WithProxy(proxy string) solverArg { | |
| return func(s *Solver) { | |
| (*s.client).SetProxy(proxy) | |
| } | |
| } | |
| func WithInitHex(hex string) solverArg { | |
| return func(s *Solver) { | |
| s.initHex = hex | |
| } | |
| } | |
| func WithClient(client *tls_client.HttpClient) solverArg { | |
| return func(s *Solver) { | |
| s.client = client | |
| } | |
| } | |
| func WithHarData(harData HARData) solverArg { | |
| return func(s *Solver) { | |
| for _, v := range harData.Log.Entries { | |
| if strings.HasPrefix(v.Request.URL, arkPreURL) || strings.HasPrefix(v.Request.URL, arkAuthPreURL) { | |
| var tmpArk arkReq | |
| tmpArk.arkURL = v.Request.URL | |
| if v.StartedDateTime == "" { | |
| println("Error: no arkose request!") | |
| continue | |
| } | |
| t, _ := time.Parse(time.RFC3339, v.StartedDateTime) | |
| bw := getBw(t.Unix()) | |
| fallbackBw := getBw(t.Unix() - 21600) | |
| tmpArk.arkHeader = make(http.Header) | |
| for _, h := range v.Request.Headers { | |
| if !strings.EqualFold(h.Name, "content-length") && !strings.EqualFold(h.Name, "cookie") && !strings.HasPrefix(h.Name, ":") { | |
| tmpArk.arkHeader.Set(h.Name, h.Value) | |
| if strings.EqualFold(h.Name, "user-agent") { | |
| tmpArk.userAgent = h.Value | |
| } | |
| } | |
| } | |
| tmpArk.arkCookies = []*http.Cookie{} | |
| for _, cookie := range v.Request.Cookies { | |
| expire, _ := time.Parse(time.RFC3339, cookie.Expires) | |
| if expire.After(time.Now()) { | |
| tmpArk.arkCookies = append(tmpArk.arkCookies, &http.Cookie{Name: cookie.Name, Value: cookie.Value, Expires: expire.UTC()}) | |
| } | |
| } | |
| var arkType string | |
| tmpArk.arkBody = make(url.Values) | |
| for _, p := range v.Request.PostData.Params { | |
| if p.Name == "bda" { | |
| cipher, err := url.QueryUnescape(p.Value) | |
| if err != nil { | |
| panic(err) | |
| } | |
| tmpArk.arkBx = Decrypt(cipher, tmpArk.userAgent+bw, tmpArk.userAgent+fallbackBw) | |
| } else if p.Name != "rnd" { | |
| query, err := url.QueryUnescape(p.Value) | |
| if err != nil { | |
| panic(err) | |
| } | |
| tmpArk.arkBody.Set(p.Name, query) | |
| if p.Name == "public_key" { | |
| if query == "0A1D34FC-659D-4E23-B17B-694DCFCF6A6C" { | |
| arkType = "auth" | |
| s.arks[ArkVerAuth] = append(s.arks[ArkVerAuth], tmpArk) | |
| } else if query == "3D86FBBA-9D22-402A-B512-3420086BA6CC" { | |
| arkType = "chat3" | |
| s.arks[ArkVerChat3] = append(s.arks[ArkVerChat3], tmpArk) | |
| } else if query == "35536E1E-65B4-4D96-9D97-6ADB7EFF8147" { | |
| arkType = "chat4" | |
| s.arks[ArkVerChat4] = append(s.arks[ArkVerChat4], tmpArk) | |
| } else if query == "0655BC92-82E1-43D9-B32E-9DF9B01AF50C" { | |
| arkType = "reg" | |
| s.arks[ArkVerReg] = append(s.arks[ArkVerReg], tmpArk) | |
| } | |
| } | |
| } | |
| } | |
| if tmpArk.arkBx != "" { | |
| println("success read " + arkType + " arkose") | |
| } else { | |
| println("failed to decrypt HAR file") | |
| } | |
| } | |
| } | |
| } | |
| } | |
| func WithHarpool(s *Solver) { | |
| dirPath := path.Join(path.Dir(env.EnvFile), "harPool") | |
| var harPath []string | |
| err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { | |
| if err != nil { | |
| return err | |
| } | |
| if !info.IsDir() { | |
| ext := filepath.Ext(info.Name()) | |
| if ext == ".har" { | |
| harPath = append(harPath, path) | |
| } | |
| } | |
| return nil | |
| }) | |
| if err != nil { | |
| println("Error: please put HAR files in harPool directory!") | |
| } | |
| for _, path := range harPath { | |
| file, err := os.ReadFile(path) | |
| if err != nil { | |
| return | |
| } | |
| var harFile HARData | |
| err = json.Unmarshal(file, &harFile) | |
| if err != nil { | |
| println("Error: not a HAR file!") | |
| return | |
| } | |
| WithHarData(harFile)(s) | |
| } | |
| } | |