├── README.md ├── .gitignore ├── LICENSE ├── .github └── workflows │ └── go.yml ├── fingerprint.go ├── util.go ├── go.mod ├── cmd ├── api │ └── main.go └── main.go ├── murmur.go ├── webgl.go ├── crypt.go ├── api.go ├── go.sum ├── challenge.go ├── hashing.go └── constants.go /README.md: -------------------------------------------------------------------------------- 1 | # Arkose Fetch 2 | 3 | Usage for OpenAI 4 | 5 | ```go 6 | import ( 7 | "fmt" 8 | 9 | "github.com/xqdoo00o/funcaptcha" 10 | ) 11 | 12 | func main() { 13 | token, _ := funcaptcha.GetOpenAIToken("", "") 14 | fmt.Println(token) 15 | } 16 | ``` 17 | 18 | ## API: 19 | You can download the binary from releases or `go run cmd/api/main.go` 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # If you prefer the allow list template instead of the deny list, see community template: 2 | # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore 3 | # 4 | # Binaries for programs and plugins 5 | *.exe 6 | *.exe~ 7 | *.dll 8 | *.so 9 | *.dylib 10 | 11 | # Test binary, built with `go test -c` 12 | *.test 13 | 14 | # Output of the go coverage tool, specifically when used with LiteIDE 15 | *.out 16 | 17 | # Dependency directories (remove the comment below to include it) 18 | # vendor/ 19 | 20 | # Go workspace file 21 | go.work 22 | 23 | .idea 24 | *.png 25 | *.mp3 26 | *.py -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 BigFan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a golang project 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go 3 | 4 | name: Release Workflow 5 | on: 6 | release: 7 | types: 8 | - created 9 | permissions: 10 | contents: write 11 | 12 | jobs: 13 | 14 | build: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v3 18 | 19 | - name: Set up Go 20 | uses: actions/setup-go@v3 21 | with: 22 | go-version: 1.19 23 | 24 | - name: Build 25 | run: go build -o bin/captchapi ./cmd/api 26 | 27 | - name: recursively list files 28 | run: ls -R 29 | 30 | - name: Get existing release body 31 | id: get_release_body 32 | run: | 33 | echo "::set-output name=body::$(curl -s -H 'Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' https://api.github.com/repos/${{ github.repository }}/releases/tags/${{ github.ref_path }} | jq -r '.body')" 34 | 35 | - name: Upload release artifact 36 | uses: svenstaro/upload-release-action@v2 37 | with: 38 | file: bin/* 39 | file_glob: true 40 | tag: ${{ github.ref }} 41 | body: | 42 | ${{ steps.get_release_body.outputs.body }} 43 | repo_token: ${{ secrets.GITHUB_TOKEN }} 44 | -------------------------------------------------------------------------------- /fingerprint.go: -------------------------------------------------------------------------------- 1 | package funcaptcha 2 | 3 | import ( 4 | "encoding/base64" 5 | "encoding/json" 6 | "fmt" 7 | "strings" 8 | "time" 9 | ) 10 | 11 | func getF() string { 12 | var res []string 13 | for _, val := range fe { 14 | for _, v := range val { 15 | res = append(res, fmt.Sprintf("%v", v)) 16 | } 17 | } 18 | return getMurmur128String(strings.Join(res, "~~~"), 31) 19 | } 20 | 21 | func getN(t time.Time) string { 22 | timestamp := fmt.Sprintf("%d", t.Unix()) 23 | return base64.StdEncoding.EncodeToString([]byte(timestamp)) 24 | } 25 | 26 | func getWh() string { 27 | return fmt.Sprintf("%s|%s", getWindowHash(), getWindowProtoChainHash()) 28 | } 29 | 30 | func getFe() string { 31 | fe, _ := json.Marshal(getFeList()) 32 | return string(fe) 33 | } 34 | 35 | func getFeList() []string { 36 | // var b6 = []; 37 | var feList []string 38 | for _, feMap := range fe { 39 | for k, v := range feMap { 40 | if k == "S" || 41 | k == "AS" || 42 | k == "JSF" || 43 | k == "T" { 44 | v = strings.ReplaceAll(v.(string), ";", ",") 45 | } else if k == "CFP" { // case dH(f_a_iI.X): 46 | v = getCFPHash(cfp) 47 | } else if k == "P" { // case 'P': 48 | v = getP(p) 49 | } 50 | feList = append(feList, fmt.Sprintf("%v:%v", k, v)) 51 | } 52 | } 53 | return feList 54 | } 55 | 56 | func getP(p string) string { 57 | var pList []string 58 | for _, s := range strings.Split(p, ";") { 59 | split := strings.Split(s, "::") 60 | pList = append(pList, split[0]) 61 | } 62 | return strings.Join(pList, ",") 63 | } 64 | -------------------------------------------------------------------------------- /util.go: -------------------------------------------------------------------------------- 1 | package funcaptcha 2 | 3 | import ( 4 | "encoding/base64" 5 | "encoding/json" 6 | "fmt" 7 | "io" 8 | "net/url" 9 | "os" 10 | "strings" 11 | "time" 12 | 13 | http "github.com/bogdanfinn/fhttp" 14 | ) 15 | 16 | func toJSON(data interface{}) string { 17 | str, _ := json.Marshal(data) 18 | return string(str) 19 | } 20 | 21 | func jsonToForm(data string) string { 22 | // Unmarshal into map 23 | var form_data map[string]interface{} 24 | json.Unmarshal([]byte(data), &form_data) 25 | // Use reflection to convert to form data 26 | var form url.Values = url.Values{} 27 | for k, v := range form_data { 28 | form.Add(k, fmt.Sprintf("%v", v)) 29 | } 30 | return form.Encode() 31 | } 32 | 33 | func DownloadChallenge(urls []string, b64 bool) ([]string, error) { 34 | var b64_imgs []string = make([]string, len(urls)) 35 | for i, url := range urls { 36 | req, _ := http.NewRequest(http.MethodGet, url, nil) 37 | req.Header = headers 38 | resp, err := (*client).Do(req) 39 | if err != nil { 40 | return nil, err 41 | } 42 | defer resp.Body.Close() 43 | 44 | if resp.StatusCode != 200 { 45 | return nil, fmt.Errorf("status code %d", resp.StatusCode) 46 | } 47 | 48 | body, _ := io.ReadAll(resp.Body) 49 | // Figure out filename from URL 50 | url_paths := strings.Split(url, "/") 51 | if !b64 { 52 | filename := strings.Split(url_paths[len(url_paths)-1], "?")[0] 53 | if filename == "image" { 54 | filename = fmt.Sprintf("image_%s.png", getTimeStamp()) 55 | } 56 | err = os.WriteFile(filename, body, 0644) 57 | if err != nil { 58 | return nil, err 59 | } 60 | } else { 61 | // base64 encode body 62 | b64_imgs[i] = base64.StdEncoding.EncodeToString(body) 63 | } 64 | } 65 | return b64_imgs, nil 66 | } 67 | 68 | func getTimeStamp() string { 69 | return fmt.Sprintf("%d", time.Now().UnixNano()/int64(time.Millisecond)) 70 | } 71 | 72 | func getRequestId(sessionId string) string { 73 | pwd := fmt.Sprintf("REQUESTED%sID", sessionId) 74 | return Encrypt(`{"sc":[147,307]}`, pwd) 75 | } 76 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/xqdoo00o/funcaptcha 2 | 3 | go 1.21 4 | 5 | require ( 6 | github.com/acheong08/endless v0.0.0-20230615162514-90545c7793fd 7 | github.com/bogdanfinn/fhttp v0.5.28 8 | github.com/bogdanfinn/tls-client v1.7.5 9 | github.com/gin-gonic/gin v1.9.1 10 | github.com/google/uuid v1.6.0 11 | ) 12 | 13 | require ( 14 | github.com/andybalholm/brotli v1.1.0 // indirect 15 | github.com/bogdanfinn/utls v1.6.1 // indirect 16 | github.com/bytedance/sonic v1.9.1 // indirect 17 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect 18 | github.com/cloudflare/circl v1.3.8 // indirect 19 | github.com/gabriel-vasile/mimetype v1.4.2 // indirect 20 | github.com/gin-contrib/sse v0.1.0 // indirect 21 | github.com/go-playground/locales v0.14.1 // indirect 22 | github.com/go-playground/universal-translator v0.18.1 // indirect 23 | github.com/go-playground/validator/v10 v10.14.0 // indirect 24 | github.com/goccy/go-json v0.10.2 // indirect 25 | github.com/json-iterator/go v1.1.12 // indirect 26 | github.com/klauspost/compress v1.17.8 // indirect 27 | github.com/klauspost/cpuid/v2 v2.2.4 // indirect 28 | github.com/kr/text v0.2.0 // indirect 29 | github.com/leodido/go-urn v1.2.4 // indirect 30 | github.com/mattn/go-isatty v0.0.19 // indirect 31 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 32 | github.com/modern-go/reflect2 v1.0.2 // indirect 33 | github.com/pelletier/go-toml/v2 v2.0.8 // indirect 34 | github.com/quic-go/quic-go v0.43.1 // indirect 35 | github.com/rogpeppe/go-internal v1.12.0 // indirect 36 | github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5 // indirect 37 | github.com/twitchyliquid64/golang-asm v0.15.1 // indirect 38 | github.com/ugorji/go/codec v1.2.11 // indirect 39 | golang.org/x/arch v0.3.0 // indirect 40 | golang.org/x/crypto v0.23.0 // indirect 41 | golang.org/x/net v0.25.0 // indirect 42 | golang.org/x/sys v0.20.0 // indirect 43 | golang.org/x/text v0.15.0 // indirect 44 | google.golang.org/protobuf v1.30.0 // indirect 45 | gopkg.in/yaml.v3 v3.0.1 // indirect 46 | ) 47 | -------------------------------------------------------------------------------- /cmd/api/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "net/http" 6 | "os" 7 | 8 | "github.com/acheong08/endless" 9 | gin "github.com/gin-gonic/gin" 10 | "github.com/xqdoo00o/funcaptcha" 11 | ) 12 | 13 | var apiBreaker *funcaptcha.ApiBreaker 14 | 15 | func main() { 16 | r := gin.Default() 17 | r.GET("/captcha/start", captchaStart) 18 | r.POST("/captcha/verify", captchaVerify) 19 | port := os.Getenv("PORT") 20 | if port == "" { 21 | port = "8080" 22 | } 23 | endless.ListenAndServe("127.0.0.1:"+port, r) 24 | } 25 | 26 | func captchaStart(c *gin.Context) { 27 | token, err := funcaptcha.GetOpenAITokenWithBx(4, `[{"key":"enhanced_fp","value":[{"key":"navigator_battery_charging","value":true}]},{"key":"fe","value":["DNT:1","L:zh-CN","D:24","PR:1","S:1920,1080","AS:1920,1080","TO:-480","SS:true","LS:true","IDB:true","B:false","ODB:true","CPUC:unknown","PK:Linux x86_64","CFP:11866 se","H:16","SWF:false"]}]`, "", "", "") 28 | if err == nil { 29 | c.JSON(200, gin.H{"token": token, "status": "success"}) 30 | return 31 | } 32 | if err.Error() != "captcha required" { 33 | c.JSON(500, gin.H{"error": err.Error()}) 34 | return 35 | } 36 | hex := "cd12da708fe6cbe6e068918c38de2ad9" 37 | session, err := funcaptcha.StartChallenge(token, hex) 38 | if err != nil { 39 | c.JSON(500, gin.H{"error": "unable to log requests"}) 40 | return 41 | } 42 | apiBreaker, err = session.RequestChallenge(false) 43 | if err != nil { 44 | c.JSON(500, gin.H{"error": "failed to request challenge"}) 45 | return 46 | } 47 | // Get form data (check if download_images is true) 48 | download_images := c.Query("download_images") 49 | var images []string 50 | if download_images == "true" { 51 | // Get Base64 encoded image 52 | images, err = funcaptcha.DownloadChallenge(session.ConciseChallenge.URLs, true) 53 | if err != nil { 54 | c.JSON(500, gin.H{"error": "failed to download images"}) 55 | return 56 | } 57 | } 58 | c.JSON(http.StatusNetworkAuthenticationRequired, gin.H{"token": token, "session": session, "status": "captcha", "images": images}) 59 | } 60 | 61 | func captchaVerify(c *gin.Context) { 62 | type submissionRequest struct { 63 | Index int `json:"index"` 64 | Session funcaptcha.Session `json:"session"` 65 | } 66 | var request submissionRequest 67 | // Map the request body to the submissionRequest struct 68 | if c.Request.Body != nil { 69 | err := json.NewDecoder(c.Request.Body).Decode(&request) 70 | if err != nil { 71 | c.JSON(400, gin.H{"error": err.Error()}) 72 | return 73 | } 74 | } else { 75 | c.JSON(400, gin.H{"error": "request body not provided"}) 76 | return 77 | } 78 | // Verify the captcha 79 | err := request.Session.SubmitAnswer([]int{request.Index}, false, apiBreaker) 80 | if err != nil { 81 | c.JSON(500, gin.H{"error": err.Error()}) 82 | return 83 | } 84 | // Success 85 | c.JSON(200, gin.H{"status": "success"}) 86 | } 87 | -------------------------------------------------------------------------------- /murmur.go: -------------------------------------------------------------------------------- 1 | package funcaptcha 2 | 3 | import ( 4 | "encoding/binary" 5 | "fmt" 6 | ) 7 | 8 | type digest struct { 9 | h1, h2 uint64 10 | length int 11 | seed uint64 12 | } 13 | 14 | func getMurmur128String(input string, seed uint64) string { 15 | d := newWithSeed(seed) 16 | d.Write([]byte(input)) 17 | h1, h2 := d.Sum() 18 | return fmt.Sprintf("%016x%016x", h1, h2) 19 | } 20 | 21 | func newWithSeed(seed uint64) *digest { 22 | d := new(digest) 23 | d.seed = seed 24 | d.h1 = seed 25 | d.h2 = seed 26 | return d 27 | } 28 | 29 | func (d *digest) Write(data []byte) { 30 | length := len(data) 31 | d.length += length 32 | 33 | var ( 34 | h1 = d.h1 35 | h2 = d.h2 36 | c1 = uint64(0x87c37b91114253d5) 37 | c2 = uint64(0x4cf5ad432745937f) 38 | ) 39 | 40 | for len(data) >= 16 { 41 | k1 := binary.LittleEndian.Uint64(data) 42 | k2 := binary.LittleEndian.Uint64(data[8:]) 43 | 44 | k1 *= c1 45 | k1 = (k1 << 31) | (k1 >> (64 - 31)) 46 | k1 *= c2 47 | h1 ^= k1 48 | 49 | h1 = (h1 << 27) | (h1 >> (64 - 27)) 50 | h1 += h2 51 | h1 = h1*5 + 0x52dce729 52 | 53 | k2 *= c2 54 | k2 = (k2 << 33) | (k2 >> (64 - 33)) 55 | k2 *= c1 56 | h2 ^= k2 57 | 58 | h2 = (h2 << 31) | (h2 >> (64 - 31)) 59 | h2 += h1 60 | h2 = h2*5 + 0x38495ab5 61 | 62 | data = data[16:] 63 | } 64 | 65 | var k1, k2 uint64 66 | 67 | switch len(data) { 68 | case 15: 69 | k2 ^= uint64(data[14]) << 48 70 | fallthrough 71 | case 14: 72 | k2 ^= uint64(data[13]) << 40 73 | fallthrough 74 | case 13: 75 | k2 ^= uint64(data[12]) << 32 76 | fallthrough 77 | case 12: 78 | k2 ^= uint64(data[11]) << 24 79 | fallthrough 80 | case 11: 81 | k2 ^= uint64(data[10]) << 16 82 | fallthrough 83 | case 10: 84 | k2 ^= uint64(data[9]) << 8 85 | fallthrough 86 | case 9: 87 | k2 ^= uint64(data[8]) 88 | k2 *= c2 89 | k2 = (k2 << 33) | (k2 >> (64 - 33)) 90 | k2 *= c1 91 | h2 ^= k2 92 | 93 | fallthrough 94 | case 8: 95 | k1 ^= uint64(data[7]) << 56 96 | fallthrough 97 | case 7: 98 | k1 ^= uint64(data[6]) << 48 99 | fallthrough 100 | case 6: 101 | k1 ^= uint64(data[5]) << 40 102 | fallthrough 103 | case 5: 104 | k1 ^= uint64(data[4]) << 32 105 | fallthrough 106 | case 4: 107 | k1 ^= uint64(data[3]) << 24 108 | fallthrough 109 | case 3: 110 | k1 ^= uint64(data[2]) << 16 111 | fallthrough 112 | case 2: 113 | k1 ^= uint64(data[1]) << 8 114 | fallthrough 115 | case 1: 116 | k1 ^= uint64(data[0]) 117 | k1 *= c1 118 | k1 = (k1 << 31) | (k1 >> (64 - 31)) 119 | k1 *= c2 120 | h1 ^= k1 121 | } 122 | 123 | h1 ^= uint64(length) 124 | h2 ^= uint64(length) 125 | 126 | h1 += h2 127 | h2 += h1 128 | 129 | h1 = fmix(h1) 130 | h2 = fmix(h2) 131 | 132 | h1 += h2 133 | h2 += h1 134 | d.h1 = h1 135 | d.h2 = h2 136 | } 137 | 138 | func (d *digest) Sum() (h1, h2 uint64) { 139 | return d.h1, d.h2 140 | } 141 | 142 | func fmix(k uint64) uint64 { 143 | k ^= k >> 33 144 | k *= 0xff51afd7ed558ccd 145 | k ^= k >> 33 146 | k *= 0xc4ceb9fe1a85ec53 147 | k ^= k >> 33 148 | return k 149 | } 150 | -------------------------------------------------------------------------------- /webgl.go: -------------------------------------------------------------------------------- 1 | package funcaptcha 2 | 3 | import "strings" 4 | 5 | const ( 6 | webglExtensions = "ANGLE_instanced_arrays;EXT_blend_minmax;EXT_color_buffer_half_float;EXT_disjoint_timer_query;EXT_float_blend;EXT_frag_depth;EXT_shader_texture_lod;EXT_texture_compression_bptc;EXT_texture_compression_rgtc;EXT_texture_filter_anisotropic;EXT_sRGB;KHR_parallel_shader_compile;OES_element_index_uint;OES_fbo_render_mipmap;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_color_buffer_float;WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context;WEBGL_multi_draw" // this.getWebGLKeys(); 7 | webglRenderer = "WebKit WebGL" 8 | webglVendor = "WebKit" 9 | webglVersion = "WebGL 1.0 (OpenGL ES 2.0 Chromium)" 10 | webglShadingLanguageVersion = "WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)" 11 | webglAliasedLineWidthRange = "[1, 10]" 12 | webglAliasedPointSizeRange = "[1, 2047]" 13 | webglAntialiasing = "yes" 14 | webglBits = "8,8,24,8,8,0" 15 | webglMaxParams = "16,64,32768,1024,32768,32,32768,31,16,32,1024" 16 | webglMaxViewportDims = "[32768, 32768]" 17 | webglUnmaskedVendor = "Google Inc. (NVIDIA Corporation)" 18 | webglUnmaskedRenderer = "ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 3060 Ti/PCIe/SSE2, OpenGL 4.5.0)" 19 | webglFsfParams = "23,127,127,10,15,15,10,15,15" 20 | webglFsiParams = "0,31,30,0,31,30,0,31,30" 21 | webglVsfParams = "23,127,127,10,15,15,10,15,15" 22 | webglVsiParams = "0,31,30,0,31,30,0,31,30" 23 | ) 24 | 25 | var ( 26 | webglExtensionsHash = getWebglExtensionsHash() 27 | ) 28 | 29 | func getWebglExtensionsHash() string { 30 | return x64hash128(webglExtensions, 0) 31 | } 32 | 33 | func getWebglHashWebgl() string { 34 | //aZ['webgl_hash' + cr(f_a_gY.X)] = this['x64hash128'](aC(aZ, function(b3) { 35 | // return b3; 36 | //})[cr(f_a_gY.Y)](',')); 37 | 38 | var webglList []string 39 | webglList = append(webglList, webglExtensions) 40 | webglList = append(webglList, webglExtensionsHash) 41 | webglList = append(webglList, webglRenderer) 42 | webglList = append(webglList, webglVendor) 43 | webglList = append(webglList, webglVersion) 44 | webglList = append(webglList, webglShadingLanguageVersion) 45 | webglList = append(webglList, webglAliasedLineWidthRange) 46 | webglList = append(webglList, webglAliasedPointSizeRange) 47 | webglList = append(webglList, webglAntialiasing) 48 | webglList = append(webglList, webglBits) 49 | webglList = append(webglList, webglMaxParams) 50 | webglList = append(webglList, webglMaxViewportDims) 51 | webglList = append(webglList, webglUnmaskedVendor) 52 | webglList = append(webglList, webglUnmaskedRenderer) 53 | webglList = append(webglList, webglFsfParams) 54 | webglList = append(webglList, webglFsiParams) 55 | webglList = append(webglList, webglVsfParams) 56 | webglList = append(webglList, webglVsiParams) 57 | return x64hash128(strings.Join(webglList, ","), 0) 58 | } 59 | -------------------------------------------------------------------------------- /cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | 7 | "github.com/xqdoo00o/funcaptcha" 8 | ) 9 | 10 | func main() { 11 | //token, err := funcaptcha.GetOpenAITokenWithBx(`[{"key":"api_type","value":"js"},{"key":"p","value":1},{"key":"f","value":"cdb0697262ceb9aa4e938ae5d9697efd"},{"key":"n","value":"MTY4OTQ0MjY0Mw=="},{"key":"wh","value":"15fb0b896f4534b3970269c17e188322|5ab5738955e0611421b686bc95655ad0"},{"key":"enhanced_fp","value":[{"key":"webgl_extensions","value":"ANGLE_instanced_arrays;EXT_blend_minmax;EXT_color_buffer_half_float;EXT_float_blend;EXT_frag_depth;EXT_shader_texture_lod;EXT_sRGB;EXT_texture_compression_bptc;EXT_texture_compression_rgtc;EXT_texture_filter_anisotropic;OES_element_index_uint;OES_fbo_render_mipmap;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_color_buffer_float;WEBGL_compressed_texture_etc;WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context"},{"key":"webgl_extensions_hash","value":"ccc5c4979d89351fef1dcc0582cdb3d2"},{"key":"webgl_renderer","value":"NVIDIA GeForce GTX 980/PCIe/SSE2"},{"key":"webgl_vendor","value":"Mozilla"},{"key":"webgl_version","value":"WebGL 1.0"},{"key":"webgl_shading_language_version","value":"WebGL GLSL ES 1.0"},{"key":"webgl_aliased_line_width_range","value":"[1, 10]"},{"key":"webgl_aliased_point_size_range","value":"[1, 2047]"},{"key":"webgl_antialiasing","value":"yes"},{"key":"webgl_bits","value":"8,8,24,8,8,0"},{"key":"webgl_max_params","value":"16,192,32768,1024,32768,32,32768,32,16,32,1024"},{"key":"webgl_max_viewport_dims","value":"[32768, 32768]"},{"key":"webgl_unmasked_vendor","value":"NVIDIA Corporation"},{"key":"webgl_unmasked_renderer","value":"NVIDIA GeForce GTX 980/PCIe/SSE2"},{"key":"webgl_vsf_params","value":"23,127,127,23,127,127,23,127,127"},{"key":"webgl_vsi_params","value":"0,24,24,0,24,24,0,24,24"},{"key":"webgl_fsf_params","value":"23,127,127,23,127,127,23,127,127"},{"key":"webgl_fsi_params","value":"0,24,24,0,24,24,0,24,24"},{"key":"webgl_hash_webgl","value":"5890c452638eafb176df4e27cce6e5a3"},{"key":"user_agent_data_brands","value":null},{"key":"user_agent_data_mobile","value":null},{"key":"navigator_connection_downlink","value":null},{"key":"navigator_connection_downlink_max","value":null},{"key":"network_info_rtt","value":null},{"key":"network_info_save_data","value":null},{"key":"network_info_rtt_type","value":null},{"key":"screen_pixel_depth","value":24},{"key":"navigator_device_memory","value":null},{"key":"navigator_languages","value":"en-US,en"},{"key":"window_inner_width","value":0},{"key":"window_inner_height","value":0},{"key":"window_outer_width","value":631},{"key":"window_outer_height","value":1039},{"key":"browser_detection_firefox","value":true},{"key":"browser_detection_brave","value":false},{"key":"audio_codecs","value":"{\"ogg\":\"probably\",\"mp3\":\"maybe\",\"wav\":\"probably\",\"m4a\":\"maybe\",\"aac\":\"maybe\"}"},{"key":"video_codecs","value":"{\"ogg\":\"probably\",\"h264\":\"probably\",\"webm\":\"probably\",\"mpeg4v\":\"\",\"mpeg4a\":\"\",\"theora\":\"\"}"},{"key":"media_query_dark_mode","value":true},{"key":"headless_browser_phantom","value":false},{"key":"headless_browser_selenium","value":true},{"key":"headless_browser_nightmare_js","value":false},{"key":"document__referrer","value":"http://127.0.0.1:8000/"},{"key":"window__ancestor_origins","value":null},{"key":"window__tree_index","value":[0]},{"key":"window__tree_structure","value":"[[]]"},{"key":"window__location_href","value":"https://tcr9i.chat.openai.com/v2/1.5.2/enforcement.64b3a4e29686f93d52816249ecbf9857.html#35536E1E-65B4-4D96-9D97-6ADB7EFF8147"},{"key":"client_config__sitedata_location_href","value":"http://127.0.0.1:8000/arkose.html"},{"key":"client_config__surl","value":"https://tcr9i.chat.openai.com"},{"key":"mobile_sdk__is_sdk"},{"key":"client_config__language","value":null},{"key":"audio_fingerprint","value":"35.73833402246237"}]},{"key":"fe","value":["DNT:unspecified","L:en-US","D:24","PR:1","S:1920,1080","AS:1920,1080","TO:-480","SS:true","LS:true","IDB:true","B:false","ODB:false","CPUC:unknown","PK:Linux x86_64","CFP:699685943","FR:false","FOS:false","FB:false","JSF:Arial,Courier New,Times New Roman","P:Chrome PDF Viewer,Chromium PDF Viewer,Microsoft Edge PDF Viewer,PDF Viewer,WebKit built-in PDF","T:0,false,false","H:16","SWF:false"]},{"key":"ife_hash","value":"63562827dd8cdcf172844085452eb5f4"},{"key":"cs","value":1},{"key":"jsbd","value":"{\"HL\":1,\"NCE\":true,\"DT\":\"\",\"NWD\":\"true\",\"DOTO\":1,\"DMTO\":1}"}]`, "", "") 12 | //log.Println(token) 13 | // 14 | //if err == nil { 15 | // return 16 | //} 17 | token := "155179050361eafc5.5354759702|r=us-west-2|meta=3|metabgclr=transparent|metaiconclr=%23757575|guitextcolor=%23000000|pk=0A1D34FC-659D-4E23-B17B-694DCFCF6A6C|at=40|ag=101|cdn_url=https%3A%2F%2Ftcr9i.chat.openai.com%2Fcdn%2Ffc|lurl=https%3A%2F%2Faudio-us-west-2.arkoselabs.com|surl=https%3A%2F%2Ftcr9i.chat.openai.com|smurl=https%3A%2F%2Ftcr9i.chat.openai.com%2Fcdn%2Ffc%2Fassets%2Fstyle-manager" 18 | hex := "fbfc14b0d793c6ef8359e0e4b4a91f67" 19 | // Start a challenge 20 | session, err := funcaptcha.StartChallenge(token, hex) 21 | if err != nil { 22 | log.Fatalf("error starting challenge: %v\n", err) 23 | } 24 | log.Println("Challenge started!") 25 | 26 | apiBreaker, err := session.RequestChallenge(false) 27 | if err != nil { 28 | log.Fatalf("error requesting challenge: %v\n", err) 29 | } 30 | log.Println(session.ConciseChallenge) 31 | log.Println("Downloading challenge") 32 | _, err = funcaptcha.DownloadChallenge(session.ConciseChallenge.URLs, false) 33 | if err != nil { 34 | log.Fatalf("error downloading challenge: %v\n", err) 35 | } 36 | log.Println("Challenge downloaded!") 37 | // User input here 38 | fmt.Println("Please enter the index of the image based on the following instructions:") 39 | fmt.Println(session.ConciseChallenge.Instructions) 40 | 41 | ints := make([]int, len(session.ConciseChallenge.URLs)) 42 | fmt.Println("Enter the integers:") 43 | for i := 0; i < len(ints); i++ { 44 | fmt.Scan(&ints[i]) 45 | } 46 | log.Println(ints) 47 | err = session.SubmitAnswer(ints, false, apiBreaker) 48 | if err != nil { 49 | log.Fatalf("error submitting answer: %v\n", err) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /crypt.go: -------------------------------------------------------------------------------- 1 | package funcaptcha 2 | 3 | import ( 4 | "bytes" 5 | "crypto/aes" 6 | "crypto/cipher" 7 | "crypto/md5" 8 | "crypto/rand" 9 | "encoding/base64" 10 | "encoding/hex" 11 | "encoding/json" 12 | "errors" 13 | "hash" 14 | ) 15 | 16 | type encryptionData struct { 17 | Ct string `json:"ct"` 18 | Iv string `json:"iv"` 19 | S string `json:"s"` 20 | } 21 | 22 | func Encrypt(data string, key string) string { 23 | encData, _ := aesEncrypt(data, key) 24 | 25 | encDataJson, err := json.Marshal(encData) 26 | if err != nil { 27 | panic(err) 28 | } 29 | 30 | return string(encDataJson) 31 | } 32 | 33 | func aesEncrypt(content string, password string) (*encryptionData, error) { 34 | salt := make([]byte, 8) 35 | _, err := rand.Read(salt) 36 | if err != nil { 37 | return nil, err 38 | } 39 | key, iv, err := defaultEvpKDF([]byte(password), salt) 40 | 41 | if err != nil { 42 | return nil, err 43 | } 44 | 45 | block, err := aes.NewCipher(key) 46 | if err != nil { 47 | return nil, err 48 | } 49 | 50 | mode := cipher.NewCBCEncrypter(block, iv) 51 | cipherBytes := pKCS5Padding([]byte(content), aes.BlockSize) 52 | mode.CryptBlocks(cipherBytes, cipherBytes) 53 | 54 | //TODO: remove redundant code 55 | md5Hash := md5.New() 56 | salted := "" 57 | var dx []byte 58 | 59 | for i := 0; i < 3; i++ { 60 | md5Hash.Write(dx) 61 | md5Hash.Write([]byte(password)) 62 | md5Hash.Write(salt) 63 | 64 | dx = md5Hash.Sum(nil) 65 | md5Hash.Reset() 66 | 67 | salted += hex.EncodeToString(dx) 68 | } 69 | 70 | cipherText := base64.StdEncoding.EncodeToString(cipherBytes) 71 | encData := &encryptionData{ 72 | Ct: cipherText, 73 | Iv: salted[64 : 64+32], 74 | S: hex.EncodeToString(salt), 75 | } 76 | return encData, nil 77 | } 78 | 79 | // https://stackoverflow.com/questions/27677236/encryption-in-javascript-and-decryption-with-php/27678978#27678978 80 | // https://github.com/brix/crypto-js/blob/8e6d15bf2e26d6ff0af5277df2604ca12b60a718/src/evpkdf.js#L55 81 | func evpKDF(password []byte, salt []byte, keySize int, iterations int, hashAlgorithm string) ([]byte, error) { 82 | var block []byte 83 | var hasher hash.Hash 84 | derivedKeyBytes := make([]byte, 0) 85 | switch hashAlgorithm { 86 | case "md5": 87 | hasher = md5.New() 88 | default: 89 | return []byte{}, errors.New("not implement hasher algorithm") 90 | } 91 | for len(derivedKeyBytes) < keySize*4 { 92 | if len(block) > 0 { 93 | hasher.Write(block) 94 | } 95 | hasher.Write(password) 96 | hasher.Write(salt) 97 | block = hasher.Sum([]byte{}) 98 | hasher.Reset() 99 | 100 | for i := 1; i < iterations; i++ { 101 | hasher.Write(block) 102 | block = hasher.Sum([]byte{}) 103 | hasher.Reset() 104 | } 105 | derivedKeyBytes = append(derivedKeyBytes, block...) 106 | } 107 | return derivedKeyBytes[:keySize*4], nil 108 | } 109 | 110 | func defaultEvpKDF(password []byte, salt []byte) (key []byte, iv []byte, err error) { 111 | // https://github.com/brix/crypto-js/blob/8e6d15bf2e26d6ff0af5277df2604ca12b60a718/src/cipher-core.js#L775 112 | keySize := 256 / 32 113 | ivSize := 128 / 32 114 | derivedKeyBytes, err := evpKDF(password, salt, keySize+ivSize, 1, "md5") 115 | if err != nil { 116 | return []byte{}, []byte{}, err 117 | } 118 | return derivedKeyBytes[:keySize*4], derivedKeyBytes[keySize*4:], nil 119 | } 120 | func pKCS5Padding(src []byte, blockSize int) []byte { 121 | padding := blockSize - len(src)%blockSize 122 | padtext := bytes.Repeat([]byte{byte(padding)}, padding) 123 | return append(src, padtext...) 124 | } 125 | 126 | func Decrypt(data string, password string, fallbackPass string) string { 127 | decDataText, err := AesDecrypt(data, password, fallbackPass) 128 | 129 | if err != nil { 130 | println(err.Error()) 131 | } 132 | 133 | return decDataText 134 | } 135 | 136 | func AesDecrypt(baseText string, password string, fallbackPass string) (string, error) { 137 | encBytes, err := base64.StdEncoding.DecodeString(baseText) 138 | if err != nil { 139 | return "", err 140 | } 141 | var encData encryptionData 142 | err = json.Unmarshal(encBytes, &encData) 143 | if err != nil { 144 | return "", err 145 | } 146 | cipherBytes, err := base64.StdEncoding.DecodeString(encData.Ct) 147 | if err != nil { 148 | return "", err 149 | } 150 | salt, err := hex.DecodeString(encData.S) 151 | if err != nil { 152 | return "", err 153 | } 154 | dstBytes := make([]byte, len(cipherBytes)) 155 | decrypt: 156 | key, _, err := DefaultEvpKDF([]byte(password), salt) 157 | iv, _ := hex.DecodeString(encData.Iv) 158 | if err != nil { 159 | return "", err 160 | } 161 | 162 | block, err := aes.NewCipher(key) 163 | if err != nil { 164 | return "", err 165 | } 166 | 167 | mode := cipher.NewCBCDecrypter(block, iv) 168 | mode.CryptBlocks(dstBytes, cipherBytes) 169 | result := PKCS5UnPadding(dstBytes) 170 | if !json.Valid(result) { 171 | if password == fallbackPass { 172 | return "", errors.New("decryption can't get the correct result") 173 | } else { 174 | password = fallbackPass 175 | goto decrypt 176 | } 177 | } 178 | return string(result), nil 179 | } 180 | 181 | // https://stackoverflow.com/questions/27677236/encryption-in-javascript-and-decryption-with-php/27678978#27678978 182 | // https://github.com/brix/crypto-js/blob/8e6d15bf2e26d6ff0af5277df2604ca12b60a718/src/evpkdf.js#L55 183 | func EvpKDF(password []byte, salt []byte, keySize int, iterations int, hashAlgorithm string) ([]byte, error) { 184 | var block []byte 185 | var hasher hash.Hash 186 | derivedKeyBytes := make([]byte, 0) 187 | switch hashAlgorithm { 188 | case "md5": 189 | hasher = md5.New() 190 | default: 191 | return []byte{}, errors.New("not implement hasher algorithm") 192 | } 193 | for len(derivedKeyBytes) < keySize*4 { 194 | if len(block) > 0 { 195 | hasher.Write(block) 196 | } 197 | hasher.Write(password) 198 | hasher.Write(salt) 199 | block = hasher.Sum([]byte{}) 200 | hasher.Reset() 201 | 202 | for i := 1; i < iterations; i++ { 203 | hasher.Write(block) 204 | block = hasher.Sum([]byte{}) 205 | hasher.Reset() 206 | } 207 | derivedKeyBytes = append(derivedKeyBytes, block...) 208 | } 209 | return derivedKeyBytes[:keySize*4], nil 210 | } 211 | 212 | func DefaultEvpKDF(password []byte, salt []byte) (key []byte, iv []byte, err error) { 213 | // https://github.com/brix/crypto-js/blob/8e6d15bf2e26d6ff0af5277df2604ca12b60a718/src/cipher-core.js#L775 214 | keySize := 256 / 32 215 | ivSize := 128 / 32 216 | derivedKeyBytes, err := EvpKDF(password, salt, keySize+ivSize, 1, "md5") 217 | if err != nil { 218 | return []byte{}, []byte{}, err 219 | } 220 | return derivedKeyBytes[:keySize*4], derivedKeyBytes[keySize*4:], nil 221 | } 222 | 223 | // https://stackoverflow.com/questions/41579325/golang-how-do-i-decrypt-with-des-cbc-and-pkcs7 224 | func PKCS5UnPadding(src []byte) []byte { 225 | length := len(src) 226 | unpadding := int(src[length-1]) 227 | return src[:(length - unpadding)] 228 | } 229 | 230 | func PKCS5Padding(src []byte, blockSize int) []byte { 231 | padding := blockSize - len(src)%blockSize 232 | padtext := bytes.Repeat([]byte{byte(padding)}, padding) 233 | return append(src, padtext...) 234 | } 235 | -------------------------------------------------------------------------------- /api.go: -------------------------------------------------------------------------------- 1 | package funcaptcha 2 | 3 | import ( 4 | "encoding/base64" 5 | "encoding/json" 6 | "errors" 7 | "fmt" 8 | "math/rand" 9 | "net/url" 10 | "os" 11 | "path/filepath" 12 | "regexp" 13 | "strconv" 14 | "strings" 15 | "time" 16 | 17 | http "github.com/bogdanfinn/fhttp" 18 | tls_client "github.com/bogdanfinn/tls-client" 19 | "github.com/bogdanfinn/tls-client/profiles" 20 | "github.com/google/uuid" 21 | ) 22 | 23 | const arkPreURL = "openai.com/fc/gt2/" 24 | 25 | var arkURLIns, _ = url.Parse("https://openai.com") 26 | 27 | var initVer, initHex string 28 | 29 | type arkReq struct { 30 | arkURL string 31 | arkBx string 32 | arkHeader http.Header 33 | arkBody url.Values 34 | arkCookies []*http.Cookie 35 | userAgent string 36 | } 37 | 38 | var ( 39 | jar = tls_client.NewCookieJar() 40 | options = []tls_client.HttpClientOption{ 41 | tls_client.WithTimeoutSeconds(360), 42 | tls_client.WithClientProfile(profiles.Chrome_117), 43 | tls_client.WithRandomTLSExtensionOrder(), 44 | tls_client.WithNotFollowRedirects(), 45 | tls_client.WithCookieJar(jar), 46 | } 47 | client *tls_client.HttpClient 48 | proxy = os.Getenv("http_proxy") 49 | authArks []*arkReq 50 | chatArks []*arkReq 51 | ) 52 | 53 | type kvPair struct { 54 | Name string `json:"name"` 55 | Value string `json:"value"` 56 | } 57 | type cookie struct { 58 | Name string `json:"name"` 59 | Value string `json:"value"` 60 | Expires string `json:"expires"` 61 | } 62 | type postBody struct { 63 | Params []kvPair `json:"params"` 64 | } 65 | type request struct { 66 | URL string `json:"url"` 67 | Headers []kvPair `json:"headers,omitempty"` 68 | PostData postBody `json:"postData,omitempty"` 69 | Cookies []cookie `json:"cookies,omitempty"` 70 | } 71 | type entry struct { 72 | StartedDateTime string `json:"startedDateTime"` 73 | Request request `json:"request"` 74 | } 75 | type logData struct { 76 | Entries []entry `json:"entries"` 77 | } 78 | type HARData struct { 79 | Log logData `json:"log"` 80 | } 81 | 82 | func readHAR() { 83 | // 指定需要读取的文件夹路径 84 | dirPath := "harPool" 85 | var harPath []string 86 | // 打开文件夹并读取其内容 87 | err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { 88 | if err != nil { 89 | return err 90 | } 91 | // 判断是否为普通文件(非文件夹) 92 | if !info.IsDir() { 93 | // 获取文件后缀名 94 | ext := filepath.Ext(info.Name()) 95 | if ext == ".har" { 96 | harPath = append(harPath, path) 97 | } 98 | } 99 | return nil 100 | }) 101 | if err != nil { 102 | println("Error: please put HAR files in harPool directory!") 103 | } 104 | for _, path := range harPath { 105 | file, err := os.ReadFile(path) 106 | if err != nil { 107 | return 108 | } 109 | var harFile HARData 110 | err = json.Unmarshal(file, &harFile) 111 | if err != nil { 112 | println("Error: not a HAR file!") 113 | return 114 | } 115 | for _, v := range harFile.Log.Entries { 116 | if strings.Contains(v.Request.URL, arkPreURL) { 117 | var tmpArk arkReq 118 | tmpArk.arkURL = v.Request.URL 119 | if v.StartedDateTime == "" { 120 | println("Error: no arkose request!") 121 | continue 122 | } 123 | t, _ := time.Parse(time.RFC3339, v.StartedDateTime) 124 | bw := getBw(t.Unix()) 125 | fallbackBw := getBw(t.Unix() - 21600) 126 | tmpArk.arkHeader = make(http.Header) 127 | for _, h := range v.Request.Headers { 128 | // arkHeader except cookie & content-length 129 | if !strings.EqualFold(h.Name, "content-length") && !strings.EqualFold(h.Name, "cookie") && !strings.HasPrefix(h.Name, ":") { 130 | tmpArk.arkHeader.Set(h.Name, h.Value) 131 | if strings.EqualFold(h.Name, "user-agent") { 132 | tmpArk.userAgent = h.Value 133 | } 134 | } 135 | } 136 | tmpArk.arkCookies = []*http.Cookie{} 137 | for _, cookie := range v.Request.Cookies { 138 | expire, _ := time.Parse(time.RFC3339, cookie.Expires) 139 | if expire.After(time.Now()) { 140 | tmpArk.arkCookies = append(tmpArk.arkCookies, &http.Cookie{Name: cookie.Name, Value: cookie.Value, Expires: expire.UTC()}) 141 | } 142 | } 143 | var arkType string 144 | tmpArk.arkBody = make(url.Values) 145 | for _, p := range v.Request.PostData.Params { 146 | // arkBody except bda & rnd 147 | if p.Name == "bda" { 148 | cipher, err := url.QueryUnescape(p.Value) 149 | if err != nil { 150 | panic(err) 151 | } 152 | tmpArk.arkBx = Decrypt(cipher, tmpArk.userAgent+bw, tmpArk.userAgent+fallbackBw) 153 | } else if p.Name != "rnd" { 154 | query, err := url.QueryUnescape(p.Value) 155 | if err != nil { 156 | panic(err) 157 | } 158 | tmpArk.arkBody.Set(p.Name, query) 159 | if p.Name == "public_key" { 160 | if query == "0A1D34FC-659D-4E23-B17B-694DCFCF6A6C" { 161 | arkType = "auth" 162 | authArks = append(authArks, &tmpArk) 163 | } else if query == "35536E1E-65B4-4D96-9D97-6ADB7EFF8147" { 164 | arkType = "chat" 165 | chatArks = append(chatArks, &tmpArk) 166 | } 167 | } 168 | } 169 | } 170 | if tmpArk.arkBx != "" { 171 | println("success read " + arkType + " arkose") 172 | } else { 173 | println("failed to decrypt HAR file") 174 | } 175 | } 176 | } 177 | } 178 | } 179 | 180 | //goland:noinspection GoUnhandledErrorResult 181 | func init() { 182 | initVer = "1.5.4" 183 | initHex = "cd12da708fe6cbe6e068918c38de2ad9" // should be fixed associated with version. 184 | readHAR() 185 | cli, _ := tls_client.NewHttpClient(tls_client.NewNoopLogger(), options...) 186 | client = &cli 187 | if proxy != "" { 188 | (*client).SetProxy(proxy) 189 | } 190 | } 191 | 192 | //goland:noinspection GoUnusedExportedFunction 193 | func SetTLSClient(cli *tls_client.HttpClient) { 194 | client = cli 195 | } 196 | 197 | func GetOpenAIAuthToken(puid string, dx string, proxy string) (string, error) { 198 | token, err := sendRequest(0, "", puid, dx, proxy) 199 | return token, err 200 | } 201 | 202 | func GetOpenAIAuthTokenWithBx(bx string, puid string, dx string, proxy string) (string, error) { 203 | token, err := sendRequest(0, getBdaWitBx(bx), puid, dx, proxy) 204 | return token, err 205 | } 206 | 207 | func GetOpenAIToken(version int, puid string, dx string, proxy string) (string, error) { 208 | token, err := sendRequest(version, "", puid, dx, proxy) 209 | return token, err 210 | } 211 | 212 | func GetOpenAITokenWithBx(version int, bx string, puid string, dx string, proxy string) (string, error) { 213 | token, err := sendRequest(version, getBdaWitBx(bx), puid, dx, proxy) 214 | return token, err 215 | } 216 | 217 | //goland:noinspection SpellCheckingInspection,GoUnhandledErrorResult 218 | func sendRequest(arkType int, unusebda string, puid string, dx string, proxy string) (string, error) { 219 | var tmpArk *arkReq 220 | if arkType == 0 { 221 | if len(authArks) == 0 { 222 | return "", errors.New("a valid HAR file which contains login arkose is required") 223 | } 224 | tmpArk = authArks[0] 225 | authArks = append(authArks[1:], authArks[0]) 226 | } else if arkType == 3 || arkType == 4 { 227 | if len(chatArks) == 0 { 228 | return "", errors.New("a valid HAR file which contains gpt-4 arkose is required") 229 | } 230 | tmpArk = chatArks[0] 231 | chatArks = append(chatArks[1:], chatArks[0]) 232 | } 233 | if tmpArk == nil || tmpArk.arkBx == "" || len(tmpArk.arkBody) == 0 || len(tmpArk.arkHeader) == 0 { 234 | return "", errors.New("a valid HAR file required") 235 | } 236 | if proxy != "" { 237 | (*client).SetProxy(proxy) 238 | } 239 | bda, bw := getBDA(tmpArk) 240 | tmpArk.arkBody.Set("bda", base64.StdEncoding.EncodeToString([]byte(bda))) 241 | tmpArk.arkBody.Set("rnd", strconv.FormatFloat(rand.Float64(), 'f', -1, 64)) 242 | if dx != "" { 243 | tmpArk.arkBody.Set("data[blob]", dx) 244 | } 245 | req, _ := http.NewRequest(http.MethodPost, tmpArk.arkURL, strings.NewReader(tmpArk.arkBody.Encode())) 246 | req.Header = tmpArk.arkHeader.Clone() 247 | req.Header.Set("X-Ark-Esync-Value", bw) 248 | (*client).GetCookieJar().SetCookies(arkURLIns, tmpArk.arkCookies) 249 | if puid != "" { 250 | req.Header.Set("Cookie", "_puid="+puid+";") 251 | } 252 | resp, err := (*client).Do(req) 253 | if err != nil { 254 | return "", err 255 | } 256 | defer resp.Body.Close() 257 | if resp.StatusCode != 200 { 258 | return "", errors.New("status code " + resp.Status) 259 | } 260 | 261 | type arkoseResponse struct { 262 | Token string `json:"token"` 263 | } 264 | var arkose arkoseResponse 265 | err = json.NewDecoder(resp.Body).Decode(&arkose) 266 | if err != nil { 267 | return "", err 268 | } 269 | // Check if rid is empty 270 | if !strings.Contains(arkose.Token, "sup=1|rid=") { 271 | return arkose.Token, errors.New("captcha required") 272 | } 273 | 274 | return arkose.Token, nil 275 | } 276 | 277 | //goland:noinspection SpellCheckingInspection 278 | func getBDA(arkReq *arkReq) (string, string) { 279 | var bx string = arkReq.arkBx 280 | var t = time.Now() 281 | if bx == "" { 282 | bx = fmt.Sprintf(bx_template, 283 | getF(), 284 | getN(t), 285 | getWh(), 286 | webglExtensions, 287 | getWebglExtensionsHash(), 288 | webglRenderer, 289 | webglVendor, 290 | webglVersion, 291 | webglShadingLanguageVersion, 292 | webglAliasedLineWidthRange, 293 | webglAliasedPointSizeRange, 294 | webglAntialiasing, 295 | webglBits, 296 | webglMaxParams, 297 | webglMaxViewportDims, 298 | webglUnmaskedVendor, 299 | webglUnmaskedRenderer, 300 | webglVsfParams, 301 | webglVsiParams, 302 | webglFsfParams, 303 | webglFsiParams, 304 | getWebglHashWebgl(), 305 | initVer, 306 | initHex, 307 | getFe(), 308 | getIfeHash(), 309 | ) 310 | } else { 311 | re := regexp.MustCompile(`"key"\:"n","value"\:"\S*?"`) 312 | bx = re.ReplaceAllString(bx, `"key":"n","value":"`+getN(t)+`"`) 313 | re = regexp.MustCompile(`"key"\:"1l2l5234ar2","value"\:"\S*?"`) 314 | bx = re.ReplaceAllString(bx, `"key":"1l2l5234ar2","value":"`+fmt.Sprintf("%d", t.UnixMilli())+"\u2062\"") 315 | re = regexp.MustCompile(`"key"\:"4b4b269e68","value"\:"(\S*?)"`) 316 | oldUUID := re.FindStringSubmatch(bx) 317 | if len(oldUUID) > 1 { 318 | re = regexp.MustCompile(oldUUID[1]) 319 | newUUID := uuid.NewString() 320 | bx = re.ReplaceAllString(bx, newUUID) 321 | } 322 | } 323 | bw := getBw(t.Unix()) 324 | return Encrypt(bx, arkReq.userAgent+bw), bw 325 | } 326 | 327 | func getBt() int64 { 328 | return time.Now().Unix() 329 | } 330 | 331 | func getBw(bt int64) string { 332 | return strconv.FormatInt(bt-(bt%21600), 10) 333 | } 334 | 335 | func getBdaWitBx(bx string) string { 336 | bt := getBt() 337 | bw := getBw(bt) 338 | return Encrypt(bx, bv+bw) 339 | } 340 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/acheong08/endless v0.0.0-20230615162514-90545c7793fd h1:oIpfrRhD7Jus41dotbK+SQjWSFRnf1cLZUYCZpF/o/4= 2 | github.com/acheong08/endless v0.0.0-20230615162514-90545c7793fd/go.mod h1:0yO7neMeJLvKk/B/fq5votDY8rByrOPDubpvU+6saKo= 3 | github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= 4 | github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= 5 | github.com/bogdanfinn/fhttp v0.5.28 h1:G6thT8s8v6z1IuvXMUsX9QKy3ZHseTQTzxuIhSiaaAw= 6 | github.com/bogdanfinn/fhttp v0.5.28/go.mod h1:oJiYPG3jQTKzk/VFmogH8jxjH5yiv2rrOH48Xso2lrE= 7 | github.com/bogdanfinn/tls-client v1.7.5 h1:R1aTwe5oja5niLnQggzbWnzJEssw9n+3O4kR0H/Tjl4= 8 | github.com/bogdanfinn/tls-client v1.7.5/go.mod h1:pQwF0eqfL0gf0mu8hikvu6deZ3ijSPruJDzEKEnnXjU= 9 | github.com/bogdanfinn/utls v1.6.1 h1:dKDYAcXEyFFJ3GaWaN89DEyjyRraD1qb4osdEK89ass= 10 | github.com/bogdanfinn/utls v1.6.1/go.mod h1:VXIbRZaiY/wHZc6Hu+DZ4O2CgTzjhjCg/Ou3V4r/39Y= 11 | github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= 12 | github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= 13 | github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= 14 | github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= 15 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= 16 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= 17 | github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= 18 | github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= 19 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 20 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 21 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 22 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 23 | github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= 24 | github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= 25 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 26 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 27 | github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= 28 | github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= 29 | github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= 30 | github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 31 | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= 32 | github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= 33 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 34 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= 35 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 36 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= 37 | github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= 38 | github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= 39 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= 40 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= 41 | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= 42 | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 43 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 44 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 45 | github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= 46 | github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 47 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 48 | github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= 49 | github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 50 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 51 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 52 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 53 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 54 | github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= 55 | github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= 56 | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 57 | github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= 58 | github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= 59 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 60 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 61 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 62 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 63 | github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= 64 | github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= 65 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 66 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 67 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 68 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 69 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 70 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= 71 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 72 | github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= 73 | github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= 74 | github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= 75 | github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= 76 | github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= 77 | github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= 78 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 79 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 80 | github.com/quic-go/quic-go v0.43.1 h1:fLiMNfQVe9q2JvSsiXo4fXOEguXHGGl9+6gLp4RPeZQ= 81 | github.com/quic-go/quic-go v0.43.1/go.mod h1:132kz4kL3F9vxhW3CtQJLDVwcFe5wdWeJXXijhsO57M= 82 | github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= 83 | github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= 84 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 85 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 86 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 87 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 88 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 89 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 90 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 91 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 92 | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 93 | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= 94 | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 95 | github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5 h1:YqAladjX7xpA6BM04leXMWAEjS0mTZ5kUU9KRBriQJc= 96 | github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5/go.mod h1:2JjD2zLQYH5HO74y5+aE3remJQvl6q4Sn6aWA2wD1Ng= 97 | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= 98 | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 99 | github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= 100 | github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= 101 | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 102 | golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= 103 | golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 104 | golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= 105 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 106 | golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= 107 | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 108 | golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 109 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 110 | golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= 111 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 112 | golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= 113 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 114 | golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= 115 | golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= 116 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 117 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 118 | google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= 119 | google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 120 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 121 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= 122 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 123 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 124 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 125 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 126 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 127 | -------------------------------------------------------------------------------- /challenge.go: -------------------------------------------------------------------------------- 1 | package funcaptcha 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | "fmt" 7 | "io" 8 | "log" 9 | "math/rand" 10 | "strconv" 11 | "strings" 12 | "time" 13 | 14 | http "github.com/bogdanfinn/fhttp" 15 | tls_client "github.com/bogdanfinn/tls-client" 16 | ) 17 | 18 | type Session struct { 19 | Sid string `json:"sid"` 20 | SessionToken string `json:"session_token"` 21 | Hex string `json:"hex"` 22 | ChallengeLogger challengeLogger `json:"challenge_logger"` 23 | Challenge Challenge `json:"challenge"` 24 | ConciseChallenge ConciseChallenge `json:"concise_challenge"` 25 | Headers http.Header `json:"headers"` 26 | } 27 | 28 | type ConciseChallenge struct { 29 | GameType string `json:"game_type"` 30 | URLs []string `json:"urls"` 31 | Instructions string `json:"instructions"` 32 | } 33 | type Input struct { 34 | Index int 35 | } 36 | type ValueFunc func(Input) Input 37 | type KeyFunc func(Input) interface{} 38 | 39 | var Yz = map[int]struct { 40 | Value map[string]ValueFunc 41 | Key map[string]KeyFunc 42 | }{ 43 | 4: { 44 | Value: map[string]ValueFunc{ 45 | "alpha": func(c Input) Input { 46 | yValueStr := strconv.Itoa(c.Index) // 转换为字符串 47 | combinedStr := yValueStr + strconv.Itoa(1) // 加1 48 | combinedInt, _ := strconv.Atoi(combinedStr) // 将合并后的字符串转回为整数 49 | return Input{Index: combinedInt - 2} 50 | }, 51 | "beta": func(c Input) Input { return Input{Index: -c.Index} }, 52 | "gamma": func(c Input) Input { return Input{Index: 3 * (3 - c.Index)} }, 53 | "delta": func(c Input) Input { return Input{Index: 7 * c.Index} }, 54 | "epsilon": func(c Input) Input { return Input{Index: 2 * c.Index} }, 55 | "zeta": func(c Input) Input { 56 | if c.Index != 0 { 57 | return Input{Index: 100 / c.Index} 58 | } 59 | return Input{Index: c.Index} 60 | }, 61 | }, 62 | Key: map[string]KeyFunc{ 63 | "alpha": func(c Input) interface{} { 64 | return []int{rand.Intn(100), c.Index, rand.Intn(100)} 65 | }, 66 | "beta": func(c Input) interface{} { 67 | return map[string]int{ 68 | "size": 50 - c.Index, 69 | "id": c.Index, 70 | "limit": 10 * c.Index, 71 | "req_timestamp": int(time.Now().UnixNano() / int64(time.Millisecond)), 72 | } 73 | }, 74 | "gamma": func(c Input) interface{} { 75 | return c.Index 76 | }, 77 | "delta": func(c Input) interface{} { 78 | return map[string]int{"index": c.Index} 79 | }, 80 | "epsilon": func(c Input) interface{} { 81 | arr := make([]int, rand.Intn(5)+1) 82 | randIndex := rand.Intn(len(arr)) 83 | for i := range arr { 84 | if i == randIndex { 85 | arr[i] = c.Index 86 | } else { 87 | arr[i] = rand.Intn(10) 88 | } 89 | } 90 | return append(arr, randIndex) 91 | }, 92 | "zeta": func(c Input) interface{} { 93 | return append(make([]int, rand.Intn(5)+1), c.Index) 94 | }, 95 | }, 96 | }, 97 | } 98 | 99 | func YB(gameType int, apiBreaker *ApiBreaker) func(Input) interface{} { 100 | return func(input Input) interface{} { 101 | for _, valueFuncName := range apiBreaker.Value { 102 | input = Yz[gameType].Value[valueFuncName](input) 103 | } 104 | return Yz[gameType].Key[apiBreaker.Key](input) 105 | } 106 | } 107 | 108 | type Challenge struct { 109 | SessionToken string `json:"session_token"` 110 | ChallengeID string `json:"challengeID"` 111 | ChallengeURL string `json:"challengeURL"` 112 | AudioChallengeURLs []string `json:"audio_challenge_urls"` 113 | AudioGameRateLimited interface{} `json:"audio_game_rate_limited"` 114 | Sec int `json:"sec"` 115 | EndURL interface{} `json:"end_url"` 116 | GameData struct { 117 | GameType int `json:"gameType"` 118 | GameVariant string `json:"game_variant"` 119 | InstructionString string `json:"instruction_string"` 120 | CustomGUI struct { 121 | ChallengeIMGs []string `json:"_challenge_imgs"` 122 | ApiBreaker *ApiBreaker `json:"api_breaker"` 123 | ApiBreakerV2Enabled int `json:"api_breaker_v2_enabled"` 124 | } `json:"customGUI"` 125 | } `json:"game_data"` 126 | GameSID string `json:"game_sid"` 127 | SID string `json:"sid"` 128 | Lang string `json:"lang"` 129 | StringTablePrefixes []interface{} `json:"string_table_prefixes"` 130 | StringTable map[string]string `json:"string_table"` 131 | EarlyVictoryMessage interface{} `json:"earlyVictoryMessage"` 132 | FontSizeAdjustments interface{} `json:"font_size_adjustments"` 133 | StyleTheme string `json:"style_theme"` 134 | } 135 | 136 | type challengeLogger struct { 137 | Sid string `json:"sid"` 138 | SessionToken string `json:"session_token"` 139 | AnalyticsTier int `json:"analytics_tier"` 140 | RenderType string `json:"render_type"` 141 | Category string `json:"category"` 142 | Action string `json:"action"` 143 | // Omit if empty 144 | GameToken string `json:"game_token,omitempty"` 145 | GameType string `json:"game_type,omitempty"` 146 | } 147 | 148 | type requestChallenge struct { 149 | Sid string `json:"sid"` 150 | Token string `json:"token"` 151 | AnalyticsTier int `json:"analytics_tier"` 152 | RenderType string `json:"render_type"` 153 | Lang string `json:"lang"` 154 | IsAudioGame bool `json:"isAudioGame"` 155 | APIBreakerVersion string `json:"apiBreakerVersion"` 156 | } 157 | 158 | type submitChallenge struct { 159 | SessionToken string `json:"session_token"` 160 | Sid string `json:"sid"` 161 | GameToken string `json:"game_token"` 162 | Guess string `json:"guess"` 163 | RenderType string `json:"render_type"` 164 | AnalyticsTier int `json:"analytics_tier"` 165 | Bio string `json:"bio"` 166 | } 167 | 168 | type ApiBreaker struct { 169 | Key string `json:"key"` 170 | Value []string `json:"value"` 171 | } 172 | 173 | func StartChallenge(full_session, hex string) (*Session, error) { 174 | fields := strings.Split(full_session, "|") 175 | session_token := fields[0] 176 | sid := strings.Split(fields[1], "=")[1] 177 | 178 | session := Session{ 179 | Sid: sid, 180 | SessionToken: session_token, 181 | Hex: hex, 182 | } 183 | session.Headers = headers 184 | session.Headers.Set("Referer", fmt.Sprintf("https://client-api.arkoselabs.com/fc/assets/ec-game-core/game-core/1.15.0/standard/index.html?session=%s", strings.Replace(full_session, "|", "&", -1))) 185 | session.ChallengeLogger = challengeLogger{ 186 | Sid: sid, 187 | SessionToken: session_token, 188 | AnalyticsTier: 40, 189 | RenderType: "canvas", 190 | } 191 | err := session.log("", 0, "Site URL", fmt.Sprintf("https://client-api.arkoselabs.com/v2/1.5.5/enforcement.%s.html", hex)) 192 | return &session, err 193 | } 194 | 195 | func (c *Session) RequestChallenge(isAudioGame bool) (*ApiBreaker, error) { 196 | challenge_request := requestChallenge{ 197 | Sid: c.Sid, 198 | Token: c.SessionToken, 199 | AnalyticsTier: 40, 200 | RenderType: "canvas", 201 | Lang: "en-us", 202 | IsAudioGame: isAudioGame, 203 | APIBreakerVersion: "green", 204 | } 205 | payload := jsonToForm(toJSON(challenge_request)) 206 | 207 | req, _ := http.NewRequest(http.MethodPost, "https://client-api.arkoselabs.com/fc/gfct/", strings.NewReader(payload)) 208 | req.Header = c.Headers 209 | req.Header.Set("X-NewRelic-Timestamp", getTimeStamp()) 210 | resp, err := (*client).Do(req) 211 | if err != nil { 212 | return nil, err 213 | } 214 | defer resp.Body.Close() 215 | 216 | if resp.StatusCode != 200 { 217 | return nil, fmt.Errorf("status code %d", resp.StatusCode) 218 | } 219 | 220 | body, _ := io.ReadAll(resp.Body) 221 | var challenge_data Challenge 222 | err = json.Unmarshal(body, &challenge_data) 223 | if err != nil { 224 | return nil, err 225 | } 226 | err = c.log(challenge_data.ChallengeID, challenge_data.GameData.GameType, "loaded", "game loaded") 227 | c.Challenge = challenge_data 228 | // Build concise challenge 229 | var challenge_type string 230 | var challenge_urls []string 231 | var key string 232 | var apiBreaker *ApiBreaker 233 | switch challenge_data.GameData.GameType { 234 | case 4: 235 | challenge_type = "image" 236 | challenge_urls = challenge_data.GameData.CustomGUI.ChallengeIMGs 237 | instruction_string := challenge_data.GameData.InstructionString 238 | key = fmt.Sprintf("4.instructions-%s", instruction_string) 239 | if challenge_data.GameData.CustomGUI.ApiBreakerV2Enabled == 1 { 240 | apiBreaker = challenge_data.GameData.CustomGUI.ApiBreaker 241 | } 242 | case 101: 243 | challenge_type = "audio" 244 | challenge_urls = challenge_data.AudioChallengeURLs 245 | instruction_string := challenge_data.GameData.GameVariant 246 | key = fmt.Sprintf("audio_game.instructions-%s", instruction_string) 247 | 248 | default: 249 | challenge_type = "unknown" 250 | challenge_urls = []string{} 251 | } 252 | 253 | c.ConciseChallenge = ConciseChallenge{ 254 | GameType: challenge_type, 255 | URLs: challenge_urls, 256 | Instructions: strings.ReplaceAll(strings.ReplaceAll(challenge_data.StringTable[key], "", ""), "", ""), 257 | } 258 | return apiBreaker, err 259 | } 260 | 261 | func (c *Session) SubmitAnswer(indices []int, isAudio bool, apiBreaker *ApiBreaker) error { 262 | submission := submitChallenge{ 263 | SessionToken: c.SessionToken, 264 | Sid: c.Sid, 265 | GameToken: c.Challenge.ChallengeID, 266 | RenderType: "canvas", 267 | AnalyticsTier: 40, 268 | Bio: "eyJtYmlvIjoiMTUwLDAsMTE3LDIzOTszMDAsMCwxMjEsMjIxOzMxNywwLDEyNCwyMTY7NTUwLDAsMTI5LDIxMDs1NjcsMCwxMzQsMjA3OzYxNywwLDE0NCwyMDU7NjUwLDAsMTU1LDIwNTs2NjcsMCwxNjUsMjA1OzY4NCwwLDE3MywyMDc7NzAwLDAsMTc4LDIxMjs4MzQsMCwyMjEsMjI4OzI2MDY3LDAsMTkzLDM1MTsyNjEwMSwwLDE4NSwzNTM7MjYxMDEsMCwxODAsMzU3OzI2MTM0LDAsMTcyLDM2MTsyNjE4NCwwLDE2NywzNjM7MjYyMTcsMCwxNjEsMzY1OzI2MzM0LDAsMTU2LDM2NDsyNjM1MSwwLDE1MiwzNTQ7MjYzNjcsMCwxNTIsMzQzOzI2Mzg0LDAsMTUyLDMzMTsyNjQ2NywwLDE1MSwzMjU7MjY0NjcsMCwxNTEsMzE3OzI2NTAxLDAsMTQ5LDMxMTsyNjY4NCwxLDE0NywzMDc7MjY3NTEsMiwxNDcsMzA3OzMwNDUxLDAsMzcsNDM3OzMwNDY4LDAsNTcsNDI0OzMwNDg0LDAsNjYsNDE0OzMwNTAxLDAsODgsMzkwOzMwNTAxLDAsMTA0LDM2OTszMDUxOCwwLDEyMSwzNDk7MzA1MzQsMCwxNDEsMzI0OzMwNTUxLDAsMTQ5LDMxNDszMDU4NCwwLDE1MywzMDQ7MzA2MTgsMCwxNTUsMjk2OzMwNzUxLDAsMTU5LDI4OTszMDc2OCwwLDE2NywyODA7MzA3ODQsMCwxNzcsMjc0OzMwODE4LDAsMTgzLDI3MDszMDg1MSwwLDE5MSwyNzA7MzA4ODQsMCwyMDEsMjY4OzMwOTE4LDAsMjA4LDI2ODszMTIzNCwwLDIwNCwyNjM7MzEyNTEsMCwyMDAsMjU3OzMxMzg0LDAsMTk1LDI1MTszMTQxOCwwLDE4OSwyNDk7MzE1NTEsMSwxODksMjQ5OzMxNjM0LDIsMTg5LDI0OTszMTcxOCwxLDE4OSwyNDk7MzE3ODQsMiwxODksMjQ5OzMxODg0LDEsMTg5LDI0OTszMTk2OCwyLDE4OSwyNDk7MzIyODQsMCwyMDIsMjQ5OzMyMzE4LDAsMjE2LDI0NzszMjMxOCwwLDIzNCwyNDU7MzIzMzQsMCwyNjksMjQ1OzMyMzUxLDAsMzAwLDI0NTszMjM2OCwwLDMzOSwyNDE7MzIzODQsMCwzODgsMjM5OzMyNjE4LDAsMzkwLDI0NzszMjYzNCwwLDM3NCwyNTM7MzI2NTEsMCwzNjUsMjU1OzMyNjY4LDAsMzUzLDI1NzszMjk1MSwxLDM0OCwyNTc7MzMwMDEsMiwzNDgsMjU3OzMzNTY4LDAsMzI4LDI3MjszMzU4NCwwLDMxOSwyNzg7MzM2MDEsMCwzMDcsMjg2OzMzNjUxLDAsMjk1LDI5NjszMzY1MSwwLDI5MSwzMDA7MzM2ODQsMCwyODEsMzA5OzMzNjg0LDAsMjcyLDMxNTszMzcxOCwwLDI2NiwzMTc7MzM3MzQsMCwyNTgsMzIzOzMzNzUxLDAsMjUyLDMyNzszMzc1MSwwLDI0NiwzMzM7MzM3NjgsMCwyNDAsMzM3OzMzNzg0LDAsMjM2LDM0MTszMzgxOCwwLDIyNywzNDc7MzM4MzQsMCwyMjEsMzUzOzM0MDUxLDAsMjE2LDM1NDszNDA2OCwwLDIxMCwzNDg7MzQwODQsMCwyMDQsMzQ0OzM0MTAxLDAsMTk4LDM0MDszNDEzNCwwLDE5NCwzMzY7MzQ1ODQsMSwxOTIsMzM0OzM0NjUxLDIsMTkyLDMzNDsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", 269 | } 270 | var answerIndex []string 271 | if isAudio { 272 | for _, answer := range indices { 273 | answerIndex = append(answerIndex, strconv.Itoa(answer)) 274 | } 275 | } else { 276 | for _, answer := range indices { 277 | input := Input{Index: answer} 278 | encoder := YB(4, apiBreaker) 279 | result := encoder(input) 280 | marshal, _ := json.Marshal(result) 281 | answerIndex = append(answerIndex, string(marshal)) 282 | } 283 | } 284 | answer := "[" + strings.Join(answerIndex, ",") + "]" 285 | submission.Guess = Encrypt(answer, c.SessionToken) 286 | payload := jsonToForm(toJSON(submission)) 287 | req, _ := http.NewRequest(http.MethodPost, "https://client-api.arkoselabs.com/fc/ca/", strings.NewReader(payload)) 288 | req.Header = c.Headers 289 | req.Header.Set("X-Requested-ID", getRequestId(c.SessionToken)) 290 | req.Header.Set("X-NewRelic-Timestamp", getTimeStamp()) 291 | 292 | resp, err := (*client).Do(req) 293 | if err != nil { 294 | return err 295 | } 296 | defer resp.Body.Close() 297 | body, _ := io.ReadAll(resp.Body) 298 | var response struct { 299 | Error string `json:"error"` 300 | Response string `json:"response"` 301 | Solved bool `json:"solved"` 302 | IncorrectGuess string `json:"incorrect_guess"` 303 | Score int `json:"score"` 304 | } 305 | log.Println(string(body)) 306 | err = json.Unmarshal(body, &response) 307 | if err != nil { 308 | return err 309 | } 310 | if response.Error != "" { 311 | return errors.New(response.Error) 312 | } 313 | if !response.Solved { 314 | return fmt.Errorf("incorrect guess: %s", response.IncorrectGuess) 315 | } 316 | // Set new client 317 | cli, _ := tls_client.NewHttpClient(tls_client.NewNoopLogger(), options...) 318 | client = &cli 319 | if proxy != "" { 320 | (*client).SetProxy(proxy) 321 | } 322 | return nil 323 | } 324 | 325 | func (c *Session) log(game_token string, game_type int, category, action string) error { 326 | v := c.ChallengeLogger 327 | v.GameToken = game_token 328 | if game_type != 0 { 329 | v.GameType = fmt.Sprintf("%d", game_type) 330 | } 331 | v.Category = category 332 | v.Action = action 333 | 334 | request, _ := http.NewRequest(http.MethodPost, "https://client-api.arkoselabs.com/fc/a/", strings.NewReader(jsonToForm(toJSON(v)))) 335 | request.Header = headers 336 | resp, err := (*client).Do(request) 337 | if err != nil { 338 | return err 339 | } 340 | defer resp.Body.Close() 341 | 342 | if resp.StatusCode != 200 { 343 | return fmt.Errorf("status code %d", resp.StatusCode) 344 | } 345 | return nil 346 | } 347 | -------------------------------------------------------------------------------- /hashing.go: -------------------------------------------------------------------------------- 1 | // https://github.com/fingerprintjs/fingerprintjs/blob/master/src/utils/hashing.ts 2 | 3 | package funcaptcha 4 | 5 | import ( 6 | "fmt" 7 | "sort" 8 | "strings" 9 | ) 10 | 11 | //goland:noinspection SpellCheckingInspection 12 | func getWindowHash() string { // return aA(b1[df(f_a_hT.e)]()[df(f_a_hT.f)]('|'), 0x1a4); 13 | // Object.getOwnPropertyNames(window); 14 | b1 := []string{ 15 | "ALFCCJS", 16 | "AbortController", 17 | "AbortSignal", 18 | "AbsoluteOrientationSensor", 19 | "AbstractRange", 20 | "Accelerometer", 21 | "AggregateError", 22 | "AnalyserNode", 23 | "Animation", 24 | "AnimationEffect", 25 | "AnimationEvent", 26 | "AnimationPlaybackEvent", 27 | "AnimationTimeline", 28 | "ArkoseEnforcement", 29 | "Array", 30 | "ArrayBuffer", 31 | "Atomics", 32 | "Attr", 33 | "Audio", 34 | "AudioBuffer", 35 | "AudioBufferSourceNode", 36 | "AudioContext", 37 | "AudioData", 38 | "AudioDecoder", 39 | "AudioDestinationNode", 40 | "AudioEncoder", 41 | "AudioListener", 42 | "AudioNode", 43 | "AudioParam", 44 | "AudioParamMap", 45 | "AudioProcessingEvent", 46 | "AudioScheduledSourceNode", 47 | "AudioSinkInfo", 48 | "AudioWorklet", 49 | "AudioWorkletNode", 50 | "AuthenticatorAssertionResponse", 51 | "AuthenticatorAttestationResponse", 52 | "AuthenticatorResponse", 53 | "BackgroundFetchManager", 54 | "BackgroundFetchRecord", 55 | "BackgroundFetchRegistration", 56 | "BarProp", 57 | "BaseAudioContext", 58 | "BatteryManager", 59 | "BeforeInstallPromptEvent", 60 | "BeforeUnloadEvent", 61 | "BigInt", 62 | "BigInt64Array", 63 | "BigUint64Array", 64 | "BiquadFilterNode", 65 | "Blob", 66 | "BlobEvent", 67 | "Boolean", 68 | "BroadcastChannel", 69 | "BrowserCaptureMediaStreamTrack", 70 | "ByteLengthQueuingStrategy", 71 | "CDATASection", 72 | "CSS", 73 | "CSSAnimation", 74 | "CSSConditionRule", 75 | "CSSContainerRule", 76 | "CSSCounterStyleRule", 77 | "CSSFontFaceRule", 78 | "CSSFontPaletteValuesRule", 79 | "CSSGroupingRule", 80 | "CSSImageValue", 81 | "CSSImportRule", 82 | "CSSKeyframeRule", 83 | "CSSKeyframesRule", 84 | "CSSKeywordValue", 85 | "CSSLayerBlockRule", 86 | "CSSLayerStatementRule", 87 | "CSSMathClamp", 88 | "CSSMathInvert", 89 | "CSSMathMax", 90 | "CSSMathMin", 91 | "CSSMathNegate", 92 | "CSSMathProduct", 93 | "CSSMathSum", 94 | "CSSMathValue", 95 | "CSSMatrixComponent", 96 | "CSSMediaRule", 97 | "CSSNamespaceRule", 98 | "CSSNumericArray", 99 | "CSSNumericValue", 100 | "CSSPageRule", 101 | "CSSPerspective", 102 | "CSSPositionValue", 103 | "CSSPropertyRule", 104 | "CSSRotate", 105 | "CSSRule", 106 | "CSSRuleList", 107 | "CSSScale", 108 | "CSSSkew", 109 | "CSSSkewX", 110 | "CSSSkewY", 111 | "CSSStyleDeclaration", 112 | "CSSStyleRule", 113 | "CSSStyleSheet", 114 | "CSSStyleValue", 115 | "CSSSupportsRule", 116 | "CSSTransformComponent", 117 | "CSSTransformValue", 118 | "CSSTransition", 119 | "CSSTranslate", 120 | "CSSUnitValue", 121 | "CSSUnparsedValue", 122 | "CSSVariableReferenceValue", 123 | "Cache", 124 | "CacheStorage", 125 | "CanvasCaptureMediaStreamTrack", 126 | "CanvasGradient", 127 | "CanvasPattern", 128 | "CanvasRenderingContext2D", 129 | "CaptureController", 130 | "ChannelMergerNode", 131 | "ChannelSplitterNode", 132 | "CharacterData", 133 | "Clipboard", 134 | "ClipboardEvent", 135 | "ClipboardItem", 136 | "CloseEvent", 137 | "Comment", 138 | "CompositionEvent", 139 | "CompressionStream", 140 | "ConstantSourceNode", 141 | "ContentVisibilityAutoStateChangeEvent", 142 | "ConvolverNode", 143 | "CookieChangeEvent", 144 | "CookieStore", 145 | "CookieStoreManager", 146 | "CountQueuingStrategy", 147 | "Credential", 148 | "CredentialsContainer", 149 | "CropTarget", 150 | "Crypto", 151 | "CryptoKey", 152 | "CustomElementRegistry", 153 | "CustomEvent", 154 | "CustomStateSet", 155 | "DOMError", 156 | "DOMException", 157 | "DOMImplementation", 158 | "DOMMatrix", 159 | "DOMMatrixReadOnly", 160 | "DOMParser", 161 | "DOMPoint", 162 | "DOMPointReadOnly", 163 | "DOMQuad", 164 | "DOMRect", 165 | "DOMRectList", 166 | "DOMRectReadOnly", 167 | "DOMStringList", 168 | "DOMStringMap", 169 | "DOMTokenList", 170 | "DataTransfer", 171 | "DataTransferItem", 172 | "DataTransferItemList", 173 | "DataView", 174 | "Date", 175 | "DecompressionStream", 176 | "DelayNode", 177 | "DelegatedInkTrailPresenter", 178 | "DeviceMotionEvent", 179 | "DeviceMotionEventAcceleration", 180 | "DeviceMotionEventRotationRate", 181 | "DeviceOrientationEvent", 182 | "Document", 183 | "DocumentFragment", 184 | "DocumentTimeline", 185 | "DocumentType", 186 | "DragEvent", 187 | "DynamicsCompressorNode", 188 | "Element", 189 | "ElementInternals", 190 | "EncodedAudioChunk", 191 | "EncodedVideoChunk", 192 | "Error", 193 | "ErrorEvent", 194 | "EvalError", 195 | "Event", 196 | "EventCounts", 197 | "EventSource", 198 | "EventTarget", 199 | "External", 200 | "EyeDropper", 201 | "FeaturePolicy", 202 | "FederatedCredential", 203 | "File", 204 | "FileList", 205 | "FileReader", 206 | "FileSystemDirectoryHandle", 207 | "FileSystemFileHandle", 208 | "FileSystemHandle", 209 | "FileSystemWritableFileStream", 210 | "FinalizationRegistry", 211 | "Float32Array", 212 | "Float64Array", 213 | "FocusEvent", 214 | "FontData", 215 | "FontFace", 216 | "FontFaceSetLoadEvent", 217 | "FormData", 218 | "FormDataEvent", 219 | "FragmentDirective", 220 | "FunCaptcha", 221 | "Function", 222 | "GPU", 223 | "GPUAdapter", 224 | "GPUAdapterInfo", 225 | "GPUBindGroup", 226 | "GPUBindGroupLayout", 227 | "GPUBuffer", 228 | "GPUBufferUsage", 229 | "GPUCanvasContext", 230 | "GPUColorWrite", 231 | "GPUCommandBuffer", 232 | "GPUCommandEncoder", 233 | "GPUCompilationInfo", 234 | "GPUCompilationMessage", 235 | "GPUComputePassEncoder", 236 | "GPUComputePipeline", 237 | "GPUDevice", 238 | "GPUDeviceLostInfo", 239 | "GPUError", 240 | "GPUExternalTexture", 241 | "GPUInternalError", 242 | "GPUMapMode", 243 | "GPUOutOfMemoryError", 244 | "GPUPipelineError", 245 | "GPUPipelineLayout", 246 | "GPUQuerySet", 247 | "GPUQueue", 248 | "GPURenderBundle", 249 | "GPURenderBundleEncoder", 250 | "GPURenderPassEncoder", 251 | "GPURenderPipeline", 252 | "GPUSampler", 253 | "GPUShaderModule", 254 | "GPUShaderStage", 255 | "GPUSupportedFeatures", 256 | "GPUSupportedLimits", 257 | "GPUTexture", 258 | "GPUTextureUsage", 259 | "GPUTextureView", 260 | "GPUUncapturedErrorEvent", 261 | "GPUValidationError", 262 | "GainNode", 263 | "Gamepad", 264 | "GamepadButton", 265 | "GamepadEvent", 266 | "GamepadHapticActuator", 267 | "Geolocation", 268 | "GeolocationCoordinates", 269 | "GeolocationPosition", 270 | "GeolocationPositionError", 271 | "GravitySensor", 272 | "Gyroscope", 273 | "HID", 274 | "HIDConnectionEvent", 275 | "HIDDevice", 276 | "HIDInputReportEvent", 277 | "HTMLAllCollection", 278 | "HTMLAnchorElement", 279 | "HTMLAreaElement", 280 | "HTMLAudioElement", 281 | "HTMLBRElement", 282 | "HTMLBaseElement", 283 | "HTMLBodyElement", 284 | "HTMLButtonElement", 285 | "HTMLCanvasElement", 286 | "HTMLCollection", 287 | "HTMLDListElement", 288 | "HTMLDataElement", 289 | "HTMLDataListElement", 290 | "HTMLDetailsElement", 291 | "HTMLDialogElement", 292 | "HTMLDirectoryElement", 293 | "HTMLDivElement", 294 | "HTMLDocument", 295 | "HTMLElement", 296 | "HTMLEmbedElement", 297 | "HTMLFieldSetElement", 298 | "HTMLFontElement", 299 | "HTMLFormControlsCollection", 300 | "HTMLFormElement", 301 | "HTMLFrameElement", 302 | "HTMLFrameSetElement", 303 | "HTMLHRElement", 304 | "HTMLHeadElement", 305 | "HTMLHeadingElement", 306 | "HTMLHtmlElement", 307 | "HTMLIFrameElement", 308 | "HTMLImageElement", 309 | "HTMLInputElement", 310 | "HTMLLIElement", 311 | "HTMLLabelElement", 312 | "HTMLLegendElement", 313 | "HTMLLinkElement", 314 | "HTMLMapElement", 315 | "HTMLMarqueeElement", 316 | "HTMLMediaElement", 317 | "HTMLMenuElement", 318 | "HTMLMetaElement", 319 | "HTMLMeterElement", 320 | "HTMLModElement", 321 | "HTMLOListElement", 322 | "HTMLObjectElement", 323 | "HTMLOptGroupElement", 324 | "HTMLOptionElement", 325 | "HTMLOptionsCollection", 326 | "HTMLOutputElement", 327 | "HTMLParagraphElement", 328 | "HTMLParamElement", 329 | "HTMLPictureElement", 330 | "HTMLPreElement", 331 | "HTMLProgressElement", 332 | "HTMLQuoteElement", 333 | "HTMLScriptElement", 334 | "HTMLSelectElement", 335 | "HTMLSlotElement", 336 | "HTMLSourceElement", 337 | "HTMLSpanElement", 338 | "HTMLStyleElement", 339 | "HTMLTableCaptionElement", 340 | "HTMLTableCellElement", 341 | "HTMLTableColElement", 342 | "HTMLTableElement", 343 | "HTMLTableRowElement", 344 | "HTMLTableSectionElement", 345 | "HTMLTemplateElement", 346 | "HTMLTextAreaElement", 347 | "HTMLTimeElement", 348 | "HTMLTitleElement", 349 | "HTMLTrackElement", 350 | "HTMLUListElement", 351 | "HTMLUnknownElement", 352 | "HTMLVideoElement", 353 | "HashChangeEvent", 354 | "Headers", 355 | "Highlight", 356 | "HighlightRegistry", 357 | "History", 358 | "IDBCursor", 359 | "IDBCursorWithValue", 360 | "IDBDatabase", 361 | "IDBFactory", 362 | "IDBIndex", 363 | "IDBKeyRange", 364 | "IDBObjectStore", 365 | "IDBOpenDBRequest", 366 | "IDBRequest", 367 | "IDBTransaction", 368 | "IDBVersionChangeEvent", 369 | "IIRFilterNode", 370 | "IdentityCredential", 371 | "IdleDeadline", 372 | "IdleDetector", 373 | "Image", 374 | "ImageBitmap", 375 | "ImageBitmapRenderingContext", 376 | "ImageCapture", 377 | "ImageData", 378 | "ImageDecoder", 379 | "ImageTrack", 380 | "ImageTrackList", 381 | "Infinity", 382 | "Ink", 383 | "InputDeviceCapabilities", 384 | "InputDeviceInfo", 385 | "InputEvent", 386 | "Int16Array", 387 | "Int32Array", 388 | "Int8Array", 389 | "IntersectionObserver", 390 | "IntersectionObserverEntry", 391 | "Intl", 392 | "JSON", 393 | "Keyboard", 394 | "KeyboardEvent", 395 | "KeyboardLayoutMap", 396 | "KeyframeEffect", 397 | "LargestContentfulPaint", 398 | "LaunchParams", 399 | "LaunchQueue", 400 | "LayoutShift", 401 | "LayoutShiftAttribution", 402 | "LinearAccelerationSensor", 403 | "Location", 404 | "Lock", 405 | "LockManager", 406 | "MIDIAccess", 407 | "MIDIConnectionEvent", 408 | "MIDIInput", 409 | "MIDIInputMap", 410 | "MIDIMessageEvent", 411 | "MIDIOutput", 412 | "MIDIOutputMap", 413 | "MIDIPort", 414 | "Map", 415 | "Math", 416 | "MathMLElement", 417 | "MediaCapabilities", 418 | "MediaDeviceInfo", 419 | "MediaDevices", 420 | "MediaElementAudioSourceNode", 421 | "MediaEncryptedEvent", 422 | "MediaError", 423 | "MediaKeyMessageEvent", 424 | "MediaKeySession", 425 | "MediaKeyStatusMap", 426 | "MediaKeySystemAccess", 427 | "MediaKeys", 428 | "MediaList", 429 | "MediaMetadata", 430 | "MediaQueryList", 431 | "MediaQueryListEvent", 432 | "MediaRecorder", 433 | "MediaSession", 434 | "MediaSource", 435 | "MediaSourceHandle", 436 | "MediaStream", 437 | "MediaStreamAudioDestinationNode", 438 | "MediaStreamAudioSourceNode", 439 | "MediaStreamEvent", 440 | "MediaStreamTrack", 441 | "MediaStreamTrackEvent", 442 | "MediaStreamTrackGenerator", 443 | "MediaStreamTrackProcessor", 444 | "MessageChannel", 445 | "MessageEvent", 446 | "MessagePort", 447 | "MimeType", 448 | "MimeTypeArray", 449 | "MouseEvent", 450 | "MutationEvent", 451 | "MutationObserver", 452 | "MutationRecord", 453 | "NaN", 454 | "NamedNodeMap", 455 | "NavigateEvent", 456 | "Navigation", 457 | "NavigationCurrentEntryChangeEvent", 458 | "NavigationDestination", 459 | "NavigationHistoryEntry", 460 | "NavigationPreloadManager", 461 | "NavigationTransition", 462 | "Navigator", 463 | "NavigatorManagedData", 464 | "NavigatorUAData", 465 | "NetworkInformation", 466 | "Node", 467 | "NodeFilter", 468 | "NodeIterator", 469 | "NodeList", 470 | "Notification", 471 | "Number", 472 | "OTPCredential", 473 | "Object", 474 | "OfflineAudioCompletionEvent", 475 | "OfflineAudioContext", 476 | "OffscreenCanvas", 477 | "OffscreenCanvasRenderingContext2D", 478 | "Option", 479 | "OrientationSensor", 480 | "OscillatorNode", 481 | "OverconstrainedError", 482 | "PageTransitionEvent", 483 | "PannerNode", 484 | "PasswordCredential", 485 | "Path2D", 486 | "PaymentAddress", 487 | "PaymentManager", 488 | "PaymentMethodChangeEvent", 489 | "PaymentRequest", 490 | "PaymentRequestUpdateEvent", 491 | "PaymentResponse", 492 | "Performance", 493 | "PerformanceElementTiming", 494 | "PerformanceEntry", 495 | "PerformanceEventTiming", 496 | "PerformanceLongTaskTiming", 497 | "PerformanceMark", 498 | "PerformanceMeasure", 499 | "PerformanceNavigation", 500 | "PerformanceNavigationTiming", 501 | "PerformanceObserver", 502 | "PerformanceObserverEntryList", 503 | "PerformancePaintTiming", 504 | "PerformanceResourceTiming", 505 | "PerformanceServerTiming", 506 | "PerformanceTiming", 507 | "PeriodicSyncManager", 508 | "PeriodicWave", 509 | "PermissionStatus", 510 | "Permissions", 511 | "PictureInPictureEvent", 512 | "PictureInPictureWindow", 513 | "Plugin", 514 | "PluginArray", 515 | "PointerEvent", 516 | "PopStateEvent", 517 | "Presentation", 518 | "PresentationAvailability", 519 | "PresentationConnection", 520 | "PresentationConnectionAvailableEvent", 521 | "PresentationConnectionCloseEvent", 522 | "PresentationConnectionList", 523 | "PresentationReceiver", 524 | "PresentationRequest", 525 | "ProcessingInstruction", 526 | "Profiler", 527 | "ProgressEvent", 528 | "Promise", 529 | "PromiseRejectionEvent", 530 | "Proxy", 531 | "PublicKeyCredential", 532 | "PushManager", 533 | "PushSubscription", 534 | "PushSubscriptionOptions", 535 | "RTCCertificate", 536 | "RTCDTMFSender", 537 | "RTCDTMFToneChangeEvent", 538 | "RTCDataChannel", 539 | "RTCDataChannelEvent", 540 | "RTCDtlsTransport", 541 | "RTCEncodedAudioFrame", 542 | "RTCEncodedVideoFrame", 543 | "RTCError", 544 | "RTCErrorEvent", 545 | "RTCIceCandidate", 546 | "RTCIceTransport", 547 | "RTCPeerConnection", 548 | "RTCPeerConnectionIceErrorEvent", 549 | "RTCPeerConnectionIceEvent", 550 | "RTCRtpReceiver", 551 | "RTCRtpSender", 552 | "RTCRtpTransceiver", 553 | "RTCSctpTransport", 554 | "RTCSessionDescription", 555 | "RTCStatsReport", 556 | "RTCTrackEvent", 557 | "RadioNodeList", 558 | "Range", 559 | "RangeError", 560 | "ReadableByteStreamController", 561 | "ReadableStream", 562 | "ReadableStreamBYOBReader", 563 | "ReadableStreamBYOBRequest", 564 | "ReadableStreamDefaultController", 565 | "ReadableStreamDefaultReader", 566 | "ReferenceError", 567 | "Reflect", 568 | "RegExp", 569 | "RelativeOrientationSensor", 570 | "RemotePlayback", 571 | "ReportingObserver", 572 | "Request", 573 | "ResizeObserver", 574 | "ResizeObserverEntry", 575 | "ResizeObserverSize", 576 | "Response", 577 | "SVGAElement", 578 | "SVGAngle", 579 | "SVGAnimateElement", 580 | "SVGAnimateMotionElement", 581 | "SVGAnimateTransformElement", 582 | "SVGAnimatedAngle", 583 | "SVGAnimatedBoolean", 584 | "SVGAnimatedEnumeration", 585 | "SVGAnimatedInteger", 586 | "SVGAnimatedLength", 587 | "SVGAnimatedLengthList", 588 | "SVGAnimatedNumber", 589 | "SVGAnimatedNumberList", 590 | "SVGAnimatedPreserveAspectRatio", 591 | "SVGAnimatedRect", 592 | "SVGAnimatedString", 593 | "SVGAnimatedTransformList", 594 | "SVGAnimationElement", 595 | "SVGCircleElement", 596 | "SVGClipPathElement", 597 | "SVGComponentTransferFunctionElement", 598 | "SVGDefsElement", 599 | "SVGDescElement", 600 | "SVGElement", 601 | "SVGEllipseElement", 602 | "SVGFEBlendElement", 603 | "SVGFEColorMatrixElement", 604 | "SVGFEComponentTransferElement", 605 | "SVGFECompositeElement", 606 | "SVGFEConvolveMatrixElement", 607 | "SVGFEDiffuseLightingElement", 608 | "SVGFEDisplacementMapElement", 609 | "SVGFEDistantLightElement", 610 | "SVGFEDropShadowElement", 611 | "SVGFEFloodElement", 612 | "SVGFEFuncAElement", 613 | "SVGFEFuncBElement", 614 | "SVGFEFuncGElement", 615 | "SVGFEFuncRElement", 616 | "SVGFEGaussianBlurElement", 617 | "SVGFEImageElement", 618 | "SVGFEMergeElement", 619 | "SVGFEMergeNodeElement", 620 | "SVGFEMorphologyElement", 621 | "SVGFEOffsetElement", 622 | "SVGFEPointLightElement", 623 | "SVGFESpecularLightingElement", 624 | "SVGFESpotLightElement", 625 | "SVGFETileElement", 626 | "SVGFETurbulenceElement", 627 | "SVGFilterElement", 628 | "SVGForeignObjectElement", 629 | "SVGGElement", 630 | "SVGGeometryElement", 631 | "SVGGradientElement", 632 | "SVGGraphicsElement", 633 | "SVGImageElement", 634 | "SVGLength", 635 | "SVGLengthList", 636 | "SVGLineElement", 637 | "SVGLinearGradientElement", 638 | "SVGMPathElement", 639 | "SVGMarkerElement", 640 | "SVGMaskElement", 641 | "SVGMatrix", 642 | "SVGMetadataElement", 643 | "SVGNumber", 644 | "SVGNumberList", 645 | "SVGPathElement", 646 | "SVGPatternElement", 647 | "SVGPoint", 648 | "SVGPointList", 649 | "SVGPolygonElement", 650 | "SVGPolylineElement", 651 | "SVGPreserveAspectRatio", 652 | "SVGRadialGradientElement", 653 | "SVGRect", 654 | "SVGRectElement", 655 | "SVGSVGElement", 656 | "SVGScriptElement", 657 | "SVGSetElement", 658 | "SVGStopElement", 659 | "SVGStringList", 660 | "SVGStyleElement", 661 | "SVGSwitchElement", 662 | "SVGSymbolElement", 663 | "SVGTSpanElement", 664 | "SVGTextContentElement", 665 | "SVGTextElement", 666 | "SVGTextPathElement", 667 | "SVGTextPositioningElement", 668 | "SVGTitleElement", 669 | "SVGTransform", 670 | "SVGTransformList", 671 | "SVGUnitTypes", 672 | "SVGUseElement", 673 | "SVGViewElement", 674 | "Sanitizer", 675 | "Scheduler", 676 | "Scheduling", 677 | "Screen", 678 | "ScreenDetailed", 679 | "ScreenDetails", 680 | "ScreenOrientation", 681 | "ScriptProcessorNode", 682 | "SecurityPolicyViolationEvent", 683 | "Selection", 684 | "Sensor", 685 | "SensorErrorEvent", 686 | "Serial", 687 | "SerialPort", 688 | "ServiceWorker", 689 | "ServiceWorkerContainer", 690 | "ServiceWorkerRegistration", 691 | "Set", 692 | "ShadowRoot", 693 | "SharedWorker", 694 | "SourceBuffer", 695 | "SourceBufferList", 696 | "SpeechSynthesisErrorEvent", 697 | "SpeechSynthesisEvent", 698 | "SpeechSynthesisUtterance", 699 | "StaticRange", 700 | "StereoPannerNode", 701 | "Storage", 702 | "StorageEvent", 703 | "StorageManager", 704 | "String", 705 | "StylePropertyMap", 706 | "StylePropertyMapReadOnly", 707 | "StyleSheet", 708 | "StyleSheetList", 709 | "SubmitEvent", 710 | "SubtleCrypto", 711 | "Symbol", 712 | "SyncManager", 713 | "SyntaxError", 714 | "TaskAttributionTiming", 715 | "TaskController", 716 | "TaskPriorityChangeEvent", 717 | "TaskSignal", 718 | "Text", 719 | "TextDecoder", 720 | "TextDecoderStream", 721 | "TextEncoder", 722 | "TextEncoderStream", 723 | "TextEvent", 724 | "TextMetrics", 725 | "TextTrack", 726 | "TextTrackCue", 727 | "TextTrackCueList", 728 | "TextTrackList", 729 | "TimeRanges", 730 | "ToggleEvent", 731 | "Touch", 732 | "TouchEvent", 733 | "TouchList", 734 | "TrackEvent", 735 | "TransformStream", 736 | "TransformStreamDefaultController", 737 | "TransitionEvent", 738 | "TreeWalker", 739 | "TrustedHTML", 740 | "TrustedScript", 741 | "TrustedScriptURL", 742 | "TrustedTypePolicy", 743 | "TrustedTypePolicyFactory", 744 | "TypeError", 745 | "UIEvent", 746 | "URIError", 747 | "URL", 748 | "URLPattern", 749 | "URLSearchParams", 750 | "USB", 751 | "USBAlternateInterface", 752 | "USBConfiguration", 753 | "USBConnectionEvent", 754 | "USBDevice", 755 | "USBEndpoint", 756 | "USBInTransferResult", 757 | "USBInterface", 758 | "USBIsochronousInTransferPacket", 759 | "USBIsochronousInTransferResult", 760 | "USBIsochronousOutTransferPacket", 761 | "USBIsochronousOutTransferResult", 762 | "USBOutTransferResult", 763 | "Uint16Array", 764 | "Uint32Array", 765 | "Uint8Array", 766 | "Uint8ClampedArray", 767 | "UserActivation", 768 | "VTTCue", 769 | "ValidityState", 770 | "VideoColorSpace", 771 | "VideoDecoder", 772 | "VideoEncoder", 773 | "VideoFrame", 774 | "VideoPlaybackQuality", 775 | "ViewTransition", 776 | "VirtualKeyboard", 777 | "VirtualKeyboardGeometryChangeEvent", 778 | "VisualViewport", 779 | "WakeLock", 780 | "WakeLockSentinel", 781 | "WaveShaperNode", 782 | "WeakMap", 783 | "WeakRef", 784 | "WeakSet", 785 | "WebAssembly", 786 | "WebGL2RenderingContext", 787 | "WebGLActiveInfo", 788 | "WebGLBuffer", 789 | "WebGLContextEvent", 790 | "WebGLFramebuffer", 791 | "WebGLProgram", 792 | "WebGLQuery", 793 | "WebGLRenderbuffer", 794 | "WebGLRenderingContext", 795 | "WebGLSampler", 796 | "WebGLShader", 797 | "WebGLShaderPrecisionFormat", 798 | "WebGLSync", 799 | "WebGLTexture", 800 | "WebGLTransformFeedback", 801 | "WebGLUniformLocation", 802 | "WebGLVertexArrayObject", 803 | "WebKitCSSMatrix", 804 | "WebKitMutationObserver", 805 | "WebSocket", 806 | "WebTransport", 807 | "WebTransportBidirectionalStream", 808 | "WebTransportDatagramDuplexStream", 809 | "WebTransportError", 810 | "WheelEvent", 811 | "Window", 812 | "WindowControlsOverlay", 813 | "WindowControlsOverlayGeometryChangeEvent", 814 | "Worker", 815 | "Worklet", 816 | "WritableStream", 817 | "WritableStreamDefaultController", 818 | "WritableStreamDefaultWriter", 819 | "XMLDocument", 820 | "XMLHttpRequest", 821 | "XMLHttpRequestEventTarget", 822 | "XMLHttpRequestUpload", 823 | "XMLSerializer", 824 | "XPathEvaluator", 825 | "XPathExpression", 826 | "XPathResult", 827 | "XRAnchor", 828 | "XRAnchorSet", 829 | "XRBoundedReferenceSpace", 830 | "XRCPUDepthInformation", 831 | "XRCamera", 832 | "XRDOMOverlayState", 833 | "XRDepthInformation", 834 | "XRFrame", 835 | "XRHitTestResult", 836 | "XRHitTestSource", 837 | "XRInputSource", 838 | "XRInputSourceArray", 839 | "XRInputSourceEvent", 840 | "XRInputSourcesChangeEvent", 841 | "XRLayer", 842 | "XRLightEstimate", 843 | "XRLightProbe", 844 | "XRPose", 845 | "XRRay", 846 | "XRReferenceSpace", 847 | "XRReferenceSpaceEvent", 848 | "XRRenderState", 849 | "XRRigidTransform", 850 | "XRSession", 851 | "XRSessionEvent", 852 | "XRSpace", 853 | "XRSystem", 854 | "XRTransientInputHitTestResult", 855 | "XRTransientInputHitTestSource", 856 | "XRView", 857 | "XRViewerPose", 858 | "XRViewport", 859 | "XRWebGLBinding", 860 | "XRWebGLDepthInformation", 861 | "XRWebGLLayer", 862 | "XSLTProcessor", 863 | "__core-js_shared__", 864 | "_countAA", 865 | "ae", 866 | "alert", 867 | "api_target", 868 | "api_target_sri", 869 | "ark", 870 | "async_fingerprints", 871 | "atob", 872 | "blur", 873 | "btoa", 874 | "caches", 875 | "cancelAnimationFrame", 876 | "cancelIdleCallback", 877 | "capiMode", 878 | "capiSettings", 879 | "capiVersion", 880 | "captureEvents", 881 | "cdn", 882 | "chrome", 883 | "clearInterval", 884 | "clearTimeout", 885 | "clientInformation", 886 | "close", 887 | "closed", 888 | "confirm", 889 | "console", 890 | "cookieStore", 891 | "createImageBitmap", 892 | "credentialless", 893 | "crossOriginIsolated", 894 | "crypto", 895 | "customElements", 896 | "decodeURI", 897 | "decodeURIComponent", 898 | "devicePixelRatio", 899 | "doBBBd", 900 | "document", 901 | "encodeURI", 902 | "encodeURIComponent", 903 | "escape", 904 | "eval", 905 | "event", 906 | "extended_fingerprinting_enabled", 907 | "external", 908 | "fc_api_server", 909 | "fc_fp", 910 | "fc_obj", 911 | "fetch", 912 | "find", 913 | "find_onload", 914 | "fingerprinting_enabled", 915 | "focus", 916 | "fp_result", 917 | "frameElement", 918 | "frames", 919 | "getComputedStyle", 920 | "getScreenDetails", 921 | "getSelection", 922 | "get_outer_html", 923 | "get_query_data", 924 | "globalThis", 925 | "history", 926 | "indexedDB", 927 | "innerHeight", 928 | "innerWidth", 929 | "isFinite", 930 | "isNaN", 931 | "isSecureContext", 932 | "launchQueue", 933 | "length", 934 | "loadedWithData", 935 | "localStorage", 936 | "location", 937 | "locationbar", 938 | "log", 939 | "matchMedia", 940 | "menubar", 941 | "moveBy", 942 | "moveTo", 943 | "msie", 944 | "name", 945 | "navigation", 946 | "navigator", 947 | "offscreenBuffering", 948 | "onabort", 949 | "onafterprint", 950 | "onanimationend", 951 | "onanimationiteration", 952 | "onanimationstart", 953 | "onappinstalled", 954 | "onauxclick", 955 | "onbeforeinput", 956 | "onbeforeinstallprompt", 957 | "onbeforematch", 958 | "onbeforeprint", 959 | "onbeforetoggle", 960 | "onbeforeunload", 961 | "onbeforexrselect", 962 | "onblur", 963 | "oncancel", 964 | "oncanplay", 965 | "oncanplaythrough", 966 | "onchange", 967 | "onclick", 968 | "onclose", 969 | "oncontentvisibilityautostatechange", 970 | "oncontextlost", 971 | "oncontextmenu", 972 | "oncontextrestored", 973 | "oncuechange", 974 | "ondblclick", 975 | "ondevicemotion", 976 | "ondeviceorientation", 977 | "ondeviceorientationabsolute", 978 | "ondrag", 979 | "ondragend", 980 | "ondragenter", 981 | "ondragleave", 982 | "ondragover", 983 | "ondragstart", 984 | "ondrop", 985 | "ondurationchange", 986 | "onemptied", 987 | "onended", 988 | "onerror", 989 | "onfocus", 990 | "onformdata", 991 | "ongotpointercapture", 992 | "onhashchange", 993 | "oninput", 994 | "oninvalid", 995 | "onkeydown", 996 | "onkeypress", 997 | "onkeyup", 998 | "onlanguagechange", 999 | "onload", 1000 | "onload_retry", 1001 | "onloadeddata", 1002 | "onloadedmetadata", 1003 | "onloadstart", 1004 | "onlostpointercapture", 1005 | "onmessage", 1006 | "onmessageerror", 1007 | "onmousedown", 1008 | "onmouseenter", 1009 | "onmouseleave", 1010 | "onmousemove", 1011 | "onmouseout", 1012 | "onmouseover", 1013 | "onmouseup", 1014 | "onmousewheel", 1015 | "onoffline", 1016 | "ononline", 1017 | "onpagehide", 1018 | "onpageshow", 1019 | "onpause", 1020 | "onplay", 1021 | "onplaying", 1022 | "onpointercancel", 1023 | "onpointerdown", 1024 | "onpointerenter", 1025 | "onpointerleave", 1026 | "onpointermove", 1027 | "onpointerout", 1028 | "onpointerover", 1029 | "onpointerrawupdate", 1030 | "onpointerup", 1031 | "onpopstate", 1032 | "onprogress", 1033 | "onratechange", 1034 | "onrejectionhandled", 1035 | "onreset", 1036 | "onresize", 1037 | "onscroll", 1038 | "onscrollend", 1039 | "onsearch", 1040 | "onsecuritypolicyviolation", 1041 | "onseeked", 1042 | "onseeking", 1043 | "onselect", 1044 | "onselectionchange", 1045 | "onselectstart", 1046 | "onslotchange", 1047 | "onstalled", 1048 | "onstorage", 1049 | "onsubmit", 1050 | "onsuspend", 1051 | "ontimeupdate", 1052 | "ontoggle", 1053 | "ontransitioncancel", 1054 | "ontransitionend", 1055 | "ontransitionrun", 1056 | "ontransitionstart", 1057 | "onunhandledrejection", 1058 | "onunload", 1059 | "onvolumechange", 1060 | "onwaiting", 1061 | "onwebkitanimationend", 1062 | "onwebkitanimationiteration", 1063 | "onwebkitanimationstart", 1064 | "onwebkittransitionend", 1065 | "onwheel", 1066 | "open", 1067 | "openDatabase", 1068 | "opener", 1069 | "origin", 1070 | "originAgentCluster", 1071 | "outerHeight", 1072 | "outerWidth", 1073 | "pageXOffset", 1074 | "pageYOffset", 1075 | "parent", 1076 | "parseFloat", 1077 | "parseInt", 1078 | "performance", 1079 | "personalbar", 1080 | "postMessage", 1081 | "print", 1082 | "prompt", 1083 | "public_key", 1084 | "queryLocalFonts", 1085 | "query_data", 1086 | "queueMicrotask", 1087 | "releaseEvents", 1088 | "reportError", 1089 | "requestAnimationFrame", 1090 | "requestIdleCallback", 1091 | "resizeBy", 1092 | "resizeTo", 1093 | "scheduler", 1094 | "screen", 1095 | "screenLeft", 1096 | "screenTop", 1097 | "screenX", 1098 | "screenY", 1099 | "scroll", 1100 | "scrollBy", 1101 | "scrollTo", 1102 | "scrollX", 1103 | "scrollY", 1104 | "scrollbars", 1105 | "self", 1106 | "sessionStorage", 1107 | "setAPIInput", 1108 | "setInterval", 1109 | "setQueryDataInput", 1110 | "setTimeout", 1111 | "showDirectoryPicker", 1112 | "showOpenFilePicker", 1113 | "showSaveFilePicker", 1114 | "siteData", 1115 | "speechSynthesis", 1116 | "startArkoseEnforcement", 1117 | "status", 1118 | "statusbar", 1119 | "stop", 1120 | "stringifyWithFloat", 1121 | "structuredClone", 1122 | "styleMedia", 1123 | "target", 1124 | "toolbar", 1125 | "top", 1126 | "trustedTypes", 1127 | "undefined", 1128 | "unescape", 1129 | "visualViewport", 1130 | "webkitCancelAnimationFrame", 1131 | "webkitMediaStream", 1132 | "webkitRTCPeerConnection", 1133 | "webkitRequestAnimationFrame", 1134 | "webkitRequestFileSystem", 1135 | "webkitResolveLocalFileSystemURL", 1136 | "webkitSpeechGrammar", 1137 | "webkitSpeechGrammarList", 1138 | "webkitSpeechRecognition", 1139 | "webkitSpeechRecognitionError", 1140 | "webkitSpeechRecognitionEvent", 1141 | "webkitURL", 1142 | "window", 1143 | } 1144 | sort.Strings(b1) 1145 | result := strings.Join(b1, "|") 1146 | return getMurmur128String(result, 420) 1147 | } 1148 | 1149 | func getWindowProtoChainHash() string { // return this[dh(f_a_hU.f)](b0[dh(f_a_hU.g)]('|'), 0x1a4); 1150 | // Object.getPrototypeOf(window); 1151 | b0 := []string{ 1152 | "TEMPORARY", 1153 | "PERSISTENT", 1154 | "constructor", 1155 | "addEventListener", 1156 | "dispatchEvent", 1157 | "removeEventListener", 1158 | "constructor", 1159 | "constructor", 1160 | "__defineGetter__", 1161 | "__defineSetter__", 1162 | "hasOwnProperty", 1163 | "__lookupGetter__", 1164 | "__lookupSetter__", 1165 | "isPrototypeOf", 1166 | "propertyIsEnumerable", 1167 | "toString", 1168 | "valueOf", 1169 | "__proto__", 1170 | "toLocaleString", 1171 | } 1172 | result2 := strings.Join(b0, "|") 1173 | return x64hash128(result2, 420) 1174 | } 1175 | 1176 | func x64Add(m []uint32, n []uint32) []uint32 { 1177 | m = []uint32{m[0] >> 16, m[0] & 0xffff, m[1] >> 16, m[1] & 0xffff} 1178 | n = []uint32{n[0] >> 16, n[0] & 0xffff, n[1] >> 16, n[1] & 0xffff} 1179 | o := []uint32{0, 0, 0, 0} 1180 | o[3] += m[3] + n[3] 1181 | o[2] += o[3] >> 16 1182 | o[3] &= 0xffff 1183 | o[2] += m[2] + n[2] 1184 | o[1] += o[2] >> 16 1185 | o[2] &= 0xffff 1186 | o[1] += m[1] + n[1] 1187 | o[0] += o[1] >> 16 1188 | o[1] &= 0xffff 1189 | o[0] += m[0] + n[0] 1190 | o[0] &= 0xffff 1191 | return []uint32{(o[0] << 16) | o[1], (o[2] << 16) | o[3]} 1192 | } 1193 | 1194 | func x64Multiply(m []uint32, n []uint32) []uint32 { 1195 | m = []uint32{m[0] >> 16, m[0] & 0xffff, m[1] >> 16, m[1] & 0xffff} 1196 | n = []uint32{n[0] >> 16, n[0] & 0xffff, n[1] >> 16, n[1] & 0xffff} 1197 | o := []uint32{0, 0, 0, 0} 1198 | o[3] += m[3] * n[3] 1199 | o[2] += o[3] >> 16 1200 | o[3] &= 0xffff 1201 | o[2] += m[2] * n[3] 1202 | o[1] += o[2] >> 16 1203 | o[2] &= 0xffff 1204 | o[2] += m[3] * n[2] 1205 | o[1] += o[2] >> 16 1206 | o[2] &= 0xffff 1207 | o[1] += m[1] * n[3] 1208 | o[0] += o[1] >> 16 1209 | o[1] &= 0xffff 1210 | o[1] += m[2] * n[2] 1211 | o[0] += o[1] >> 16 1212 | o[1] &= 0xffff 1213 | o[1] += m[3] * n[1] 1214 | o[0] += o[1] >> 16 1215 | o[1] &= 0xffff 1216 | o[0] += m[0]*n[3] + m[1]*n[2] + m[2]*n[1] + m[3]*n[0] 1217 | o[0] &= 0xffff 1218 | return []uint32{(o[0] << 16) | o[1], (o[2] << 16) | o[3]} 1219 | } 1220 | 1221 | //goland:noinspection SpellCheckingInspection 1222 | func x64Rotl(m []uint32, n uint32) []uint32 { 1223 | n %= 64 1224 | if n == 32 { 1225 | return []uint32{m[1], m[0]} 1226 | } else if n < 32 { 1227 | return []uint32{(m[0] << n) | (m[1] >> (32 - n)), (m[1] << n) | (m[0] >> (32 - n))} 1228 | } else { 1229 | n -= 32 1230 | return []uint32{(m[1] << n) | (m[0] >> (32 - n)), (m[0] << n) | (m[1] >> (32 - n))} 1231 | } 1232 | } 1233 | 1234 | func x64LeftShift(m []uint32, n uint32) []uint32 { 1235 | n %= 64 1236 | if n == 0 { 1237 | return m 1238 | } else if n < 32 { 1239 | return []uint32{(m[0] << n) | (m[1] >> (32 - n)), m[1] << n} 1240 | } else { 1241 | return []uint32{m[1] << (n - 32), 0} 1242 | } 1243 | } 1244 | 1245 | func x64Xor(m []uint32, n []uint32) []uint32 { 1246 | return []uint32{m[0] ^ n[0], m[1] ^ n[1]} 1247 | } 1248 | 1249 | //goland:noinspection SpellCheckingInspection 1250 | func x64Fmix(h []uint32) []uint32 { 1251 | h = x64Xor(h, []uint32{0, h[0] >> 1}) 1252 | h = x64Multiply(h, []uint32{0xff51afd7, 0xed558ccd}) 1253 | h = x64Xor(h, []uint32{0, h[0] >> 1}) 1254 | h = x64Multiply(h, []uint32{0xc4ceb9fe, 0x1a85ec53}) 1255 | h = x64Xor(h, []uint32{0, h[0] >> 1}) 1256 | return h 1257 | } 1258 | 1259 | func x64hash128(key string, seed uint32) string { 1260 | keyLength := len(key) 1261 | remainder := keyLength % 16 1262 | bytes := keyLength - remainder 1263 | 1264 | var h1 = []uint32{0, seed} 1265 | var h2 = []uint32{0, seed} 1266 | var k1 = []uint32{0, 0} 1267 | var k2 = []uint32{0, 0} 1268 | var c1 = []uint32{0x87c37b91, 0x114253d5} 1269 | var c2 = []uint32{0x4cf5ad43, 0x2745937f} 1270 | 1271 | for i := 0; i < bytes; i += 16 { 1272 | k1[0] = uint32(key[i+4])&0xff | (uint32(key[i+5])&0xff)<<8 | (uint32(key[i+6])&0xff)<<16 | (uint32(key[i+7])&0xff)<<24 1273 | k1[1] = uint32(key[i])&0xff | (uint32(key[i+1])&0xff)<<8 | (uint32(key[i+2])&0xff)<<16 | (uint32(key[i+3])&0xff)<<24 1274 | 1275 | k2[0] = uint32(key[i+12])&0xff | (uint32(key[i+13])&0xff)<<8 | (uint32(key[i+14])&0xff)<<16 | (uint32(key[i+15])&0xff)<<24 1276 | k2[1] = uint32(key[i+8])&0xff | (uint32(key[i+9])&0xff)<<8 | (uint32(key[i+10])&0xff)<<16 | (uint32(key[i+11])&0xff)<<24 1277 | 1278 | k1 = x64Multiply(k1, c1) 1279 | k1 = x64Rotl(k1, 31) 1280 | k1 = x64Multiply(k1, c2) 1281 | h1 = x64Xor(h1, k1) 1282 | h1 = x64Rotl(h1, 27) 1283 | h1 = x64Add(h1, h2) 1284 | h1 = x64Add(x64Multiply(h1, []uint32{0, 5}), []uint32{0, 0x52dce729}) 1285 | 1286 | k2 = x64Multiply(k2, c2) 1287 | k2 = x64Rotl(k2, 33) 1288 | k2 = x64Multiply(k2, c1) 1289 | h2 = x64Xor(h2, k2) 1290 | h2 = x64Rotl(h2, 31) 1291 | h2 = x64Add(h2, h1) 1292 | h2 = x64Add(x64Multiply(h2, []uint32{0, 5}), []uint32{0, 0x38495ab5}) 1293 | } 1294 | 1295 | k1 = []uint32{0, 0} 1296 | k2 = []uint32{0, 0} 1297 | 1298 | switch remainder { 1299 | case 15: 1300 | k2 = x64Xor(k2, x64LeftShift([]uint32{0, uint32(key[bytes+14])}, 48)) 1301 | fallthrough 1302 | case 14: 1303 | k2 = x64Xor(k2, x64LeftShift([]uint32{0, uint32(key[bytes+13])}, 40)) 1304 | fallthrough 1305 | case 13: 1306 | k2 = x64Xor(k2, x64LeftShift([]uint32{0, uint32(key[bytes+12])}, 32)) 1307 | fallthrough 1308 | case 12: 1309 | k2 = x64Xor(k2, x64LeftShift([]uint32{0, uint32(key[bytes+11])}, 24)) 1310 | fallthrough 1311 | case 11: 1312 | k2 = x64Xor(k2, x64LeftShift([]uint32{0, uint32(key[bytes+10])}, 16)) 1313 | fallthrough 1314 | case 10: 1315 | k2 = x64Xor(k2, x64LeftShift([]uint32{0, uint32(key[bytes+9])}, 8)) 1316 | fallthrough 1317 | case 9: 1318 | k2 = x64Xor(k2, []uint32{0, uint32(key[bytes+8])}) 1319 | k2 = x64Multiply(k2, c2) 1320 | k2 = x64Rotl(k2, 33) 1321 | k2 = x64Multiply(k2, c1) 1322 | h2 = x64Xor(h2, k2) 1323 | fallthrough 1324 | case 8: 1325 | k1 = x64Xor(k1, x64LeftShift([]uint32{0, uint32(key[bytes+7])}, 56)) 1326 | fallthrough 1327 | case 7: 1328 | k1 = x64Xor(k1, x64LeftShift([]uint32{0, uint32(key[bytes+6])}, 48)) 1329 | fallthrough 1330 | case 6: 1331 | k1 = x64Xor(k1, x64LeftShift([]uint32{0, uint32(key[bytes+5])}, 40)) 1332 | fallthrough 1333 | case 5: 1334 | k1 = x64Xor(k1, x64LeftShift([]uint32{0, uint32(key[bytes+4])}, 32)) 1335 | fallthrough 1336 | case 4: 1337 | k1 = x64Xor(k1, x64LeftShift([]uint32{0, uint32(key[bytes+3])}, 24)) 1338 | fallthrough 1339 | case 3: 1340 | k1 = x64Xor(k1, x64LeftShift([]uint32{0, uint32(key[bytes+2])}, 16)) 1341 | fallthrough 1342 | case 2: 1343 | k1 = x64Xor(k1, x64LeftShift([]uint32{0, uint32(key[bytes+1])}, 8)) 1344 | fallthrough 1345 | case 1: 1346 | k1 = x64Xor(k1, []uint32{0, uint32(key[bytes])}) 1347 | k1 = x64Multiply(k1, c1) 1348 | k1 = x64Rotl(k1, 31) 1349 | k1 = x64Multiply(k1, c2) 1350 | h1 = x64Xor(h1, k1) 1351 | } 1352 | 1353 | h1 = x64Xor(h1, []uint32{0, uint32(keyLength)}) 1354 | h2 = x64Xor(h2, []uint32{0, uint32(keyLength)}) 1355 | h1 = x64Add(h1, h2) 1356 | h2 = x64Add(h2, h1) 1357 | h1 = x64Fmix(h1) 1358 | h2 = x64Fmix(h2) 1359 | h1 = x64Add(h1, h2) 1360 | h2 = x64Add(h2, h1) 1361 | 1362 | return fmt.Sprintf("%08x%08x%08x%08x", h1[0], h1[1], h2[0], h2[1]) 1363 | } 1364 | 1365 | func getCFPHash(cfp string) uint32 { 1366 | //'this is the cfp: canvas xxx base64 image'.split('').reduce((b5, b6) => { 1367 | // return b5 = (b5 << 5) - b5 + b6.charCodeAt(0), b5 & b5; 1368 | //}, 0); 1369 | 1370 | var b5 uint32 1371 | for _, b6 := range cfp { 1372 | b5 = (b5 << 5) - b5 + uint32(b6) 1373 | b5 &= b5 1374 | } 1375 | return b5 1376 | } 1377 | 1378 | func getIfeHash() string { 1379 | return x64hash128(strings.Join(getFeList(), ", "), 38) 1380 | } 1381 | -------------------------------------------------------------------------------- /constants.go: -------------------------------------------------------------------------------- 1 | package funcaptcha 2 | 3 | import http "github.com/bogdanfinn/fhttp" 4 | 5 | var bv = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" 6 | var headers = http.Header{ 7 | "Accept": []string{"*/*"}, 8 | "Accept-Encoding": []string{"gzip, deflate, br"}, 9 | "Accept-Language": []string{"en-US,en;q=0.5"}, 10 | "Cache-Control": []string{"no-cache"}, 11 | "Connection": []string{"keep-alive"}, 12 | "Content-Type": []string{"application/x-www-form-urlencoded; charset=UTF-8"}, 13 | "Host": []string{"client-api.arkoselabs.com"}, 14 | "Origin": []string{"https://client-api.arkoselabs.com"}, 15 | "User-Agent": []string{bv}, 16 | "X-Requested-With": []string{"XMLHttpRequest"}, 17 | } 18 | 19 | const bx_template string = ` 20 | [{ 21 | "key": "api_type", 22 | "value": "js" 23 | }, { 24 | "key": "p", 25 | "value": 1 26 | }, { 27 | "key": "f", 28 | "value": "%s" 29 | }, { 30 | "key": "n", 31 | "value": "%s" 32 | }, { 33 | "key": "wh", 34 | "value": "%s" 35 | }, { 36 | "key": "enhanced_fp", 37 | "value": [{ 38 | "key": "webgl_extensions", 39 | "value": "%s" 40 | }, { 41 | "key": "webgl_extensions_hash", 42 | "value": "%s" 43 | }, { 44 | "key": "webgl_renderer", 45 | "value": "%s" 46 | }, { 47 | "key": "webgl_vendor", 48 | "value": "%s" 49 | }, { 50 | "key": "webgl_version", 51 | "value": "%s" 52 | }, { 53 | "key": "webgl_shading_language_version", 54 | "value": "%s" 55 | }, { 56 | "key": "webgl_aliased_line_width_range", 57 | "value": "%s" 58 | }, { 59 | "key": "webgl_aliased_point_size_range", 60 | "value": "%s" 61 | }, { 62 | "key": "webgl_antialiasing", 63 | "value": "%s" 64 | }, { 65 | "key": "webgl_bits", 66 | "value": "%s" 67 | }, { 68 | "key": "webgl_max_params", 69 | "value": "%s" 70 | }, { 71 | "key": "webgl_max_viewport_dims", 72 | "value": "%s" 73 | }, { 74 | "key": "webgl_unmasked_vendor", 75 | "value": "%s" 76 | }, { 77 | "key": "webgl_unmasked_renderer", 78 | "value": "%s" 79 | }, { 80 | "key": "webgl_vsf_params", 81 | "value": "%s" 82 | }, { 83 | "key": "webgl_vsi_params", 84 | "value": "%s" 85 | }, { 86 | "key": "webgl_fsf_params", 87 | "value": "%s" 88 | }, { 89 | "key": "webgl_fsi_params", 90 | "value": "%s" 91 | }, { 92 | "key": "webgl_hash_webgl", 93 | "value": "%s" 94 | }, { 95 | "key": "user_agent_data_brands", 96 | "value": "Not.A/Brand,Chromium,Google Chrome" 97 | }, { 98 | "key": "user_agent_data_mobile", 99 | "value": false 100 | }, { 101 | "key": "navigator_connection_downlink", 102 | "value": 10.0 103 | }, { 104 | "key": "navigator_connection_downlink_max", 105 | "value": null 106 | }, { 107 | "key": "network_info_rtt", 108 | "value": 150 109 | }, { 110 | "key": "network_info_save_data", 111 | "value": false 112 | }, { 113 | "key": "network_info_rtt_type", 114 | "value": null 115 | }, { 116 | "key": "screen_pixel_depth", 117 | "value": 24 118 | }, { 119 | "key": "navigator_device_memory", 120 | "value": 8 121 | }, { 122 | "key": "navigator_languages", 123 | "value": "zh-CN,en" 124 | }, { 125 | "key": "window_inner_width", 126 | "value": 0 127 | }, { 128 | "key": "window_inner_height", 129 | "value": 0 130 | }, { 131 | "key": "window_outer_width", 132 | "value": 1920 133 | }, { 134 | "key": "window_outer_height", 135 | "value": 1057 136 | }, { 137 | "key": "browser_detection_firefox", 138 | "value": false 139 | }, { 140 | "key": "browser_detection_brave", 141 | "value": false 142 | }, { 143 | "key": "audio_codecs", 144 | "value": "{\"ogg\":\"probably\",\"mp3\":\"probably\",\"wav\":\"probably\",\"m4a\":\"maybe\",\"aac\":\"probably\"}" 145 | }, { 146 | "key": "video_codecs", 147 | "value": "{\"ogg\":\"probably\",\"h264\":\"probably\",\"webm\":\"probably\",\"mpeg4v\":\"\",\"mpeg4a\":\"\",\"theora\":\"\"}" 148 | }, { 149 | "key": "media_query_dark_mode", 150 | "value": true 151 | }, { 152 | "key": "headless_browser_phantom", 153 | "value": false 154 | }, { 155 | "key": "headless_browser_selenium", 156 | "value": false 157 | }, { 158 | "key": "headless_browser_nightmare_js", 159 | "value": false 160 | }, { 161 | "key": "document__referrer", 162 | "value": "" 163 | }, { 164 | "key": "window__ancestor_origins", 165 | "value": ["https://chat.openai.com"] 166 | }, { 167 | "key": "window__tree_index", 168 | "value": [2] 169 | }, { 170 | "key": "window__tree_structure", 171 | "value": "[[],[],[]]" 172 | }, { 173 | "key": "window__location_href", 174 | "value": "https://tcr9i.chat.openai.com/v2/%s/enforcement.%s.html#35536E1E-65B4-4D96-9D97-6ADB7EFF8147" 175 | }, { 176 | "key": "client_config__sitedata_location_href", 177 | "value": "https://chat.openai.com" 178 | }, { 179 | "key": "client_config__surl", 180 | "value": "https://tcr9i.chat.openai.com" 181 | }, { 182 | "key": "mobile_sdk__is_sdk" 183 | }, { 184 | "key": "client_config__language", 185 | "value": null 186 | }, { 187 | "key": "navigator_battery_charging", 188 | "value": true 189 | }, { 190 | "key": "audio_fingerprint", 191 | "value": "124.04347527516074" 192 | }] 193 | }, { 194 | "key": "fe", 195 | "value": %s 196 | }, { 197 | "key": "ife_hash", 198 | "value": "%s" 199 | }, { 200 | "key": "cs", 201 | "value": 1 202 | }, { 203 | "key": "jsbd", 204 | "value": "{\"HL\":5,\"NCE\":true,\"DT\":\"\",\"NWD\":\"false\",\"DOTO\":1,\"DMTO\":1}" 205 | }] 206 | ` 207 | 208 | // LinkedHashMap 209 | var fe = []map[string]interface{}{ 210 | {"DNT": "1"}, 211 | {"L": "zh-CN"}, 212 | {"D": 24}, 213 | {"PR": 1}, // this.getPixelRatio(); 214 | {"S": "1920;1080"}, 215 | {"AS": "1920;1080"}, 216 | {"TO": -480}, 217 | {"SS": true}, 218 | {"LS": true}, 219 | {"IDB": true}, 220 | {"B": false}, 221 | {"ODB": true}, 222 | {"CPUC": "unknown"}, 223 | {"PK": "Linux x86_64"}, 224 | {"CFP": cfp}, 225 | {"FR": false}, 226 | {"FOS": false}, 227 | {"FB": false}, 228 | {"JSF": "Arial;Courier;Courier New;Helvetica;Times;Times New Roman"}, 229 | {"P": p}, 230 | {"T": "0;false;false"}, 231 | {"H": 16}, 232 | {"SWF": false}, 233 | } 234 | 235 | const ( 236 | p = "Chrome PDF Viewer::Portable Document Format::application/pdf~pdf,text/pdf~pdf;Chromium PDF Viewer::Portable Document Format::application/pdf~pdf,text/pdf~pdf;Microsoft Edge PDF Viewer::Portable Document Format::application/pdf~pdf,text/pdf~pdf;PDF Viewer::Portable Document Format::application/pdf~pdf,text/pdf~pdf;WebKit built-in PDF::Portable Document Format::application/pdf~pdf,text/pdf~pdf" 237 | ) 238 | 239 | const ( 240 | cfp = "canvas winding:yes~canvas fp:data:image/png;base64,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kd/P/miR4vw+1VKGAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQyqwoQC9esx3dQu995vjBx1/b352xW5DulOL/05g6nG/zs2X79EHjiWt2+fL+lBLCQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAy5wHoD9KqzMuXZSab33OVL/35hFp3tBnrPkH0o8LKzFmTRZ/txA31GkeKsPnSkBAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIaFwGAB+u6tW+ije+p26ysfzJPH7thTDZP7IzD6igfy5LE79VhsRev2+fwe65hOgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBYSOwwQC96rJMeWGSD/bUcbHk2aycsEVPNUzuj8Coxc+mHN/rWXylSHFafxpShQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsNDoJ0AfXKSWUle2FPLN271YA55xi30nhB7nHzTlg/m0Kd7PYMnqzepFynm9NiN6QQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBhWAoMG6FW3ZcrqPejV+9C7//zNa+blkl/s3X0BM3sWOOnV8/LPP+/1DM4qUszouRcFCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMMwE2g3QN2vdQp/Sdf87nbs49585oev5JvYusPM5i/PAJ3s5g9mt2+fP996MCgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBheAm0F6FXLZcqjk1zZffvzkv/dJ+klvu1+cTMXJ3npXUl6uoB+TJHiKpgECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYFAXaDtCrzZcp/ynJqV1DfGHsAzlj+U5dzzexe4HzxzyQjy7rxf4bRYr3dN+AmQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBjeAp0G6BNbj3If19W2Dnjn3fnFd/bqaq5JvQm8+h1357Zvd2u/tPXo9gW9NWE2AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEhq9ARwF6tY0y5WlJLuhqS5vf/Gienrp9RnU126RuBVYm2WrWo3nu4O27LHF6keLCLueaRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUYIdBygV7sqU343ydu62uHl2yzOcSu8Cb0rvC4nXTF6cY5/olvz7xUp3t7lyqYRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgMQLdBujVI9yvS7JPxzt94yk35McXH9bxPBO6F3jTyTfkJxd1Y35XksOLFNUj3H0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwSQt0FaBXImXKI5PM7Fhn8wfuyIqd98sWHc80oRuBZ5OMvv+OPLfTfl1Mn1akuKaLeaYQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgcQJdB+jVTsuUZyaZ0fGu3zd1dr5685SO55nQucD7D56dr83qxnp6keKczhc0gwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAs0U6ClAr7ZcpvzXJMd3tP3N5zyUe1+1Q7p9K3dHi43gwYuT7PbfD+W5yTt0qHB5keIvO5xjOAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBot0I8AfWKSHyfZsyOJEw+Zl+/P2rujOQZ3JvBXU+fl0ps6Nb4nyZuKFAs6W8xoAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQINFug5wC92n6Z8tAkP0qybbscZW5fWfzilaNyQLszjOtI4LakfPX/rCyy/6gO5j2e5M1Fihs7mGMoAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIENgmBvgTolUSZ8oQkl3akcshx9+TGH3Z2c72jBUbw4EOPvSc3XdGp7YlFistGsJqtEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwggX6FqBXhmXKk5Jc3L7nw8mV457K0c9v3f4cIwcVuGqzp3LM0q2TFw86dI0BJxcpLulkgrEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYlAT6GqBXMGXK05N8uW2kiZ+5O/d+eq+2xxs4uMBun747Cz7ViemHihQXDF7YCAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECGy6An0P0CuqMuUnk5zTNtvndr0zH//Nvm2PN3D9Aue97M58YmEnlmcWKc5FSoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZEuUEuAXqGWKU9L0t6t5hf88rHcvP/oTClfMNIPpKf9/7xYmdfe/kR++4rt2qxzepHiwjbHGkaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFNWqC2AL1SK1O+Kcm/tSW48+cXZu7Hd82L2hpt0LoCjySZdN7C3P+xXdvE+YsixY/bHGsYAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIENnmBWgP0Sq9MeViS69uS/LOj5ueGmbu3NdagtQUOmzY//3l1u3avK1LcgJAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE/iBQe4BeLVWmPDDJlUl2GBT/9N0X5cv37jLoOAP+IPCh3RblgvntmD2U5Jgixa34CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGBtgY0SoFdLliknJ/lekr03fAiLkosmLcvJK8Y6rDYELh69LKfMHZsMmp/PS/K2IsWcNqoaQoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgREnsNEC9Eq2TDkxyeeTHL9h6dnJ7AOT14y48+hswz9PMqW6TD5lsHmXJ/lYkWLBYAP9nAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAiNVYKMG6KuRy5RnJpmxYfRrk+VvSF40Uo9mkH0/kmTMT5McMRjQ9CLFOYMN8nMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMdIEhCdAr9DLlka3b6Pus/xCuSRZPS8aP9GNaZ/9LkkyYmaQiXO/nrtat82voESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDgAkMWoFetlSnHtUL0t62/1WuTy96QvGXwzYyIET9IcsKgN8+rd81Xj2xfOiJMbJIAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ9EBjSAH11/2XK05J8IkkVqA/wmZ28/8jH8w+PbNuHPTe3xAde9Hi+es22G3jneRWYf65IcWFzN6lzAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDI3AsAjQq62XKSe2QvRTB6ZYlLx+2rJcN3fs0FAN8aqHT1qWf585NtllfY18oxWeLxjiTi1PgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBRgoMmwB9tV6Z8uhWkD5lINHy5Sc+WFx32Y4j5r3oS5Ly8BMeLH516Y7r+Q2b3QrOr2rkb6CmCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMEwEhl2AXrmUKTdrhejVY91f+EdW233p4VzxkTF5XTlqmDjW08b1xW9z3BcfyWMffvEACzxZBeet8Pz5ehpQlQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAiNHYFgG6Kv5y5STk5yU5N1JRq91LKPmPpVzj1qYj/9m303yuM572Z355NW7ZuWkrdfZ34ok30xySZFizia5d5siQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAEAgM6wB9tUeZcvck72oF6ePXcpr4mbvzxRkTcvTz6wbNQ8DZhyWv2uypfGT64iz41F7rVFvSCs6/VaSY34eVlCBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBNQQaEaCv7rdMObYVoldh+qQ/7OPh5JD33pPzg2wVwwAACndJREFUf7hnDmjo+d6W5Ixj78lNX98zWeuJ7XOTfKsKz4sUyxq6O20TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBg2As0KkBfrdl6R/pfJzmq9bVV9bMyt68sTjzt7nxh1t6ZMOztf9fg4iQfnTqvvPTCvYrsv/qd7k8nubr19S9FCu84b8hxapMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgeYKNDJAX5O7TLnLGkH6Eat+tvmch3LK6QvypZunZIthejjPJvnwwbNz0QUT89zkHVpdXrs6OC9SLBqmnWuLAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECm6RA4wP0NU+lTLlfkjcnOTLJlGz+wB05/Mxl+dvL9si0FRMy1Lstk8wcvTj/eML8XHfOmDy3U9Xv7CTXJPlRkeKOTfK3zKYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQAIGhjpRrIypTVg9xn5rkoCSvzeazJuSgry3NW38yJtMeHZdxtS29duGlVTS+/dJ8/42P5Jb37ZznplYPbf9ZkluSzCpSVH/3IUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEhFthkA/R1XcuUY1uB+sHZ5r8OyXZVkH7lk3n73Bfntc/s2Ndz+NmWD+a7kx7OzGNemMfeuDxP/OlNSW5uBebL+rqWYgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQF4ERE6APpFWm3DbJgdlpzhEp7jo0y5fumz/59cqMv+eZ7H5fmT2WvyB7P7pddk1WfVWfha2veds/ll+P+W3mv6TIkj22zP/tOSpjxt2Z7HNj7p9cvcv81iLF4305JUUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoHaBER2g165rAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBojIAAvTFHpVECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqFNAgF6nrtoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0BgBAXpjjkqjBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFCngAC9Tl21CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAxAgL0xhyVRgkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgTgEBep26ahMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAYwQE6I05Ko0SIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQJ0CAvQ6ddUmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcYICNAbc1QaJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIE6BQTodeqqTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNERCgN+aoNEqAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECdQoI0OvUVZsAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGiMgQG/MUWmUAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBOoUEKDXqas2AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDRGQIDemKPSKAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUKSBAr1NXbQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBojIAAvTFHpVECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqFNAgF6nrtoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0BgBAXpjjkqjBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFCngAC9Tl21CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAxAgL0xhyVRgkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgTgEBep26ahMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAYwQE6I05Ko0SIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQJ0CAvQ6ddUmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcYICNAbc1QaJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIE6BQTodeqqTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNERCgN+aoNEqAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECdQoI0OvUVZsAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGiMgQG/MUWmUAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBOoUEKDXqas2AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDRGQIDemKPSKAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUKSBAr1NXbQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBojIAAvTFHpVECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqFNAgF6nrtoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0BgBAXpjjkqjBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFCngAC9Tl21CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAxAgL0xhyVRgkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgTgEBep26ahMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAYwQE6I05Ko0SIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQJ0CAvQ6ddUmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcYICNAbc1QaJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIE6BQTodeqqTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNERCgN+aoNEqAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECdQoI0OvUVZsAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGiMgQG/MUWmUAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBOoUEKDXqas2AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDRGQIDemKPSKAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUKSBAr1NXbQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBojIAAvTFHpVECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqFPg/wGfCrReV85ybQAAAABJRU5ErkJggg==" 241 | ) 242 | --------------------------------------------------------------------------------