mirror of
https://github.com/lukaszraczylo/mcp-captcharesolver.git
synced 2026-10-13 00:48:34 +00:00
- detect: recaptcha_v3 now suppresses recaptcha_v2 (hidden g-recaptcha div on v3 pages no longer mis-detected as LLM-solvable); funcaptcha drops over-broad bare "arkose" substring
- llm/gemini: stub methods return ErrUnsupported{Provider:"gemini"} so audio handler errors.As guard catches it; drop unused fmt import
- mcp/tools: remove gemini from audio capability (stub); pick audio filename (.wav/.mp3) from sniffed media type; schema notes for browser/actions no longer advertise unimplemented options
- imageutil: fetchURL uses a package client with 30s Timeout instead of http.DefaultClient
- captcha/json: extractJSON brace-counts to return the first balanced object (handles prose, markdown fences, example-before-real)
- config: remove dead CAPTCHA_LLM_TEMPERATURE / Config.Temperature; solving is fixed at temperature 0
- stealth: Action.Type doc comment drops nonexistent scroll case
39 lines
918 B
Go
39 lines
918 B
Go
package captcha
|
|
|
|
import "testing"
|
|
|
|
func TestExtractJSON(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
in string
|
|
want string
|
|
}{
|
|
{"plain", `{"text":"ab12"}`, `{"text":"ab12"}`},
|
|
{"prose wrapped", `Sure, here is the answer: {"text":"ab12"} hope it helps`, `{"text":"ab12"}`},
|
|
{
|
|
"markdown fenced",
|
|
"```json\n{\"tiles\":[1,2,3]}\n```",
|
|
`{"tiles":[1,2,3]}`,
|
|
},
|
|
{
|
|
"nested object",
|
|
`prefix {"a":{"b":1},"c":2} suffix`,
|
|
`{"a":{"b":1},"c":2}`,
|
|
},
|
|
{
|
|
"first balanced object wins",
|
|
`For example {"text":"EXAMPLE"} but the real one is {"text":"REAL"}`,
|
|
`{"text":"EXAMPLE"}`,
|
|
},
|
|
{"no brace", `no json here`, `no json here`},
|
|
{"unbalanced returns from start", `tail {"text":"x"`, `{"text":"x"`},
|
|
}
|
|
for _, tc := range tests {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
if got := extractJSON(tc.in); got != tc.want {
|
|
t.Fatalf("got %q want %q", got, tc.want)
|
|
}
|
|
})
|
|
}
|
|
}
|