{"record":{"id":"ee24930593530ba1","repo":"AlistGo/alist","slug":"can-not-get-captcha-ee2493","errorCode":null,"errorMessage":"can not get captcha","messagePattern":"can not get captcha","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/cloudreve_v4/util.go","lineNumber":145,"sourceCode":"\t\t\"email\":    d.Username,\n\t\t\"password\": d.Password,\n\t}\n\tif needCaptcha {\n\t\tvar config BasicConfigResp\n\t\terr = d.request(http.MethodGet, \"/site/config/basic\", nil, &config)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif config.CaptchaType != \"normal\" {\n\t\t\treturn fmt.Errorf(\"captcha type %s not support\", config.CaptchaType)\n\t\t}\n\t\tvar captcha CaptchaResp\n\t\terr = d.request(http.MethodGet, \"/site/captcha\", nil, &captcha)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !strings.HasPrefix(captcha.Image, \"data:image/png;base64,\") {\n\t\t\treturn errors.New(\"can not get captcha\")\n\t\t}\n\t\tloginBody[\"ticket\"] = captcha.Ticket\n\t\ti := strings.Index(captcha.Image, \",\")\n\t\tdec := base64.NewDecoder(base64.StdEncoding, strings.NewReader(captcha.Image[i+1:]))\n\t\tvRes, err := base.RestyClient.R().SetMultipartField(\n\t\t\t\"image\", \"validateCode.png\", \"image/png\", dec).\n\t\t\tPost(setting.GetStr(conf.OcrApi))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif jsoniter.Get(vRes.Body(), \"status\").ToInt() != 200 {\n\t\t\treturn errors.New(\"ocr error:\" + jsoniter.Get(vRes.Body(), \"msg\").ToString())\n\t\t}\n\t\tcaptchaCode := jsoniter.Get(vRes.Body(), \"result\").ToString()\n\t\tif captchaCode == \"\" {\n\t\t\treturn errors.New(\"ocr error: empty result\")\n\t\t}\n\t\tloginBody[\"captcha\"] = captchaCode","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/cloudreve_v4/util.go#L127-L163","documentation":"CloudreveV4 doLogin with captcha: GET /site/captcha returned a payload whose Image field does not start with 'data:image/png;base64,'. The driver cannot extract the base64 image to OCR it, so login aborts.","triggerScenarios":"config.CaptchaType == 'normal' (checked just above), the captcha request succeeds, but captcha.Image has an unexpected format — SVG data URL, JPEG prefix, empty string, or an error message in the field.","commonSituations":"Cloudrebve V4 instance configured with a non-PNG captcha renderer; version mismatch changing the data-URL mime; captcha endpoint returning an error object that unmarshals into Image as empty; proxy mangling the response.","solutions":["curl GET /site/captcha and inspect data.image — confirm it is a PNG data URL.","Disable login captcha in Cloudrebve V4 admin settings to bypass the OCR path entirely.","Align driver and server versions if the captcha format changed between releases.","If the image is empty, address the server-side captcha generation failure first."],"exampleFix":"curl -sS https://v4.example.com/api/v4/site/captcha\n# good: {\"code\":0,\"data\":{\"image\":\"data:image/png;base64,iVBOR...\",\"ticket\":\"...\"}}\n# bad:  {\"code\":0,\"data\":{\"image\":\"\",\"ticket\":\"...\"}}  -> fix server captcha or disable it","handlingStrategy":"validation","validationCode":"if !strings.HasPrefix(captcha.Image, \"data:image/png;base64,\") {\n    return errors.New(\"can not get captcha — server returned non-PNG or empty image\")\n}","typeGuard":"func isPngDataUrl(s string) bool {\n    return strings.HasPrefix(s, \"data:image/png;base64,\") && len(s) > len(\"data:image/png;base64,\")\n}","tryCatchPattern":"if err := d.doLogin(true); err != nil {\n    if err.Error() == \"can not get captcha\" {\n        // inspect /site/captcha manually; disable captcha or fix server-side generation\n        log.Printf(\"captcha payload malformed; got prefix %q\", captcha.Image[:min(30, len(captcha.Image))])\n    }\n    return err\n}","preventionTips":["Disable login captcha for headless V4 mounts","Confirm the captcha data-URL format with curl after upgrades","Keep driver/server V4 versions in lockstep"],"tags":["cloudreve-v4","captcha","login","go"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}