Skip to content

Commit 5227ac7

Browse files
committed
Fix canonical Go examples for CI syntax check
1 parent f2388a1 commit 5227ac7

13 files changed

Lines changed: 679 additions & 111 deletions

File tree

  • articles
    • how-to-solve-bls-captcha-step-by-step/go
    • how-to-solve-cloudflare-turnstile-using-api/go
    • how-to-solve-geetest-v3-using-api/go
    • how-to-solve-geetest-v4-using-api/go
    • how-to-solve-grid-image-captcha-automatically/go
    • how-to-solve-hcaptcha-using-api/go
    • how-to-solve-recaptcha-invisible-using-api/go
    • how-to-solve-recaptcha-v2-callback-using-api/go
    • how-to-solve-recaptcha-v2-enterprise-using-api/go
    • how-to-solve-recaptcha-v2-using-api/go
    • how-to-solve-recaptcha-v3-automatically-using-api/go
    • how-to-solve-recaptcha-v3-enterprise-using-api/go
    • image-captcha-solving-using-api/go

articles/how-to-solve-bls-captcha-step-by-step/go/solve.go

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,68 @@ func requestValue(value any) string {
5050
}
5151
}
5252

53-
func getRequestString(raw json.RawMessage) string {
54-
var s string
55-
if err := json.Unmarshal(raw, &s); err == nil {
56-
return s
53+
func getRequestString(raw any) string {
54+
switch v := raw.(type) {
55+
case nil:
56+
return ""
57+
case string:
58+
return v
59+
case float64:
60+
return strconv.FormatInt(int64(v), 10)
61+
case json.Number:
62+
return v.String()
63+
case map[string]any:
64+
data, err := json.Marshal(v)
65+
if err == nil {
66+
return string(data)
67+
}
68+
case []any:
69+
data, err := json.Marshal(v)
70+
if err == nil {
71+
return string(data)
72+
}
73+
case json.RawMessage:
74+
var s string
75+
if err := json.Unmarshal(v, &s); err == nil {
76+
return s
77+
}
78+
return string(v)
79+
}
80+
return fmt.Sprintf("%v", raw)
81+
}
82+
83+
func loadEnv() map[string]string {
84+
path := filepath.Join("..", ".env")
85+
env := make(map[string]string)
86+
f, err := os.Open(path)
87+
if err != nil {
88+
return env
89+
}
90+
defer f.Close()
91+
92+
scanner := bufio.NewScanner(f)
93+
for scanner.Scan() {
94+
line := strings.TrimSpace(scanner.Text())
95+
if line == "" || strings.HasPrefix(line, "#") {
96+
continue
97+
}
98+
parts := strings.SplitN(line, "=", 2)
99+
if len(parts) == 2 {
100+
env[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
101+
}
102+
}
103+
104+
return env
105+
}
106+
107+
func getEnv(env map[string]string, key, fallback string) string {
108+
if value, ok := env[key]; ok && value != "" {
109+
return value
110+
}
111+
if value := os.Getenv(key); value != "" {
112+
return value
57113
}
58-
return string(raw)
114+
return fallback
59115
}
60116

61117
func handleError(error string) {

articles/how-to-solve-cloudflare-turnstile-using-api/go/solve.go

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,40 @@ func requestValue(value any) string {
4949
}
5050
}
5151

52+
func loadEnv() map[string]string {
53+
path := filepath.Join("..", ".env")
54+
env := make(map[string]string)
55+
f, err := os.Open(path)
56+
if err != nil {
57+
return env
58+
}
59+
defer f.Close()
60+
61+
scanner := bufio.NewScanner(f)
62+
for scanner.Scan() {
63+
line := strings.TrimSpace(scanner.Text())
64+
if line == "" || strings.HasPrefix(line, "#") {
65+
continue
66+
}
67+
parts := strings.SplitN(line, "=", 2)
68+
if len(parts) == 2 {
69+
env[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
70+
}
71+
}
72+
73+
return env
74+
}
75+
76+
func getEnv(env map[string]string, key, fallback string) string {
77+
if value, ok := env[key]; ok && value != "" {
78+
return value
79+
}
80+
if value := os.Getenv(key); value != "" {
81+
return value
82+
}
83+
return fallback
84+
}
85+
5286
func main() {
5387
env := loadEnv()
5488
apiKey := getEnv(env, "CAPTCHAAI_API_KEY", "")
@@ -96,11 +130,11 @@ func main() {
96130
json.Unmarshal(body, &submitResp)
97131

98132
if submitResp.Status != 1 {
99-
handleError(submitResp.Request)
133+
handleError(requestValue(submitResp.Request))
100134
os.Exit(1)
101135
}
102136

103-
taskID := submitResp.Request
137+
taskID := requestValue(submitResp.Request)
104138
fmt.Printf("[+] Task submitted. ID: %s\n", taskID)
105139

106140
// Poll for result
@@ -137,9 +171,10 @@ func main() {
137171
resp.Body.Close()
138172
var result apiResponse
139173
json.Unmarshal(body, &result)
174+
reqStr := requestValue(result.Request)
140175

141176
if result.Status == 1 {
142-
token := result.Request
177+
token := reqStr
143178
display := token
144179
if len(display) > 50 {
145180
display = display[:50]
@@ -152,16 +187,16 @@ func main() {
152187
return
153188
}
154189

155-
if result.Request == "CAPCHA_NOT_READY" {
190+
if reqStr == "CAPCHA_NOT_READY" {
156191
fmt.Printf("[*] Not ready yet, waiting %ds...\n", pollInterval)
157192
time.Sleep(time.Duration(pollInterval) * time.Second)
158193
elapsed += pollInterval
159194
backoff = pollInterval
160195
continue
161196
}
162197

163-
if transientErrors[result.Request] {
164-
fmt.Printf("[!] Transient error: %s, retrying in %ds...\n", result.Request, backoff)
198+
if transientErrors[reqStr] {
199+
fmt.Printf("[!] Transient error: %s, retrying in %ds...\n", reqStr, backoff)
165200
time.Sleep(time.Duration(backoff) * time.Second)
166201
elapsed += backoff
167202
if backoff < 30 {
@@ -170,13 +205,13 @@ func main() {
170205
continue
171206
}
172207

173-
if solveErrors[result.Request] {
174-
fmt.Printf("[!] Solve error: %s\n", result.Request)
208+
if solveErrors[reqStr] {
209+
fmt.Printf("[!] Solve error: %s\n", reqStr)
175210
fmt.Println(" The CAPTCHA could not be solved. Verify parameters and retry.")
176211
os.Exit(1)
177212
}
178213

179-
fmt.Printf("[!] Unexpected error: %s\n", result.Request)
214+
fmt.Printf("[!] Unexpected error: %s\n", reqStr)
180215
os.Exit(1)
181216
}
182217

articles/how-to-solve-geetest-v3-using-api/go/solve.go

Lines changed: 71 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ type apiResponse struct {
3434
Request any `json:"request"`
3535
}
3636

37+
type geetestSolution struct {
38+
GeetestChallenge string `json:"geetest_challenge"`
39+
GeetestValidate string `json:"geetest_validate"`
40+
GeetestSeccode string `json:"geetest_seccode"`
41+
}
42+
3743
func requestValue(value any) string {
3844
switch v := value.(type) {
3945
case nil:
@@ -67,12 +73,68 @@ func handleError(error string) {
6773
}
6874
}
6975

70-
func getRequestString(raw json.RawMessage) string {
71-
var s string
72-
if err := json.Unmarshal(raw, &s); err == nil {
73-
return s
76+
func getRequestString(raw any) string {
77+
switch v := raw.(type) {
78+
case nil:
79+
return ""
80+
case string:
81+
return v
82+
case float64:
83+
return strconv.FormatInt(int64(v), 10)
84+
case json.Number:
85+
return v.String()
86+
case map[string]any:
87+
data, err := json.Marshal(v)
88+
if err == nil {
89+
return string(data)
90+
}
91+
case []any:
92+
data, err := json.Marshal(v)
93+
if err == nil {
94+
return string(data)
95+
}
96+
case json.RawMessage:
97+
var s string
98+
if err := json.Unmarshal(v, &s); err == nil {
99+
return s
100+
}
101+
return string(v)
102+
}
103+
return fmt.Sprintf("%v", raw)
104+
}
105+
106+
func loadEnv() map[string]string {
107+
path := filepath.Join("..", ".env")
108+
env := make(map[string]string)
109+
f, err := os.Open(path)
110+
if err != nil {
111+
return env
112+
}
113+
defer f.Close()
114+
115+
scanner := bufio.NewScanner(f)
116+
for scanner.Scan() {
117+
line := strings.TrimSpace(scanner.Text())
118+
if line == "" || strings.HasPrefix(line, "#") {
119+
continue
120+
}
121+
parts := strings.SplitN(line, "=", 2)
122+
if len(parts) == 2 {
123+
env[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
124+
}
125+
}
126+
127+
return env
128+
}
129+
130+
func getEnv(env map[string]string, key, fallback string) string {
131+
if value, ok := env[key]; ok && value != "" {
132+
return value
133+
}
134+
if value := os.Getenv(key); value != "" {
135+
return value
74136
}
75-
return string(raw)
137+
return fallback
76138
}
77139

78140
func main() {
@@ -176,14 +238,11 @@ func main() {
176238
json.Unmarshal(body, &result)
177239

178240
if result.Status == 1 {
179-
// The request field contains a JSON object or JSON string with 3 GeeTest values
180241
var solution geetestSolution
181-
// Try parsing the request field directly as a JSON object
182-
if err := json.Unmarshal(result.Request, &solution); err != nil {
183-
// If it's a JSON string, unwrap and parse
184-
var raw string
185-
json.Unmarshal(result.Request, &raw)
186-
json.Unmarshal([]byte(raw), &solution)
242+
solutionPayload := getRequestString(result.Request)
243+
if err := json.Unmarshal([]byte(solutionPayload), &solution); err != nil {
244+
fmt.Printf("[!] Failed to parse GeeTest v3 solution: %v\n", err)
245+
os.Exit(1)
187246
}
188247
fmt.Println("[+] Solved!")
189248
fmt.Printf("[+] geetest_challenge: %s\n", solution.GeetestChallenge)

articles/how-to-solve-geetest-v4-using-api/go/solve.go

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ type apiResponse struct {
3434
Request any `json:"request"`
3535
}
3636

37+
type geetestV4Solution struct {
38+
CaptchaID string `json:"captcha_id"`
39+
LotNumber string `json:"lot_number"`
40+
PassToken string `json:"pass_token"`
41+
GenTime string `json:"gen_time"`
42+
CaptchaOutput string `json:"captcha_output"`
43+
}
44+
3745
func requestValue(value any) string {
3846
switch v := value.(type) {
3947
case nil:
@@ -67,12 +75,68 @@ func handleError(error string) {
6775
}
6876
}
6977

70-
func getRequestString(raw json.RawMessage) string {
71-
var s string
72-
if err := json.Unmarshal(raw, &s); err == nil {
73-
return s
78+
func getRequestString(raw any) string {
79+
switch v := raw.(type) {
80+
case nil:
81+
return ""
82+
case string:
83+
return v
84+
case float64:
85+
return strconv.FormatInt(int64(v), 10)
86+
case json.Number:
87+
return v.String()
88+
case map[string]any:
89+
data, err := json.Marshal(v)
90+
if err == nil {
91+
return string(data)
92+
}
93+
case []any:
94+
data, err := json.Marshal(v)
95+
if err == nil {
96+
return string(data)
97+
}
98+
case json.RawMessage:
99+
var s string
100+
if err := json.Unmarshal(v, &s); err == nil {
101+
return s
102+
}
103+
return string(v)
104+
}
105+
return fmt.Sprintf("%v", raw)
106+
}
107+
108+
func loadEnv() map[string]string {
109+
path := filepath.Join("..", ".env")
110+
env := make(map[string]string)
111+
f, err := os.Open(path)
112+
if err != nil {
113+
return env
114+
}
115+
defer f.Close()
116+
117+
scanner := bufio.NewScanner(f)
118+
for scanner.Scan() {
119+
line := strings.TrimSpace(scanner.Text())
120+
if line == "" || strings.HasPrefix(line, "#") {
121+
continue
122+
}
123+
parts := strings.SplitN(line, "=", 2)
124+
if len(parts) == 2 {
125+
env[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
126+
}
127+
}
128+
129+
return env
130+
}
131+
132+
func getEnv(env map[string]string, key, fallback string) string {
133+
if value, ok := env[key]; ok && value != "" {
134+
return value
135+
}
136+
if value := os.Getenv(key); value != "" {
137+
return value
74138
}
75-
return string(raw)
139+
return fallback
76140
}
77141

78142
func main() {
@@ -166,14 +230,11 @@ func main() {
166230
json.Unmarshal(body, &result)
167231

168232
if result.Status == 1 {
169-
// The request field contains a JSON object or JSON string with 5 GeeTest v4 values
170233
var solution geetestV4Solution
171-
// Try parsing the request field directly as a JSON object
172-
if err := json.Unmarshal(result.Request, &solution); err != nil {
173-
// If it's a JSON string, unwrap and parse
174-
var raw string
175-
json.Unmarshal(result.Request, &raw)
176-
json.Unmarshal([]byte(raw), &solution)
234+
solutionPayload := getRequestString(result.Request)
235+
if err := json.Unmarshal([]byte(solutionPayload), &solution); err != nil {
236+
fmt.Printf("[!] Failed to parse GeeTest v4 solution: %v\n", err)
237+
os.Exit(1)
177238
}
178239
fmt.Println("[+] Solved!")
179240
fmt.Printf("[+] captcha_id: %s\n", solution.CaptchaID)

0 commit comments

Comments
 (0)