├── README.md ├── errors.go ├── go.mod ├── go.sum ├── image_index.go ├── internal └── utils │ ├── encryption.go │ ├── marshal.go │ └── params.go ├── new.go ├── payloads.go ├── responses.go ├── solver.go └── types.go /README.md: -------------------------------------------------------------------------------- 1 | # Geetest v4 slider captcha golang solver 2 | 3 | # Alternative, you can use [capsolver.com](https://capsolver.com) 4 | 5 | Based on [this gravilk's repo](https://github.com/gravilk/geetest-v4-slide-documented) 6 | 7 | 8 | # Example 9 | ```go 10 | package main 11 | 12 | import ( 13 | "fmt" 14 | "github.com/vimbing/geetest-solver" 15 | ) 16 | 17 | const CAPTCHA_ID = "3f765ss62g871421d5723a68371726a676" 18 | 19 | func main() { 20 | solver := geetest.New(CAPTCHA_ID) 21 | 22 | token, err := solver.Solve() 23 | 24 | if err != nil { 25 | panic(err) 26 | } 27 | 28 | fmt.Printf("token: %v\n", token) 29 | } 30 | ``` 31 | ```bash 32 | token: eyJjYXB0Y2hhX2lkIjoiM2Y3NjU4ODI4NzA0ZjFkMjcyM2E2ODM3MTcyNmE2NzYiLCJsb3RfbnVtYmVyIjoiZGNkZWNiZDQxZWM0NGUxY2IyZDUyNzQwMjA1YWQwZTAiLCJwYXNzX3Rva2VuIjoiMmY2NTUyZmQ3MWE5MTZkMzcwNjAxZjM5M2IzOTEwMjlmMTkxODBmMTQwNzQ5ODc5NDhiYzMyNGM2OWRjYThjOCIsImdlbl90aW1lIjoiMTcxNTM0MzQ4MSIsImNhcHRjaGFfb3V0cHV0IjoiY2k3RDF5dEx5VmNDVkhmUkszdHdLc01XajlKOXRSSExkWHhBNnVncGJjQXdReG41Zm04YlRjXzludlpiUlA5T2Y0S1VvRVRhZVJzdnZhdnZ4b1hVV1ljX1hiQzFpekFrbnN2dmJoTDdaam5rRUdQOEwya1RJM181YWZpU01vUlZ3TWp3RWtnSEVJRnZsQ1hTdFFMQmtTZkFJeU4yVjNXandSR0JOMkxUdGFTZHdIbU5KblpMaWM4MFNILVpia2lGSG8tUTVFR2w5MlpUVlpNUnptYUJpNVQ5MnM1SkNod3ZGUExGWnNNbFNMYjEtbVdHR3RUWG1HN0hmZy03QlgtUXdwUnlYYW1YZDFCcFk3NFJNWlVxTDQ0OUczZHFfY0JTMF82cF9RZkk3bTZiQXpZTjlRM052Z29sTHBTZHE3T291REpNcnlEWWk5SjBZUTR5Tm9iVlluQ3g3TlVybmVOUnl3eWlEQlFUS01uMVVaaXZ1R012a3VhOWIxT3UwTEdIOGVmeXRQY3Q5TUNYYmNtTjB2czJJZnYxQzdIeGJOYXdaakkwV1RqRmNDbjB6Sk80VDNYLVU0OWlYQWpsSjFoSSJ9 33 | ``` 34 | 35 | ## Todo 36 | 37 | ``` 38 | - [ ] Add more image indexes, or change to dynamic slide solver 39 | ``` -------------------------------------------------------------------------------- /errors.go: -------------------------------------------------------------------------------- 1 | package geetest 2 | 3 | import "errors" 4 | 5 | var ( 6 | ErrResponseInvalid = errors.New("response is not valid") 7 | ErrImageNotRecognized = errors.New("image is not recognized") 8 | ) 9 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/vimbing/geetest-solver 2 | 3 | go 1.22.1 4 | 5 | require ( 6 | github.com/corona10/goimagehash v1.1.0 7 | github.com/google/uuid v1.6.0 8 | github.com/vimbing/fhttp v0.0.0-20221020151142-202d69962c22 9 | github.com/vimbing/gorand v0.0.0-20240109173029-b055b5f08ee5 10 | github.com/vimbing/http v0.0.0-20240421220329-1f69089668eb 11 | ) 12 | 13 | require ( 14 | github.com/andybalholm/brotli v1.0.6 // indirect 15 | github.com/dsnet/compress v0.0.1 // indirect 16 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect 17 | github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5 // indirect 18 | github.com/vimbing/cclient v0.0.0-20230405121047-abcd63de9a96 // indirect 19 | github.com/vimbing/retry v0.0.0-20231128154506-c473fbce0cb4 // indirect 20 | github.com/vimbing/utls v0.0.0-20230220162003-5720b08bfd56 // indirect 21 | github.com/zhangyunhao116/fastrand v0.3.0 // indirect 22 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect 23 | gitlab.com/yawning/utls.git v0.0.12-1 // indirect 24 | golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect 25 | golang.org/x/net v0.0.0-20220812174116-3211cb980234 // indirect 26 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect 27 | golang.org/x/text v0.3.7 // indirect 28 | ) 29 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= 2 | github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= 3 | github.com/corona10/goimagehash v1.1.0 h1:teNMX/1e+Wn/AYSbLHX8mj+mF9r60R1kBeqE9MkoYwI= 4 | github.com/corona10/goimagehash v1.1.0/go.mod h1:VkvE0mLn84L4aF8vCb6mafVajEb6QYMHl2ZJLn0mOGI= 5 | github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= 6 | github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= 7 | github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= 8 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 9 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 10 | github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 11 | github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 12 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= 13 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= 14 | github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5 h1:YqAladjX7xpA6BM04leXMWAEjS0mTZ5kUU9KRBriQJc= 15 | github.com/tam7t/hpkp v0.0.0-20160821193359-2b70b4024ed5/go.mod h1:2JjD2zLQYH5HO74y5+aE3remJQvl6q4Sn6aWA2wD1Ng= 16 | github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= 17 | github.com/vimbing/cclient v0.0.0-20230405121047-abcd63de9a96 h1:DqgF0j7h5QrGX4akb8ZWrz7CW5mhPbzmTL/BQHeVxvo= 18 | github.com/vimbing/cclient v0.0.0-20230405121047-abcd63de9a96/go.mod h1:B0Kgs1WyvIM27oM1HdNdSFPxgRMw6J2KPT6srroPV4o= 19 | github.com/vimbing/fhttp v0.0.0-20221020151142-202d69962c22 h1:eZMBIPdC039h1D1nYosecCAQkpC95bg+LQmZ9pynQIg= 20 | github.com/vimbing/fhttp v0.0.0-20221020151142-202d69962c22/go.mod h1:fc+yZo0LhpKhG83PJDaUFF8KFrvJvX+9FltQPZfgCzA= 21 | github.com/vimbing/gorand v0.0.0-20240109173029-b055b5f08ee5 h1:a/cyqEGlGv0iNwZup6q/565bipNe5EKx0Ca+BhtceXI= 22 | github.com/vimbing/gorand v0.0.0-20240109173029-b055b5f08ee5/go.mod h1:r5PAnSytuKu8J8FCZPVuQlcP6RnoLCMbTxrUROS4DBc= 23 | github.com/vimbing/http v0.0.0-20240421220329-1f69089668eb h1:y2OFqWLfxYdQOoY2D/HDxWtsF9WRm7CpcSKeW8nbdEA= 24 | github.com/vimbing/http v0.0.0-20240421220329-1f69089668eb/go.mod h1:LTZPthQBZmv0kj/EMBVuKWDa/2znikpwrTnuva8bdSA= 25 | github.com/vimbing/retry v0.0.0-20231128154506-c473fbce0cb4 h1:EJBwuBZ6T42XFMd+EXTLE/ssxVtWF0cFyp5LIZ1YXYY= 26 | github.com/vimbing/retry v0.0.0-20231128154506-c473fbce0cb4/go.mod h1:KpRUUhEkH+ulbRjS7M/RnWODdcvvoPxr5HeZLRyqACc= 27 | github.com/vimbing/utls v0.0.0-20230220162003-5720b08bfd56 h1:VX+38J7FZLm9q7MbhDKoCTrNNeYe6quoJgdrjdhT8II= 28 | github.com/vimbing/utls v0.0.0-20230220162003-5720b08bfd56/go.mod h1:8T3EM2lY8JiiIXBbItC9+8NhD8Hl24MVk2XqmNExP8k= 29 | github.com/zhangyunhao116/fastrand v0.3.0 h1:7bwe124xcckPulX6fxtr2lFdO2KQqaefdtbk+mqO/Ig= 30 | github.com/zhangyunhao116/fastrand v0.3.0/go.mod h1:0v5KgHho0VE6HU192HnY15de/oDS8UrbBChIFjIhBtc= 31 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= 32 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ= 33 | gitlab.com/yawning/utls.git v0.0.12-1 h1:RL6O0MP2YI0KghuEU/uGN6+8b4183eqNWoYgx7CXD0U= 34 | gitlab.com/yawning/utls.git v0.0.12-1/go.mod h1:3ONKiSFR9Im/c3t5RKmMJTVdmZN496FNyk3mjrY1dyo= 35 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 36 | golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 37 | golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= 38 | golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 39 | golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 40 | golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= 41 | golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= 42 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 43 | golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 44 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= 45 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 46 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 47 | golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 48 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 49 | -------------------------------------------------------------------------------- /image_index.go: -------------------------------------------------------------------------------- 1 | package geetest 2 | 3 | var imageIndex = map[string]int{ 4 | "818056cdeef639e8": 221, 5 | "cad27205bda50f72": 263, 6 | "e7989e883927706b": 226, 7 | "d06a2dad76c258e5": 256, 8 | "894936b61673497b": 223, 9 | "eb659525dcf0c41a": 210, 10 | "b23946e9dd9d1a11": 231, 11 | "8a5a95a50aeb55b5": 205, 12 | "8081758ecaf7b1f8": 245, 13 | "d8d3526a4195f32d": 231, 14 | "c984b669f296694b": 218, 15 | "fb9a84b34b4a3895": 231, 16 | "e8d22734ca5abca5": 246, 17 | "817f96d26139588f": 207, 18 | "d8935a6a551af2a5": 247, 19 | "ad16d62d32d509b6": 207, 20 | "868721da7750afa9": 245, 21 | "e0e1161e2d2d3eb6": 207, 22 | "cfb678688b95e0c1": 213, 23 | "d2c2a5a5b5ad525a": 254, 24 | "d02e1dcb62a559e5": 237, 25 | "e05a5bb48d35a44f": 254, 26 | "cba0b44bcb5ab435": 224, 27 | "cded16e9c9129649": 218, 28 | "e9d23724c25aace5": 201, 29 | "9931f7e9f0b04907": 220, 30 | "ed96906cb5949369": 215, 31 | "ca2a7d348fb5e0c1": 243, 32 | "8b4ad4a535d24b7a": 236, 33 | "8a5a95a42eca55bd": 221, 34 | "868fa1975352b789": 257, 35 | "894b36362969cf96": 217, 36 | "db393696616c6c61": 206, 37 | "eab590489d997366": 255, 38 | "c9b6724db2820f73": 207, 39 | "896bd49436d5093f": 226, 40 | "ad1665e99069b6d8": 211, 41 | "ac06b6c56d3b92e8": 196, 42 | "817fb4d66139580f": 225, 43 | "caa135d24a37b55a": 242, 44 | "ca2ed925e78338f0": 253, 45 | "c961b596d64a6935": 216, 46 | "c5b8126ff8c230b7": 202, 47 | "e5db52a0cd10b26f": 207, 48 | "8a5a95a42acb55bd": 238, 49 | "f925a4b57a4a4936": 237, 50 | "ea359c4ab5534ba4": 239, 51 | "e896996eb548932d": 247, 52 | "818252ede6f239ec": 203, 53 | "ebb6928c49493736": 222, 54 | "8a5af5a52ada0ab5": 243, 55 | "cab6756a0bb5e0c1": 235, 56 | "ef2f9021678339f0": 201, 57 | "cb2f902bc38739f0": 230, 58 | "cb7ab5254c519566": 250, 59 | "ea36d28d95996362": 243, 60 | "c821b757cd4ab235": 205, 61 | "e0e1051e0b3f3ebc": 245, 62 | "db3132866d6c6c93": 201, 63 | "e5cb52b0cd28b24f": 204, 64 | "8a4d35625ab58d5b": 258, 65 | "cfb632680b97f0c1": 212, 66 | "aa06b5c5493bb5e8": 239, 67 | "894b34b43672c9bb": 227, 68 | "868ea1b5675a8f89": 247, 69 | "d0261dca76b558e5": 246, 70 | "ed169469b6336994": 222, 71 | "80c245ade5f539f8": 261, 72 | "ba3eb5b0725233a1": 258, 73 | "81c94696d6f639e8": 217, 74 | "eab4da489d4b3526": 242, 75 | "8f8fb097435ab688": 229, 76 | "db3926a4656c6c69": 225, 77 | "9686a1b7675a9689": 268, 78 | "cae316b4354b4b5a": 236, 79 | "d8935a6a451bf2a5": 255, 80 | "cd7ab46d4a5115a6": 214, 81 | "8f8f219617d2b788": 224, 82 | "8a5af5a525d64a3a": 252, 83 | "da85b54ab3b54a4a": 248, 84 | "cb548529da8a75d5": 246, 85 | "c97ab5254a5b95a4": 258, 86 | "f86ab5d36965b402": 242, 87 | "cbb67e680b95e0c1": 218, 88 | "817e92cf65b2980f": 196, 89 | "818074ceeaf6b1e9": 235, 90 | "a78721bf5368a788": 200, 91 | "ed499494b673694c": 220, 92 | "8dc5b6966d699292": 209, 93 | "eab690ad985b5326": 252, 94 | "817ebccba432588f": 234, 95 | "c9b6734db4830e72": 219, 96 | "cb85b54ab5896ab4": 240, 97 | "c9ec1669db16c949": 222, 98 | "cd7bb4064a5995a6": 221, 99 | "8a06a5c75a3ba7e8": 263, 100 | "c972b46f5a5115a6": 219, 101 | "ab3fb4b06170b293": 217, 102 | "c7b8144bf8c630b7": 234, 103 | "db31b66c6964c469": 215, 104 | "f9daccb5a492384a": 235, 105 | "e9da9124b548db69": 227, 106 | "ed96926e69489669": 220, 107 | "868721da275ab7a9": 251, 108 | "c16a1f9236a569e5": 213, 109 | "ea15954a26b76b4c": 243, 110 | "818256cde6f239ec": 205, 111 | "e6319d4aa5b34aa5": 264, 112 | "f92524b6f2664963": 219, 113 | "eba7d2849c9b6162": 219, 114 | "e9de5369d610a04f": 217, 115 | "c8d352ea4d1bb2a5": 206, 116 | "f9a4242bb6e64936": 233, 117 | "ea65b535da70841b": 256, 118 | "eb659535da70c41a": 234, 119 | "eba5d28c949b6562": 216, 120 | "aaf5926ab5628933": 251, 121 | "ae7a912599724ab3": 261, 122 | "cb2a7d348fc5e0c1": 233, 123 | "f82525ad7a668d32": 253, 124 | "e7989e823867684f": 205, 125 | "cb2b74368fc5e0c1": 228, 126 | "c16a1f896fb610e5": 213, 127 | "cd72b46d5a5115a6": 218, 128 | "d06a3d9972ca59a5": 250, 129 | "caa5b55ac60ee835": 243, 130 | "868721da6752b7a9": 251, 131 | "cded1292d969c949": 211, 132 | "ea5b95a5b45a4b84": 242, 133 | "babd7c52215273a1": 262, 134 | "ea13954a6ab7a54c": 243, 135 | "ad7b923698694933": 215, 136 | "cd72b50e5a4995ac": 216, 137 | "b23967c3cd8d5215": 260, 138 | "9a31f5ea58b5c04b": 249, 139 | "ad0cb6d209696fd8": 204, 140 | "ab54852bda8375c9": 243, 141 | "f924a5ad7a429936": 241, 142 | "ad7a926d69329263": 204, 143 | "e7989f8ab4636047": 238, 144 | "9931f7ea68b4c04b": 232, 145 | "ab0b75c494336be8": 229, 146 | "c9e42b6996699655": 225, 147 | "cba6357a0b95e4c1": 237, 148 | "e9d23734c05a99e5": 232, 149 | "c9a096e36992967b": 215, 150 | "caa5144b4bb6b64b": 232, 151 | "827eb5c5613258af": 251, 152 | "8a74b58a7ad5853a": 253, 153 | "ed129669b69269cc": 217, 154 | "9a1bf7e578524087": 257, 155 | "f9a624a972f64932": 217, 156 | "817cbccba43b188f": 236, 157 | "e99a84b6476b6992": 225, 158 | "ab3db4b260696393": 213, 159 | "f825a5ad7a428d36": 249, 160 | "ebb6d2499c996126": 224, 161 | "ad7a926d49b2c865": 202, 162 | "e8da9964b5949369": 237, 163 | "e9c26716c21abce5": 205, 164 | "db393626696c6c92": 221, 165 | "cbaa3504fbc20db5": 239, 166 | "adf69269943649b2": 215, 167 | "cdf412699233e955": 215, 168 | "caa5797a0f95e0c1": 249, 169 | "e94ccd939692384f": 206, 170 | "9b39f7e478694007": 236, 171 | "ea5b94b4664b6994": 234, 172 | "cbae3444fbc20c75": 234, 173 | "e9549629cd8376c9": 218, 174 | "c992256d964abd35": 207, 175 | "e8dd516a871868e7": 236, 176 | "ca85b54ab5b54ab1": 237, 177 | "cb2e902bc78739f0": 233, 178 | "b53946e1cdcd9215": 205, 179 | "c8d352e24d19f3a5": 223, 180 | "b939f6e469719007": 209, 181 | "e9d23734c24a99e5": 227, 182 | "8a5895a62caf55b5": 253, 183 | "8b35d28b354a957a": 240, 184 | "e2df05b0ca35a44f": 257, 185 | "8a4a35b5347a4b9b": 241, 186 | "e9d23716c04aade5": 205, 187 | "c9c5b6966949b692": 220, 188 | "f9a42ca9b6628d36": 224, 189 | "c9b6764db9920e61": 221, 190 | "da568521d68a7dc5": 256, 191 | "ca4aa5b5954ab935": 239, 192 | "daca2da53568723c": 256, 193 | "8a5a95a46aae55b9": 235, 194 | "d2c2e4a5b5a5a55a": 255, 195 | "aa4a75a595b17ac8": 242, 196 | "817eb8cba43b188f": 232, 197 | "b13946e2dccd9a15": 207, 198 | "a94c9632d48b6dd3": 204, 199 | "cb2ed023c78769f0": 229, 200 | "db548529da8375d1": 242, 201 | "ed6a9659a965e412": 206, 202 | "c8d3526a551ee9a5": 219, 203 | "c8d35a6a551be1a5": 201, 204 | "ad12776d92296f90": 206, 205 | "cb8c16c32934737d": 213, 206 | "ad16366d90336fd0": 208, 207 | "8d42366d39b2c9b9": 211, 208 | "817fb6d2e231482f": 206, 209 | "da30672d6d664c69": 263, 210 | "cdec1669c916e949": 214, 211 | "c16a1e9867e958b5": 219, 212 | "db3966a465646c69": 229, 213 | "e7989ecc3823684f": 207, 214 | "e0e1161e0d6d3eb6": 217, 215 | "817e96d26d31988f": 207, 216 | "e2cd4572cf34604f": 246, 217 | "ab0bb486947b6b68": 222, 218 | "cbb679688f95e0c0": 226, 219 | "ad163669903b6f94": 209, 220 | "db3926a4616e6c69": 234, 221 | "edb6da4d98892532": 202, 222 | "db30666d27646cb1": 218, 223 | "8a8d357235724abd": 262, 224 | "b23946c38ddf9215": 254, 225 | "9930f7e9b4714887": 225, 226 | "ca61b596c64ae935": 218, 227 | "cdec1269cb12ed49": 209, 228 | "e0e1161e2d3736bc": 215, 229 | "ab3ef4b434b06343": 232, 230 | "8a52d4ad2de5897a": 262, 231 | "cb84b44bb4956b96": 233, 232 | "db8e2cc31269733c": 207, 233 | "c9a63644e9c31e76": 222, 234 | "c7982165f9c21ab7": 255, 235 | "ef2fd003c28739e1": 219, 236 | "8976d62969d6096b": 218, 237 | "c8ed25da5a31b549": 259, 238 | "f96a945ba965d212": 242, 239 | "8b4b34604bf685bb": 233, 240 | "ed252c9ab2969d62": 203, 241 | "cb7ab5254a591566": 249, 242 | "cc21b396cd4ab935": 203, 243 | "e99a84b6c74a781b": 230, 244 | "ed969366b7488169": 206, 245 | "eda5d2989c496566": 209, 246 | "9932f7e99669c007": 220, 247 | "cb2fd027c78339e0": 230, 248 | "cb2b7d340fc5e0c1": 229, 249 | "cd7ab5064a5b95a4": 233, 250 | "c5324f8936ed58a5": 210, 251 | "cfb67a6c0b91e4c0": 200, 252 | "cab5255a954ab535": 246, 253 | "ea5b95adb4524a8c": 250, 254 | "cab4b54b964a6935": 228, 255 | "ebb692849c4b6b62": 230, 256 | "f92524ae6b629c36": 222, 257 | "e19ace616592396d": 198, 258 | "ed969366254c9369": 207, 259 | "e896916e53ad9368": 248, 260 | "c598026ffac238b7": 202, 261 | "eb659535cdf0841a": 206, 262 | "ab6595359ef0c41a": 208, 263 | "c97bb50e4a5195a6": 241, 264 | "9931f7e970b2410f": 212, 265 | "ca75b54a4c5b95a4": 251, 266 | "8a5a95a46acb55b5": 217, 267 | "b23946e39dcb9215": 250, 268 | "d8d352ea491cb5a5": 233, 269 | "cb2d79729295e4c1": 212, 270 | "ba3eadb07230a393": 269, 271 | "8d4d12322d658fbb": 200, 272 | "c9a5234b954bda55": 236, 273 | "c9b6724db4830f72": 218, 274 | "e19cce93c764381b": 201, 275 | "ebb6da4994492536": 227, 276 | "cbea7414b5920b73": 237, 277 | "c9b416691396697b": 216, 278 | "e0e1151e0f4b3ebc": 234, 279 | "c06a1f9d36a558e5": 234, 280 | "c9ed34cb4b359449": 235, 281 | "cbc1b4b46b4bb494": 228, 282 | "c7b8254afac230b7": 252, 283 | "ea35984ab55b69a4": 243, 284 | "b33946e1c99d9615": 226, 285 | "878621fb5752af84": 219, 286 | "da38672565646c6b": 244, 287 | "eae5b5349d71441a": 248, 288 | "d893526a5519eba5": 234, 289 | "e0e30d1d0f5a1ebc": 253, 290 | "eda5d29898c96566": 207, 291 | "caba3505bdd20a73": 260, 292 | "896dd69269e909b6": 213, 293 | "eb27d294949b6962": 220, 294 | "ab06b44b19b36be8": 230, 295 | "c9925669967b6952": 215, 296 | "ed92936cb5988369": 205, 297 | "e0cb53b4cf10a46f": 231, 298 | "f9a4b4a96b969462": 223, 299 | "c56a1f9867a51a95": 201, 300 | "8080759dca73b1fd": 244, 301 | "e0e1161f2d933eac": 206, 302 | "dace2da12568723e": 256, 303 | "ea1bb5a44a5b25a5": 241, 304 | "eda6b22d6b928962": 207, 305 | "f9a5240bb6e64936": 239, 306 | "da31252d696e6c35": 251, 307 | "f96a94d2a925d24b": 217, 308 | "da31256d6b666c61": 246, 309 | "cf2f9023438735f1": 235, 310 | "80c27595e67339f8": 241, 311 | "817e96cb6933980f": 210, 312 | "abb67c7032712393": 223, 313 | "c9b6724db2920f71": 206, 314 | "c9e925b59535ca49": 237, 315 | "cb5ab5a54e511566": 251, 316 | "b13a46e9dc8d5a15": 214, 317 | "e7989fca3c236846": 239, 318 | "fa67945aa965d403": 249, 319 | "9a06a5c25a3bb7d8": 262, 320 | "b23946e39dcd9215": 249, 321 | "e0e1171e0b3b3eb4": 237, 322 | "e8d553629758a0e7": 233, 323 | "827eb5c5627218af": 248, 324 | "f9a4a4ab6bb48962": 227, 325 | "cb14ce6bd40a75c9": 241, 326 | "cb2b74760fc5e0c1": 226, 327 | "e2cf05b2ca35a44f": 252, 328 | "ef2f900367c730f0": 200, 329 | "eae5b5349d70441b": 257, 330 | "cb5ab5254cd195a6": 250, 331 | "8e8fa1b7434ab788": 235, 332 | "da31256e6b246c6b": 251, 333 | "8a02a5e55a7bb7a4": 255, 334 | "e99684636bb6381b": 222, 335 | "e91396496db2334d": 221, 336 | "8a4a35b53572ca9b": 243, 337 | "8d4932b23969cd9b": 204, 338 | "9a3bf5e44a7ac007": 241, 339 | "e992372ec25a98e5": 228, 340 | "e0e1161e0bb73eac": 230, 341 | "e0e1161e093f3ebc": 223, 342 | "e9cb16b4cb49a04f": 226, 343 | "cd92466d926dd2d2": 200, 344 | "cde91296d229ed49": 214, 345 | "db313664696c6cb1": 216, 346 | "817e96cd61b2582f": 201, 347 | "edb692894d89b332": 201, 348 | "ed929266b5498b69": 217, 349 | "aa7e95655a24a533": 251, 350 | "da30672d656e4c69": 255, 351 | "8f86a1db4750af89": 231, 352 | "af3df09270616393": 200, 353 | "ad52d62d32d50db2": 205, 354 | "b33b46a1dd8d9a11": 229, 355 | "cded1292d329ec49": 200, 356 | "ce2ed921e78358f0": 258, 357 | "cb9e16c1163a653e": 204, 358 | "cb2fd821e78539e0": 236, 359 | "c9e4364bdb34c949": 222, 360 | "cded1692c9699649": 212, 361 | "eb2792849ccb6366": 221, 362 | "ab3f7cb034b03343": 229, 363 | "8916d42936ed93b6": 219, 364 | "8a0ab5a5997b5ae8": 253, 365 | "c5b81247f9c232b7": 206, 366 | "b13b46e9cd9e1a05": 214, 367 | "e9da9964b4949369": 226, 368 | "fa6a94d1a965d24a": 244, 369 | "caa6756a0bb5e4c1": 239, 370 | "8949743416f2cdbd": 220, 371 | "8d49743612f2cdb9": 213, 372 | "a97b9234c969c9b2": 223, 373 | "cd7ab62d4a5315a4": 205, 374 | "8b36d40b36d6493e": 227, 375 | "aa0ab5a5917b5ae8": 245, 376 | "e7989e823863685f": 206, 377 | "827dbccaa532588f": 247, 378 | "f96a965ba9a5d202": 227, 379 | "c16a5f9836b459c5": 214, 380 | "aa7d956a5aa5c922": 245, 381 | "cb2fb123c38539f0": 244, 382 | "ed96926c65c89369": 200, 383 | "ad12766d92396f90": 209, 384 | "c1361fc966b449e5": 221, 385 | "c598036fda4638b7": 203, 386 | "8081658ecaf3b5fc": 245, 387 | "abbef07060927369": 205, 388 | "ab3eb47860b2b349": 226, 389 | "ebe795259671841a": 208, 390 | "d06a1d996aa33da5": 237, 391 | "89c5b6966949b696": 215, 392 | "d8d352e2d51af225": 253, 393 | "8a5a95a52e9a55b5": 203, 394 | "817e92cf6532982f": 199, 395 | "808165cecaf7b1f8": 249, 396 | "e7989f8239636067": 260, 397 | "cde156929292677a": 207, 398 | "8a35d60a25da953f": 253, 399 | "ab3f7cb434b03303": 230, 400 | "e7989f84386b604f": 230, 401 | "ef2fd803c28339e1": 202, 402 | "c16a1e996fa712a5": 212, 403 | "c16a1e9a67e958a5": 214, 404 | "8d4b12342d7393bb": 203, 405 | "caa114b44b5ba7b3": 237, 406 | "f966945ba965d602": 220, 407 | "ba7a9125d8724ab3": 254, 408 | "8a5a95a56a8a55bd": 219, 409 | "f96a94d1a965d243": 239, 410 | "cb2f9123c38739f0": 240, 411 | "aab5f47a30b06393": 240, 412 | "b23946e1ddcd9215": 234, 413 | "adf6926d9260c9b2": 209, 414 | "9a31f7cab4b14887": 245, 415 | "e0cb55b4cf18a06f": 237, 416 | "ad69923696b6c863": 215, 417 | "da31666e256c4cb5": 238, 418 | "e5da5224cf12a46f": 198, 419 | "b931f7ec6892900f": 198, 420 | "9939f7e46869c087": 228, 421 | "9939f6e46961d407": 218, 422 | "e0e1161e2d2f1ebc": 201, 423 | "da3927a4696e6c29": 240, 424 | "b23b65a1cdcb9215": 249, 425 | "ad7b923698614973": 223, 426 | "d0261dda37a55aa5": 247, 427 | "e0f20e1d0e2d3eb6": 211, 428 | "b939f6e668619087": 201, 429 | "cd7ab20f4a5395a4": 205, 430 | "d285a5865aada5da": 254, 431 | "e9568c69d62974d1": 206, 432 | "c921b616cd4bb635": 209, 433 | "cf2fd023c68739e0": 229, 434 | "81c15696e66d39f2": 213, 435 | "d2c2b5a5f34a4a96": 245, 436 | "e0e10f1e0d371ebc": 265, 437 | "adf2926d98b249b2": 208, 438 | "c9e436699635c955": 229, 439 | "c9b6794db2c11e61": 209, 440 | "e0f30f1c0b2d3e96": 199, 441 | "da31676e65646c31": 246, 442 | "f9a5a40b73b44972": 237, 443 | "ad06b6ed49b23668": 211, 444 | "ab3eb4b06272b391": 232, 445 | "cbb679688b95e0d0": 219, 446 | "c984b469f394e54b": 225, 447 | "ebe5952d9c71441a": 232, 448 | "eb54846bd48369d5": 233, 449 | "cd79b5165a59152c": 214, 450 | "cbc3b4b4b6496a4a": 235, 451 | "ad0db6d219696dc8": 207, 452 | "e9d2372dc01a99e5": 210, 453 | "f92725b573424972": 234, 454 | "cdad7352b2920e65": 203, 455 | "a78721bf5348b788": 202, 456 | "cb2d79769295e0c1": 213, 457 | "ea13946c6a33b5cc": 235, 458 | "f96a94d1a965d24a": 235, 459 | "c8935aea5519e3a5": 205, 460 | "f96a94d0a965d24b": 232, 461 | "c9b6724db4c30e72": 220, 462 | "c984b469b6896bb6": 226, 463 | "e8dd556acd14604f": 232, 464 | "e2cd4572cd34624f": 248, 465 | "c9b61669161b6b72": 218, 466 | "ad06b6cd4933b6c8": 223, 467 | "9a1bf7e4b4b1404b": 245, 468 | "caa5b54aca1ea935": 238, 469 | "e0e1171e0d4b7eac": 234, 470 | "e94accb296b6384b": 223, 471 | "ed929b6cb5988169": 208, 472 | "eb6595359c71c41a": 231, 473 | "d8d350e24b1bb5a5": 239, 474 | "d8d352e2555ae2a5": 244, 475 | "e5da49a0da69a44f": 203, 476 | "817e96cd61b2588f": 207, 477 | "c8e925b5cb5ad249": 249, 478 | "abf5946a9cb44a32": 238, 479 | "8a4b35255a728dbd": 258, 480 | "c5b8124ff9c230b7": 214, 481 | "db30366d61a66c69": 210, 482 | "cb7db54a4e5115a4": 237, 483 | "fa262cadb5a58d42": 253, 484 | "c9b416691796697a": 217, 485 | "cf2d79728a95e0c1": 203, 486 | "8a5a95a52cab55b9": 243, 487 | "f9a5a48b7ab48962": 234, 488 | "db54852bd28375d1": 248, 489 | "d8d3526a551ae3a5": 218, 490 | "cde91296d269e949": 214, 491 | "c9ab7254b4960f63": 227, 492 | "cba116966b4bb692": 224, 493 | "cb2fd823c68731e1": 229, 494 | "cd7ab60e4a5995a4": 207, 495 | "eb5c9435d48b69c1": 237, 496 | "ba3cb57072b1b303": 249, 497 | "ad02b66d49b376c8": 203, 498 | "eb54846bd48b7cc1": 234, 499 | "d205ce7af5026dd1": 267, 500 | "ebb690c94999b562": 228, 501 | "e99cce924769291b": 207, 502 | "81815696eb6b39f4": 223, 503 | "c9ab3614b9cb0b72": 225, 504 | "e98ccc9296626d6d": 204, 505 | "ad84b62d6992b669": 207, 506 | "c9af3216edc10e72": 214, 507 | "abb6f47832306393": 217, 508 | "c46e1f9a76a148e5": 198, 509 | "e8cb55b4cb48a4c7": 227, 510 | "8a5995a4ad4a95bd": 252, 511 | "818056c9f6f339f4": 222, 512 | "e9cb6736821a98e5": 213, 513 | "f2dacdb5a512584a": 251, 514 | "cbb636680b95f4c1": 217, 515 | "a9569469d6836dd1": 213, 516 | "cb27d003e7cb38f0": 237, 517 | "f9a424ab7bb48962": 227, 518 | "81c17494e66b39fc": 234, 519 | "cb9e0cc11639673e": 208, 520 | "b33946e9dc8d1a15": 225, 521 | "f0a52d8b72e48d72": 263, 522 | "ab3fb4b460636391": 227, 523 | "8a5a95a46aab559d": 255, 524 | "8a5a95a56a8e55b9": 231, 525 | "db30666d336c6c91": 210, 526 | "a96dd69232d6096d": 210, 527 | "c8d352e2951beb29": 222, 528 | "9913f7ed70b26007": 214, 529 | "fa64965aa965f442": 246, 530 | "da31676e65644ca5": 256, 531 | "ea65b535da70c41a": 236, 532 | "f962945ba965d292": 229, 533 | "8a5995a62dca55b5": 255, 534 | "db55856ad4837ac1": 254, 535 | "a916b66949b27e68": 215, 536 | "e0e1251f0b5b3eb4": 249, 537 | "8687219b375ab789": 244, 538 | "ebb69288c9c93726": 216, 539 | "e996cc61966b389a": 216, 540 | "e91b96946d6b2394": 224, 541 | "abb6f46832926393": 211, 542 | "eb16d949b46b6584": 229, 543 | "b33946e1dc9d9215": 227, 544 | "e5cb52b0cd18b44f": 208, 545 | "cac206b5b5374b5a": 243, 546 | "a96dd69232e5092f": 208, 547 | "ef2f9023638730f1": 220, 548 | "e7989f84bd276043": 257, 549 | "f0a52c8ab1569d37": 265, 550 | "c7b82547dac230b7": 250, 551 | "aa7a90a59562cb73": 241, 552 | "ef2f9023638734e1": 226, 553 | "8986366916f649bb": 219, 554 | "c9a0166b6996967b": 223, 555 | "e9db52b0c910b46f": 218, 556 | "c7b81256fcc2382f": 223, 557 | "d0261dca76a55ae5": 248, 558 | "ed929366b5488b69": 221, 559 | "d893526a553de2a5": 244, 560 | "cd7ab6064a5995a6": 220, 561 | "ef2ed021c3836df0": 202, 562 | "da55857ad4837ac1": 252, 563 | "8d42326d38f2cdb9": 207, 564 | "cd92126d139a6dd3": 201, 565 | "eab590489d996b66": 247, 566 | "ab659535dc71c41a": 215, 567 | "e94d9632d6826dc9": 208, 568 | "a9569669d4926dc9": 206, 569 | "e4da4ba0de69a447": 203, 570 | "c861b796d24ae935": 204, 571 | "a9d23734c95a98e5": 215, 572 | "8687a1b7435ab789": 245, 573 | "9b31fbe0b46a844b": 237, 574 | "aa0ab5a5197b5ae8": 241, 575 | "e0e1161f0d173ebc": 210, 576 | "e9568d29d60976c9": 209, 577 | "f9a5a58a7ab48962": 239, 578 | "cb9e16e11638653e": 206, 579 | "eda4b4ad69929962": 209, 580 | "c8a1b35fcd4ab035": 204, 581 | "a956d62932d649b6": 209, 582 | "cded12d3c9319649": 202, 583 | "c9ad2b5aa55a944d": 248, 584 | "af8f90966749a788": 211, 585 | "ca40b5b5d64ae935": 240, 586 | "ad65d2926ced09b2": 197, 587 | "8a5a95a40aeb55bd": 216, 588 | "9b39f5ec4a31a407": 243, 589 | "c9af7616b9c10972": 213, 590 | "dbac2cc33469633c": 234, 591 | "cafa7505b5920a7a": 255, 592 | "c9ad12d22d69723e": 210, 593 | "e192cc61d267399b": 201, 594 | "8a35f54a35d44ab5": 243, 595 | "f96a94d36965d203": 229, 596 | "cb2fd023c3cb69e0": 225, 597 | "c861b796d64a6935": 207, 598 | "da31256e6d246c79": 248, 599 | "db31366c6966c469": 219, 600 | "f92625ad73425837": 246, 601 | "a956d6292bd6093e": 212, 602 | "aa14754b947b6ab4": 234, 603 | "ebb69284994b6336": 224, 604 | "cdfa026d9229e559": 208, 605 | "896dd69232d68d2d": 210, 606 | "ab3d7cb032b233c1": 216, 607 | "ad6dd69232d6092d": 202, 608 | "ad7b9236d861c932": 218, 609 | "c986b469b696695a": 217, 610 | "aa7a95255a628db3": 251, 611 | "e9252d9eb2969c32": 211, 612 | "8976d40b6bf4097a": 231, 613 | "c8d352e2551aeba5": 237, 614 | "e896773e845a98a5": 238, 615 | "817eb4cb61b4588f": 232, 616 | "81c95496f6f33968": 227, 617 | "e992673cc24a9ce5": 224, 618 | "c9b63444fb921c73": 233, 619 | "fa6ab55a2925d213": 256, 620 | "e5da5321cf10e44f": 204, 621 | "d06a1d9d37a15ac5": 251, 622 | "ab3df49232716383": 202, 623 | "e5cb52b0cd10b26f": 210, 624 | "caa034b54b5a67b5": 241, 625 | "e0e1071a0db73eae": 237, 626 | "ed92936c35929369": 207, 627 | "ab6595359af0c41b": 207, 628 | "e5da5324da38a44f": 200, 629 | "ad0db6d290696de8": 200, 630 | "9a3bf5e55852c087": 253, 631 | "e235da4aa5526d8d": 258, 632 | "e94d8c32d6827dc9": 209, 633 | "e7989e8639636057": 207, 634 | "8687219b675ab789": 248, 635 | "e8da3734c05ab8e5": 239, 636 | "ed969346354c9369": 198, 637 | "e9549632dd8b74d0": 214, 638 | "eab6908d9d4b6362": 246, 639 | "9939f6e66869d086": 220, 640 | "aa02b5e5497bb6a4": 239, 641 | "9b31f7e848b4a44b": 229, 642 | "808165cecaf5b1fa": 245, 643 | "b23b46a5dd8d5a11": 232, 644 | "dace2da12568725e": 256, 645 | "aafd906a9d244ab6": 244, 646 | "81c95696d67339e8": 208, 647 | "daa5a55ac20bf835": 254, 648 | "caba3505bbd20a75": 255, 649 | "c598036ffa4a30b7": 210, 650 | "fd6a96d26965d202": 207, 651 | "818565cae4f53bf0": 243, 652 | "9a39f5e45a70a507": 249, 653 | "e0e10f1e1e933eac": 207, 654 | "ca2fd903e78338f0": 256, 655 | "e7989ec8bc236847": 221, 656 | "ea65b534dcb1c41a": 256, 657 | "abf4906b94344bb6": 233, 658 | "edb6924d989b6522": 199, 659 | "ed12c96db66b218c": 212, 660 | "818445cae4f73bf4": 238, 661 | "f8a52d8a73a55872": 259, 662 | "81c97494e67339f8": 230, 663 | "c7bc034afdc230b5": 256, 664 | "da31252d696e6ca9": 257, 665 | "ea6795359db1841a": 259, 666 | "8a5a95a52cab15bd": 261, 667 | "e8d227b5c05ad8e5": 249, 668 | "ce2fb12142cb39f1": 252, 669 | "abb4b47870b073c3": 234, 670 | "ed13926d6592694d": 203, 671 | "f96a965ba925d212": 222, 672 | "8d4932b63969cd9a": 208, 673 | "8d86b66db2926d4a": 205, 674 | "c06a1f9536a359e5": 235, 675 | "da31676e65646c61": 241, 676 | "ea65b535da71841a": 248, 677 | "cda65252ade50e72": 196, 678 | "e0e10e1e0db73eac": 229, 679 | "cbad0cd29629673c": 211, 680 | "db568521d58378da": 254, 681 | "daca0cd1b52d631e": 242, 682 | "c8d352e25519e9ad": 218, 683 | "ca2a7d340fd7e0c1": 241, 684 | "cb2f70760be5e0c1": 221, 685 | "c3980677fcc2383b": 236, 686 | "daa1a55ada0ba535": 254, 687 | "fd6a9659a925e412": 210, 688 | "cab23545fac22d35": 251, 689 | "e99ace616592391b": 204, 690 | "e992372ec21a99e5": 229, 691 | "ad92f46d92696c92": 200, 692 | "ed13926d6d92314d": 214, 693 | "cb7db54a4a5117a4": 248, 694 | "9939f7e4b4b4c00b": 232, 695 | "caba7505b5d20a73": 248, 696 | "ef2f9003c3cb29f0": 217, 697 | "e8d54b629558a4e7": 233, 698 | "cab4b54b964aa935": 224, 699 | "cd92466d926d6792": 205, 700 | "e0e10f1e0db53eac": 229, 701 | "827db5ca61b5580f": 253, 702 | "827dbccaa572188f": 244, 703 | "8a4a742535b5cd9b": 258, 704 | "e7989e8439637057": 217, 705 | "8a02b5e54a7bb7e0": 248, 706 | "8a02b5e54a3bb7e4": 247, 707 | "a9d2772cc24ab8e5": 205, 708 | "eb54846ad48b69d5": 240, 709 | "817f92d2613558af": 202, 710 | "d8935a6a453df2a4": 257, 711 | "cab63548fa852d72": 254, 712 | "c9b6724db9920f61": 205, 713 | "cded1292cb69c549": 204, 714 | "818444cdf6f339f4": 221, 715 | "daa1a556da4aa535": 259, 716 | "81cb4494f4f739e8": 232, 717 | "db312624696e6cb5": 236, 718 | "868ea1b5675ab689": 256, 719 | "e996cc6b8632391b": 224, 720 | "e996cc6986b26996": 214, 721 | "a9d26734c24abce5": 203, 722 | "edb6924d8c9b3164": 198, 723 | "896dd69236e5092f": 209, 724 | "89867961366b86bb": 224, 725 | "c9e925b5c94bca49": 236, 726 | "eb659535d871c41a": 228, 727 | "ebb6928c99496966": 221, 728 | "81c97494e6733be8": 230, 729 | "b939f7d292b2400f": 201, 730 | "e9db3734825a88e5": 221, 731 | "d8935a6a5519f2a5": 253, 732 | "caa114b45b5a67b5": 240, 733 | "c9ac16d22d69763c": 212, 734 | "fa6a955aa965d203": 259, 735 | "aa3eb5b062b0b393": 243, 736 | "8081658ecaf7b9f8": 253, 737 | "ad52d2a96dd2923a": 201, 738 | "daad2dc23568633c": 248, 739 | "f92724b4b7664962": 232, 740 | "f9daccb5a492380b": 231, 741 | "b23965e3c99d9215": 241, 742 | "c5b81252f84f38b7": 208, 743 | "c9ad254a9535da55": 242, 744 | "c8ad255a8d35da4d": 251, 745 | "f29a8db14a5a3c95": 251, 746 | "f25accb1a5b4385a": 250, 747 | "c1361dc966b459e5": 232, 748 | "ed13926d36926d4c": 209, 749 | "c7b8254af8c630b7": 254, 750 | "ef26d029c6cb29f0": 217, 751 | "9a39f5e44a72a487": 244, 752 | "c9b63444fbc21e74": 233, 753 | "b23b65e1c8cf9215": 241, 754 | "8180568cedf7b2ec": 215, 755 | "8b4b34b4307b4b9b": 230, 756 | "caae3d740bd1e4c1": 242, 757 | "8a5a95a46ce955b5": 205, 758 | "ca61b596964ae935": 218, 759 | "9a4935721ab58d9b": 262, 760 | "fda62cadb2648d12": 196, 761 | "817eb6cb6932980f": 221, 762 | "cd7ab40f4a5395a4": 215, 763 | "8a35f50a3ef50a3a": 248, 764 | "c9b6704db6c30e72": 216, 765 | "db30666d33646cb2": 205, 766 | "e998cc92c66b691b": 219, 767 | "d8935a6a551ae3a5": 237, 768 | "e9d2372cca1a98e5": 223, 769 | "ca21b537ca4ab535": 236, 770 | "e0e1161b0db73eac": 228, 771 | "e7989e8c3823686f": 208, 772 | "8976d4896bd4953a": 222, 773 | "e992372ec29a89e5": 228, 774 | "9930ffe9b469c007": 220, 775 | "edb6d24d98896532": 208, 776 | "e2cd4bb28d58a44f": 253, 777 | "f96a94d2a965d243": 223, 778 | "c97eb54b4e5115a4": 229, 779 | "ebe795259279841a": 211, 780 | "db960dc31669633c": 210, 781 | "868fa1b7634ab784": 237, 782 | "d893526a551ceba5": 233, 783 | "eab79448d8993762": 245, 784 | "817e3ccde225982f": 199, 785 | "ab3df4b232316361": 205, 786 | "e1e10e1e0e373eac": 216, 787 | "daa5a55a954a7835": 245, 788 | "a90bb6c6496977c8": 215, 789 | "807eb495e533584f": 238, 790 | "e0e10f1a2d1b3ebc": 248, 791 | "e7989e84386b684f": 225, 792 | "ab3db4b060697393": 216, 793 | "abf4906b94244bb7": 237, 794 | "e7989f84386b6057": 234, 795 | "c0361dcb76b549a5": 235, 796 | "827eb585e5325a0f": 250, 797 | "ea1bb5a5625a6585": 244, 798 | "e99e84634bb6384b": 226, 799 | "fd6a94d2a925d443": 200, 800 | "8a52b5ad7a5289b5": 255, 801 | "c99e16c12d32673d": 213, 802 | "c9b67249b4920f75": 225, 803 | "e9da6734821a99e5": 224, 804 | "c598126dfac238b7": 203, 805 | "edb592989c496566": 204, 806 | "c8ca25b5ad35d24b": 251, 807 | "c9c5b6a46909b6da": 218, 808 | "e2cd43728d58a0ef": 252, 809 | "e996916e71949369": 228, 810 | "f86ab5d16965d403": 255, 811 | "e9da9924b58c9369": 237, 812 | "9931f7e868b4c44b": 219, 813 | "daad25d2182d735a": 249, 814 | "ba3eb5b430527293": 248, 815 | "af8690bb6352b689": 212, 816 | "ea35954ab5b34b84": 248, 817 | "9b31f7ea68b4404b": 236, 818 | "9a31f7caf4b54007": 241, 819 | "c7980365fdc63833": 248, 820 | "ca2ed921e78738f0": 255, 821 | "cab6356a0bb5e4c1": 236, 822 | "e7d89e84b4a76047": 241, 823 | "cab23505fad20e75": 250, 824 | "e8d22534ca1abde5": 258, 825 | "aab5f47a34b06391": 239, 826 | "ca2f9125c3cb38f1": 250, 827 | "817dbcd2e2b2182f": 205, 828 | "c9ed16d349399649": 218, 829 | "d06a3d9d66ca58a5": 247, 830 | "cded1292d96de448": 198, 831 | "caaa7505b5960b6b": 243, 832 | "cded1292d229ed49": 200, 833 | "c99e16c12d3a673c": 212, 834 | "817eb4cb6ab4184f": 236, 835 | "a8d27724c25abce5": 199, 836 | "e7989f823c636067": 245, 837 | "ebb592949c496566": 214, 838 | "eda5da88989b2566": 200, 839 | "d06a0f9d37a558c5": 246, 840 | "f96a95db6925d202": 239, 841 | "c1321f8966b659e5": 217, 842 | "e7989ec83827684f": 221, 843 | "cab62505fad20e75": 264, 844 | "c9b6724db6830e72": 214, 845 | "a97b9424496bcdb2": 229, 846 | "8a0ab5a5957b5ad8": 254, 847 | "8dca72651273cd9a": 193, 848 | "caa47d7a0bb5e0c1": 257, 849 | "8a52f5a52dd25a3a": 249, 850 | "cd92126d13926d7b": 201, 851 | "aa3eb4b062b2b393": 237, 852 | "818074caebf5b1ea": 233, 853 | "cb2f902343cb39f1": 233, 854 | "ad167569926976c8": 209, 855 | "e9569629cd8276c9": 211, 856 | "ea13b52d5a52a5a5": 255, 857 | "8180748eeaf3b5f8": 234, 858 | "cb2d79728a95e4c1": 215, 859 | "caa5a55ac60be935": 248, 860 | "f2daccb5a592384a": 243, 861 | "81c94496f6f639e8": 207, 862 | "c9e936969239e949": 218, 863 | "ab3df0b260617393": 196, 864 | "8f8f21b63750a789": 225, 865 | "c0361dcb76b449e5": 232, 866 | "e7989e84bd27604b": 254, 867 | "e7989e843923706f": 208, 868 | "e896994ab5cc532d": 252, 869 | "a976d2896dd4923a": 207, 870 | "da31676e65244c79": 257, 871 | "8f8621db575aa788": 228, 872 | "fa6ab5d16945d023": 253, 873 | "eb179449b4736994": 229, 874 | "8b74f40b2cf40b7a": 237, 875 | "cb2f9103e78578f0": 240, 876 | "abb67c303261b393": 210, 877 | "ed13924c6d3393cc": 203, 878 | "aa7a91a59d624a73": 250, 879 | "cbb4164b37b44b92": 225, 880 | "cde5569292926d6a": 200, 881 | "cbad16d22969723c": 215, 882 | "ca2fd903e78318f1": 255, 883 | "e8d22536ca1abce5": 250, 884 | "f8a52c8ab5529d72": 256, 885 | "e992772cc24ab8e5": 214, 886 | "8a5a95a52aea55b5": 206, 887 | "c9a52b4b954b9555": 229, 888 | "ea13952c6a5bb594": 239, 889 | "fa9a8db5c54a5819": 243, 890 | "caae3d740bd3e0c1": 242, 891 | "b33846e9dc8d5a15": 225, 892 | "8a857262357a8dbb": 241, 893 | "e19cce92656d3992": 204, 894 | "c97eb44f4ad115a4": 224, 895 | "db30666d636c6c13": 204, 896 | "ed969b6cb448932c": 217, 897 | "b939f3e66c619083": 200, 898 | "a78fb0966749a788": 217, 899 | "dbb604c31669633e": 216, 900 | "c16b1f9236a159e5": 218, 901 | "ab06b6c949b3b6c8": 221, 902 | "d8d352ea451ae3a5": 211, 903 | "e0cb53b4cf18e04f": 238, 904 | "db393664696c6c31": 220, 905 | "ebb69249989b6166": 218, 906 | "ed12986d966b6994": 206, 907 | "ec929925b55a9369": 261, 908 | "f92625b5f3424972": 241, 909 | "ad69923692b6c963": 214, 910 | "a9d23716c24aade5": 207, 911 | "cfb679688ba5e0c0": 211, 912 | "ad769269c8b6c923": 219, 913 | "eae595349d70c41b": 251, 914 | "da85e4cab54ab495": 243, 915 | "b939f3f26c65c003": 194, 916 | "8a5a95a42aeb55b5": 213, 917 | "b23946e3dd8d1a15": 245, 918 | "c2a54652b55aa7b3": 252, 919 | "e0e1161e0d6b7eac": 225, 920 | "cfae72720be5e0c0": 202, 921 | "db31266c6964e479": 233, 922 | "b33946e0cdcd9a15": 223, 923 | "ea5b95a5b4134b4c": 240, 924 | "ea5b95a5365a4b84": 245, 925 | "b23946e3dd8d5215": 243, 926 | "b33b46e1c9cd9215": 230, 927 | "eb54846bd48379d1": 239, 928 | "da31674e6d644ca5": 264, 929 | "e2b5da489d5b2526": 261, 930 | "868ea1b5675ab788": 244, 931 | "e2dd5562cd34604f": 243, 932 | "8f8621db375aaf80": 230, 933 | "e9568c69d60b74c9": 222, 934 | "f8262dadb3465872": 264, 935 | "ed13964c6d93968c": 214, 936 | "d8935aea551ab1a5": 258, 937 | "c865b592d24aed35": 201, 938 | "aaf5926ab562c833": 245, 939 | "c9e4264b943bcb55": 226, 940 | "fa6a95d1a965d242": 249, 941 | "8b4b34b4307b49bb": 236, 942 | "c9a116f2691a967b": 215, 943 | "c9f41669d236c94d": 221, 944 | "e7989e883927606f": 219, 945 | "cab5424ab55b26b6": 238, 946 | "e8da3734c05ad8e5": 235, 947 | "8916d62936d749b6": 214, 948 | "cab4a54b964ae935": 229, 949 | "c5b90256fcc238b7": 226, 950 | "9931f7e9b0b44907": 226, 951 | "fa5accb5a5b4380a": 245, 952 | "f9a4248bb666c936": 234, 953 | "8d4d12b22d6dcd9a": 199, 954 | "a9f6926b942449b7": 228, 955 | "8a5895a66aad55b5": 253, 956 | "b23b65a1d9cb9215": 252, 957 | "ea65b534daf1841a": 258, 958 | "f86a95db6965d402": 240, 959 | "e9d21734c95a98e5": 204, 960 | "e0e1161e0b373ebc": 236, 961 | "f96a96d26965d203": 211, 962 | "ea13b56c5a52a58d": 251, 963 | "8e8e21b5675aaf88": 240, 964 | "daca25b53568623e": 245, 965 | "ebe5b52d9471441a": 234, 966 | "8a02b5a5587b7eac": 253, 967 | "9913f7ed78b2400b": 208, 968 | "a78790976752b788": 206, 969 | "e0f30f1d0b253e96": 201, 970 | "cab67d6a0bb5e0c0": 244, 971 | "c9e934b44b4bb455": 234, 972 | "8b847b60347b85bb": 237, 973 | "cab63544fac22d65": 248, 974 | "c16a1f9c76e94985": 225, 975 | "cc90b36dd25a2d35": 197, 976 | "e8966736c04abce5": 234, 977 | "b13a47e1dccd9215": 219, 978 | "c16a1e896fb618e5": 216, 979 | "da38666d65246c79": 256, 980 | "ea17954a62b7694c": 241, 981 | "ab3df4b232716341": 219, 982 | "c9b0b66dca1aa935": 217, 983 | "e9de5369d6106847": 214, 984 | "eb13940c6b5bb594": 225, 985 | "ebe5952d9479841a": 226, 986 | "80c265b5ea7239f5": 246, 987 | "f96a94d2a965d04b": 220, 988 | "aa35b57262b1334b": 242, 989 | "c9ed244bd135ca55": 236, 990 | "ebe595259671c41a": 213, 991 | "e896916e5a8c9769": 245, 992 | "ca2a7d348fd5e0c1": 246, 993 | "da058c7ab5827dc5": 262, 994 | "cded1296c9699649": 211, 995 | "da85b54ab3a54a5a": 244, 996 | "e7989f84bd23604b": 251, 997 | "e0e30f1c2d371e2e": 242, 998 | "c7b4024bfcc238b7": 224, 999 | "eb4b9494b43369cc": 228, 1000 | "968d70703d528dbb": 263, 1001 | "cb74b50a4e5b95a4": 234, 1002 | "fb9684434bb6381b": 229, 1003 | "ad7f9227496492b2": 209, 1004 | "f925a4b4736a4936": 227, 1005 | "fa2625ad7252d872": 252, 1006 | "cd7bb4164a5915a6": 223, 1007 | "cb85b4864b95b55a": 241, 1008 | "8a35f50a6af50b3a": 237, 1009 | "8a5af5a52aca0b3e": 245, 1010 | "8d4932b62969cf9a": 209, 1011 | "817eb4c46b329c8f": 231, 1012 | "c9e146929696676b": 211, 1013 | "aa7a94a59d624a73": 242, 1014 | "f966945ba965d212": 231, 1015 | "cdb67244ed831a72": 203, 1016 | "fa6a94d9a965d242": 260, 1017 | "e7989e843963704f": 213, 1018 | "8687219b774ab789": 239, 1019 | "e8cb54b4cb58a44f": 224, 1020 | "db54a529d28a75c5": 257, 1021 | "cded1292c9699659": 211, 1022 | "e94d8c32d69275c9": 218, 1023 | "caa5344a1bb56b5a": 238, 1024 | "f9a42da9b6699432": 227, 1025 | "a916b66990b36fc8": 213, 1026 | "da31256c6b246c7b": 260, 1027 | "cd79b5164a5935a4": 211, 1028 | "cdb67244ed821a73": 203, 1029 | "ca3a79748fb5e0c0": 251, 1030 | "8dc5b696696da292": 209, 1031 | "808565cae6f53af8": 253, 1032 | "9939f7f4b460484b": 230, 1033 | "ea6395359d71c41a": 248, 1034 | "eda6242d72964d72": 210, 1035 | "b23947c3dd8d5215": 250, 1036 | "808565dae5f33ae4": 254, 1037 | "f925a5a96a669532": 236, 1038 | "c7b80256fcc238b7": 225, 1039 | "e7989ec8b8236857": 216, 1040 | "befdd262ad428522": 261, 1041 | "868ea1b5475a97a9": 254, 1042 | "f99e84736bb23049": 226, 1043 | "8f8f21963790b789": 227, 1044 | "c2a125d25a3fa57a": 254, 1045 | "e2cd49728d18e0ef": 263, 1046 | "c7bc024bf8c238b7": 237, 1047 | "aa7a95a59d624a72": 253, 1048 | "8d4936b612714dbb": 210, 1049 | "ca69b596964aa935": 226, 1050 | "aab57c7034723393": 235, 1051 | "896dd49236d6913e": 206, 1052 | "caae357a0b95e4c1": 237, 1053 | "c9ed1669c9369649": 223, 1054 | "9a39f5e45a72c407": 249, 1055 | "c97bb5064e5195a6": 229, 1056 | "c97ab5244e51956e": 233, 1057 | "cab23505bdd20e75": 256, 1058 | "8a5a95a5689a55bd": 203, 1059 | "f9a52c8ab5429d36": 247, 1060 | "aa3eb4b06272b393": 237, 1061 | "8f8621fb5658af88": 222, 1062 | "bab57c7234523391": 255, 1063 | "c6b82567f84238b7": 254, 1064 | "db8b24d63469633a": 229, 1065 | "cb85b54ab5896ad2": 235, 1066 | "c1324fc936e95995": 210, 1067 | "923b65a1cdcf5215": 253, 1068 | "8a5a95a52cca55bd": 252, 1069 | "894936b62969cf9a": 217, 1070 | "c7b8124bf8c238b7": 224, 1071 | "cac207b5b57a4a5a": 245, 1072 | "da85b5825aa5b55a": 249, 1073 | "db30666d676c4c31": 218, 1074 | "8f87a19b43d0b789": 234, 1075 | "cb2f902343cb35f1": 229, 1076 | "cab47d6a0bb5e0c1": 240, 1077 | "dbac34c30b69353c": 235, 1078 | "ce2ed921e7831af0": 255, 1079 | "8a35b50a6af50b7a": 251, 1080 | "d0255f9a27c239e5": 254, 1081 | "cab5144a1bb56b5a": 237, 1082 | "abb4f47a30b06393": 237, 1083 | "8d92366d1271c9bb": 215, 1084 | "808546dee57239fc": 256, 1085 | "c53a1f89679258e5": 209, 1086 | "c5b81256f84b38b7": 222, 1087 | "c9ab3614b9cb0b74": 223, 1088 | "fa6ab55aa925d203": 255, 1089 | "8a5a95a5689e55b9": 222, 1090 | "817fb6d26035492f": 206, 1091 | "8a05754a957b7ab4": 244, 1092 | "cbb678688f95e0c1": 216, 1093 | "c9924e699669b6d2": 214, 1094 | "8a5a95a568ca55bd": 216, 1095 | "817fb6d66131580f": 218, 1096 | "ad7a926d49b29265": 201, 1097 | "8a8d727235528dbd": 255, 1098 | "da31256c6b64ec69": 247, 1099 | "81815696ef6939f4": 218, 1100 | "daad25d21c2d631e": 252, 1101 | "a954963bcd8b74d0": 209, 1102 | "db3926a6696c6c61": 217, 1103 | "e44d4bb2db12a44f": 197, 1104 | "8180748ecaf7b5f8": 233, 1105 | "a78621fd535aa788": 203, 1106 | "caae3d780bd5e4c0": 244, 1107 | "d06e2d9a76a519c5": 252, 1108 | "cdec126dda12e951": 208, 1109 | "c7bc024efd4230b7": 258, 1110 | "c7b81647f8c230b7": 230, 1111 | "c5b0036bfa4b30b7": 218, 1112 | "c8d352ea491eb2ad": 222, 1113 | "c5b81252f94e38b7": 204, 1114 | "cdb42b6992699659": 217, 1115 | "817fbcd4e430584f": 233, 1116 | "ebb6924989993566": 220, 1117 | "cac205b5b57b4a5a": 247, 1118 | "b23946e9dd8d9215": 236, 1119 | "caa63d7a0bb5e4c0": 258, 1120 | "9a31f7cab4b54087": 248, 1121 | "cab63544fa822d75": 246, 1122 | "ed252492b2f64d63": 207, 1123 | "cded1292c96de449": 197, 1124 | "ea65b535de70441a": 254, 1125 | "c969b596964aa935": 214, 1126 | "818056cde6f639e9": 214, 1127 | "dbac34c30a2c773c": 234, 1128 | "ed1b929a6d6b2194": 202, 1129 | "db31366c6964e469": 220, 1130 | } 1131 | -------------------------------------------------------------------------------- /internal/utils/encryption.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "bytes" 5 | "crypto/aes" 6 | "crypto/cipher" 7 | "crypto/md5" 8 | "crypto/rand" 9 | "crypto/rsa" 10 | "encoding/hex" 11 | "math/big" 12 | mathrand "math/rand" 13 | "time" 14 | ) 15 | 16 | func Md5(text string) string { 17 | hash := md5.Sum([]byte(text)) 18 | return hex.EncodeToString(hash[:]) 19 | } 20 | 21 | func guidPart() string { 22 | b := make([]byte, 2) 23 | 24 | if _, err := rand.Read(b); err != nil { 25 | return "" 26 | } 27 | return hex.EncodeToString(b) 28 | } 29 | 30 | func GetGuid() string { 31 | return guidPart() + guidPart() + guidPart() + guidPart() 32 | } 33 | 34 | func aesEncrypt(text, secKey string, iv []byte) (string, error) { 35 | block, err := aes.NewCipher([]byte(secKey)) 36 | if err != nil { 37 | return "", err 38 | } 39 | paddedText := pkcs7Padding([]byte(text), block.BlockSize()) 40 | ciphertext := make([]byte, len(paddedText)) 41 | mode := cipher.NewCBCEncrypter(block, iv) 42 | mode.CryptBlocks(ciphertext, paddedText) 43 | 44 | return hex.EncodeToString(ciphertext), nil 45 | } 46 | 47 | func pkcs7Padding(data []byte, blockSize int) []byte { 48 | padding := blockSize - len(data)%blockSize 49 | padText := bytes.Repeat([]byte{byte(padding)}, padding) 50 | return append(data, padText...) 51 | } 52 | 53 | func rsaEncrypt(data string) (string, error) { 54 | eStr := "10001" 55 | e := new(big.Int) 56 | e.SetString(eStr, 16) 57 | 58 | nStr := "00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81" 59 | n := new(big.Int) 60 | n.SetString(nStr, 16) 61 | 62 | pubKey := rsa.PublicKey{ 63 | N: n, 64 | E: int(e.Int64()), 65 | } 66 | 67 | encrypted, err := rsa.EncryptPKCS1v15(rand.Reader, &pubKey, []byte(data)) 68 | 69 | if err != nil { 70 | return "", err 71 | } 72 | 73 | return hex.EncodeToString(encrypted), nil 74 | } 75 | 76 | func EncryptPayload(data string) (string, error) { 77 | newg := GetGuid() 78 | 79 | cipherText, err := rsaEncrypt(newg) 80 | 81 | if err != nil { 82 | return "", err 83 | } 84 | 85 | encr, err := aesEncrypt(data, newg, []byte("0000000000000000")) 86 | 87 | if err != nil { 88 | return "", err 89 | } 90 | 91 | return (encr + cipherText), nil 92 | } 93 | 94 | func GetRandom() int64 { 95 | return int64(mathrand.Float64()*10000) + time.Now().UnixMilli() 96 | } 97 | -------------------------------------------------------------------------------- /internal/utils/marshal.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "encoding/json" 5 | ) 6 | 7 | func HardMarshal[T string | []byte](data any) T { 8 | marshaled, _ := json.Marshal(data) 9 | return T(marshaled) 10 | } 11 | -------------------------------------------------------------------------------- /internal/utils/params.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "net/url" 4 | 5 | func Params(input map[string]string) string { 6 | values := url.Values{} 7 | 8 | for k, v := range input { 9 | values.Set(k, v) 10 | } 11 | 12 | return values.Encode() 13 | } 14 | -------------------------------------------------------------------------------- /new.go: -------------------------------------------------------------------------------- 1 | package geetest 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/vimbing/geetest-solver/internal/utils" 7 | 8 | "github.com/vimbing/http" 9 | ) 10 | 11 | func New(captchaId string) *Solver { 12 | return &Solver{ 13 | httpClient: http.Init(), 14 | captchaId: captchaId, 15 | callbackName: fmt.Sprintf("geetest_%d", utils.GetRandom()), 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /payloads.go: -------------------------------------------------------------------------------- 1 | package geetest 2 | 3 | type payloadW struct { 4 | DeviceID string `json:"device_id"` 5 | Em em `json:"em"` 6 | Ep string `json:"ep"` 7 | GeeGuard any `json:"gee_guard"` 8 | Geetest string `json:"geetest"` 9 | Jkvg string `json:"jkvg"` 10 | Lang string `json:"lang"` 11 | LotNumber string `json:"lot_number"` 12 | Passtime int `json:"passtime"` 13 | PowMsg string `json:"pow_msg"` 14 | PowSign string `json:"pow_sign"` 15 | SetLeft int `json:"setLeft"` 16 | Userresponse float64 `json:"userresponse"` 17 | Yeg6 string `json:"yeg6"` 18 | } 19 | -------------------------------------------------------------------------------- /responses.go: -------------------------------------------------------------------------------- 1 | package geetest 2 | 3 | type responseGeneric struct { 4 | Status string `json:"status"` 5 | } 6 | 7 | type responseLoad struct { 8 | Status string `json:"status"` 9 | Data struct { 10 | LotNumber string `json:"lot_number"` 11 | CaptchaType string `json:"captcha_type"` 12 | Slice string `json:"slice"` 13 | Bg string `json:"bg"` 14 | Ypos int `json:"ypos"` 15 | Arrow string `json:"arrow"` 16 | Js string `json:"js"` 17 | CSS string `json:"css"` 18 | StaticPath string `json:"static_path"` 19 | GctPath string `json:"gct_path"` 20 | ShowVoice bool `json:"show_voice"` 21 | Feedback string `json:"feedback"` 22 | Logo bool `json:"logo"` 23 | Pt string `json:"pt"` 24 | CaptchaMode string `json:"captcha_mode"` 25 | Guard bool `json:"guard"` 26 | CheckDevice bool `json:"check_device"` 27 | Language string `json:"language"` 28 | CustomTheme struct { 29 | Style string `json:"_style"` 30 | Color string `json:"_color"` 31 | Gradient string `json:"_gradient"` 32 | Hover string `json:"_hover"` 33 | Brightness string `json:"_brightness"` 34 | Radius string `json:"_radius"` 35 | } `json:"custom_theme"` 36 | PowDetail struct { 37 | Version string `json:"version"` 38 | Bits int `json:"bits"` 39 | Datetime string `json:"datetime"` 40 | Hashfunc string `json:"hashfunc"` 41 | } `json:"pow_detail"` 42 | Payload string `json:"payload"` 43 | ProcessToken string `json:"process_token"` 44 | PayloadProtocol int `json:"payload_protocol"` 45 | } `json:"data"` 46 | } 47 | 48 | type responseVerify struct { 49 | Status string `json:"status"` 50 | Data struct { 51 | LotNumber string `json:"lot_number"` 52 | Result string `json:"result"` 53 | FailCount int `json:"fail_count"` 54 | Seccode struct { 55 | CaptchaID string `json:"captcha_id"` 56 | LotNumber string `json:"lot_number"` 57 | PassToken string `json:"pass_token"` 58 | GenTime string `json:"gen_time"` 59 | CaptchaOutput string `json:"captcha_output"` 60 | } `json:"seccode"` 61 | Score string `json:"score"` 62 | Payload string `json:"payload"` 63 | ProcessToken string `json:"process_token"` 64 | PayloadProtocol int `json:"payload_protocol"` 65 | } `json:"data"` 66 | } 67 | -------------------------------------------------------------------------------- /solver.go: -------------------------------------------------------------------------------- 1 | package geetest 2 | 3 | import ( 4 | "bytes" 5 | "encoding/base64" 6 | "encoding/json" 7 | "fmt" 8 | "image/png" 9 | "math/rand" 10 | "regexp" 11 | 12 | "github.com/vimbing/geetest-solver/internal/utils" 13 | 14 | "github.com/corona10/goimagehash" 15 | "github.com/google/uuid" 16 | fhttp "github.com/vimbing/fhttp" 17 | "github.com/vimbing/gorand" 18 | "github.com/vimbing/http" 19 | ) 20 | 21 | func (s *Solver) unmarshalRes(res *http.Response, out any) { 22 | parsedBody := s.parseGeetestBody(res.BodyString()) 23 | json.Unmarshal([]byte(parsedBody), &out) 24 | } 25 | 26 | func (s *Solver) responseValid(res *http.Response) error { 27 | if res.StatusCode() != 200 { 28 | return ErrResponseInvalid 29 | } 30 | 31 | var resJson responseGeneric 32 | s.unmarshalRes(res, &resJson) 33 | 34 | if resJson.Status == "success" { 35 | return nil 36 | } 37 | 38 | return ErrResponseInvalid 39 | } 40 | 41 | func (s *Solver) parseGeetestBody(body string) string { 42 | re := regexp.MustCompile(`geetest_\d+\(`) 43 | part1 := re.ReplaceAllString(body, "") 44 | return part1[:len(part1)-1] 45 | } 46 | 47 | func (s *Solver) headers() fhttp.Header { 48 | return fhttp.Header{ 49 | "accept": {"*/*"}, 50 | "accept-language": {"pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,de;q=0.5"}, 51 | "dnt": {"1"}, 52 | "sec-ch-ua": {`"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"`}, 53 | "sec-ch-ua-mobile": {"?0"}, 54 | "sec-ch-ua-platform": {`"Linux"`}, 55 | "sec-fetch-dest": {"script"}, 56 | "sec-fetch-mode": {"no-cors"}, 57 | "sec-fetch-site": {"cross-site"}, 58 | "user-agent": {"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"}, 59 | } 60 | } 61 | 62 | func (s *Solver) urlWithParams(url string, params map[string]string) string { 63 | return fmt.Sprintf("%s?%s", url, utils.Params(params)) 64 | } 65 | 66 | func (s *Solver) getImageSetLeft(bg string) (int, error) { 67 | res, err := s.httpClient.Get(fmt.Sprintf("https://static.geetest.com/%s", bg), s.headers()) 68 | 69 | if err != nil { 70 | return 0, err 71 | } 72 | 73 | img, err := png.Decode(bytes.NewReader(res.Body)) 74 | 75 | if err != nil { 76 | return 0, err 77 | } 78 | 79 | hash, err := goimagehash.PerceptionHash(img) 80 | 81 | if err != nil { 82 | return 0, err 83 | } 84 | 85 | if len(hash.ToString()) < 3 { 86 | return 0, ErrImageNotRecognized 87 | } 88 | 89 | setLeft, ok := imageIndex[hash.ToString()[2:]] 90 | 91 | if !ok { 92 | return 0, ErrImageNotRecognized 93 | } 94 | 95 | return (setLeft - 41), nil 96 | } 97 | 98 | func (s *Solver) load() (loadData, error) { 99 | res, err := s.httpClient.Get( 100 | s.urlWithParams( 101 | "https://gcaptcha4.geetest.com/load", 102 | map[string]string{ 103 | "captcha_id": s.captchaId, 104 | "challenge": uuid.NewString(), 105 | "client_type": "web", 106 | "lang": "pl", 107 | "callback": s.callbackName, 108 | }, 109 | ), 110 | s.headers(), 111 | ) 112 | 113 | if err != nil { 114 | return loadData{}, err 115 | } 116 | 117 | if err := s.responseValid(res); err != nil { 118 | return loadData{}, err 119 | } 120 | 121 | var resJson responseLoad 122 | s.unmarshalRes(res, &resJson) 123 | 124 | powMsg := fmt.Sprintf( 125 | "1|0|md5|%s|%s|%s||%s", 126 | resJson.Data.PowDetail.Datetime, 127 | s.captchaId, 128 | resJson.Data.LotNumber, 129 | utils.GetGuid(), 130 | ) 131 | 132 | imgSetLeft, err := s.getImageSetLeft(resJson.Data.Bg) 133 | 134 | if err != nil { 135 | return loadData{}, err 136 | } 137 | 138 | return loadData{ 139 | w: payloadW{ 140 | DeviceID: utils.Md5(fmt.Sprint(rand.Float64())), 141 | Em: em{ 142 | Ph: 0, 143 | Cp: 0, 144 | Ek: "11", 145 | Wd: 1, 146 | Nt: 0, 147 | Si: 0, 148 | Sc: 0, 149 | }, 150 | Ep: "123", 151 | GeeGuard: nil, 152 | Geetest: "captcha", 153 | Jkvg: "342414482", 154 | Lang: "zh", 155 | LotNumber: resJson.Data.LotNumber, 156 | Passtime: gorand.RandomInt(500, 700), 157 | PowMsg: powMsg, 158 | PowSign: utils.Md5(powMsg), 159 | SetLeft: imgSetLeft, 160 | Userresponse: float64(imgSetLeft) + rand.Float64(), 161 | Yeg6: "d6w9", 162 | }, 163 | payload: resJson.Data.Payload, 164 | processToken: resJson.Data.ProcessToken, 165 | }, nil 166 | } 167 | 168 | func (s *Solver) verify(lData loadData) (string, error) { 169 | encryptedW, err := utils.EncryptPayload(utils.HardMarshal[string](lData.w)) 170 | 171 | if err != nil { 172 | return "", err 173 | } 174 | 175 | res, err := s.httpClient.Get( 176 | s.urlWithParams( 177 | "https://gcaptcha4.geetest.com/verify", 178 | map[string]string{ 179 | "callback": s.callbackName, 180 | "captcha_id": s.captchaId, 181 | "client_type": "web", 182 | "lot_number": lData.w.LotNumber, 183 | "payload": lData.payload, 184 | "process_token": lData.processToken, 185 | "payload_protocol": "1", 186 | "pt": "1", 187 | "w": encryptedW, 188 | }, 189 | ), 190 | s.headers(), 191 | ) 192 | 193 | if err != nil { 194 | return "", err 195 | } 196 | 197 | if err := s.responseValid(res); err != nil { 198 | return "", err 199 | } 200 | 201 | var resJson responseVerify 202 | s.unmarshalRes(res, &resJson) 203 | 204 | secCodeString, err := json.Marshal(resJson.Data.Seccode) 205 | 206 | if err != nil { 207 | return "", err 208 | } 209 | 210 | return base64.StdEncoding.EncodeToString(secCodeString), nil 211 | } 212 | 213 | func (s *Solver) Solve() (string, error) { 214 | wPayload, err := s.load() 215 | 216 | if err != nil { 217 | return "", err 218 | } 219 | 220 | return s.verify(wPayload) 221 | } 222 | -------------------------------------------------------------------------------- /types.go: -------------------------------------------------------------------------------- 1 | package geetest 2 | 3 | import "github.com/vimbing/http" 4 | 5 | type Solver struct { 6 | httpClient *http.Client 7 | captchaId string 8 | callbackName string 9 | } 10 | 11 | type em struct { 12 | Ph int `json:"ph"` 13 | Cp int `json:"cp"` 14 | Ek string `json:"ek"` 15 | Wd int `json:"wd"` 16 | Nt int `json:"nt"` 17 | Si int `json:"si"` 18 | Sc int `json:"sc"` 19 | } 20 | 21 | type loadData struct { 22 | w payloadW 23 | payload string 24 | processToken string 25 | } 26 | --------------------------------------------------------------------------------