
Aloísio Vítor
Image Processing Expert
Publicado Nov 02, 2026
Actualizado Nov 02, 2026 · min de lectura

ErrorId de la API; un error de Go nulo no demuestra que el servicio haya tenido éxito.chromedp es una biblioteca de Go para controlar navegadores mediante el Protocolo DevTools de Chrome. Los desarrolladores la usan para pruebas de navegador y automatización sin introducir un controlador en Python o JavaScript. Cuando una tarea de navegador aprobada se encuentra con un CAPTCHA compatible, la aplicación Go puede llamar a un solver y seguir gestionando la misma página.
CapSolver proporciona un SDK oficial para Go y APIs de tareas documentadas para el paso de resolución. Esta guía conecta esas responsabilidades sin presentar la biblioteca de navegador como un solver. La verificación ejecutable usa un fixture de navegador local propio y una petición real a la API con una clave de relleno deliberadamente inválida. Verifica el cableado y el manejo de errores, no una resolución de pago.
La resolución de CAPTCHA encaja entre la recogida de los parámetros actuales del reto y la continuación de la operación de navegador que necesita el resultado.
El repositorio oficial de chromedp proporciona el controlador del navegador. Tu programa en Go abre la página permitida, lee el estado relevante y decide cuándo un reto compatible necesita tratamiento. El solver aporta su salida documentada; chromedp sigue siendo responsable de las acciones posteriores en la página.
Un CAPTCHA no es prueba de que toda operación de navegador bloqueada requiera una petición de resolución. Un campo ausente, una navegación fallida o un error de aplicación pueden requerir otra corrección. Identifica el reto real antes de elegir un tipo de tarea.
Para un formulario de QA propio, la secuencia es directa: abrir el formulario, identificar su configuración de CAPTCHA, solicitar una solución cuando corresponda, aplicarla mediante la ruta de integración esperada por la aplicación y comprobar la confirmación del formulario. Esta guía no proporciona un callback universal ni un script de envío para sitios web arbitrarios.
Usa un módulo de Go aislado y dependencias fijadas para que las llamadas de API del artículo coincidan con tu build.
El entorno comprobado usó Go 1.27.3, github.com/chromedp/chromedp@v0.21.0 y github.com/capsolver/capsolver-go@v0.0.0-20251204081438-e4e07af23eae. Chrome estaba instalado localmente y se lanzó en un contexto de navegador temporal separado.
Crea un directorio de trabajo, inicializa su módulo con go mod init captcha-browser-check, y luego ejecuta:
go get github.com/chromedp/chromedp@v0.21.0 github.com/capsolver/capsolver-go@v0.0.0-20251204081438-e4e07af23eae
Las notas de la versión v0.21.0 indican que Go 1.25 y posteriores son compatibles. Usa la documentación de esa versión al adaptar un script de navegador antiguo. Mezclar ejemplos antiguos que devuelven punteros con la API de acciones tipadas más reciente puede producir errores de compilación antes de que se ejecute cualquier petición de navegador o solver.
La documentación oficial de la API de balance incluye el método Balance() del SDK de Go. Una llamada de balance es útil para separar el acceso a cuenta/API de la resolución específica de retos. No crea una tarea de CAPTCHA.
Ejecuta una pequeña comprobación que demuestre que Chrome puede leer una página propia y que el SDK de Go puede recibir una respuesta real de la API.
Guarda esto como main.go y ejecuta go run . desde el módulo inicializado. El atributo local FIXTURE_ONLY es datos de prueba, no un sitekey real. La clave de la API es deliberadamente inválida y el programa espera que el servicio la rechace.
package main
import (
"context"
"fmt"
"log"
"net/http"
"net/http/httptest"
"time"
"github.com/chromedp/chromedp"
capsolver "github.com/capsolver/capsolver-go"
)
func main() {
// Un fixture local comprueba el cableado del navegador. No es un CAPTCHA real.
fixture := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, `<title>Owned QA fixture</title><div id="widget" data-sitekey="FIXTURE_ONLY"></div>`)
}))
defer fixture.Close()
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
ctx, deadline := context.WithTimeout(ctx, 30*time.Second)
defer deadline()
if err := chromedp.Do(ctx, chromedp.Navigate(fixture.URL)); err != nil { log.Fatal(err) }
sitekey, err := chromedp.Run(ctx, chromedp.AttributeValue("#widget", "data-sitekey"))
if err != nil { log.Fatal(err) }
if !sitekey.Exists || sitekey.Value != "FIXTURE_ONLY" { log.Fatal("Fixture key not found") }; fmt.Println("Fixture key:", sitekey.Value)
// Credencial deliberadamente inválida: comprueba un error real de API, no una cuenta.
solver := capsolver.CapSolver{ApiKey: "YOUR_API_KEY"}
result, err := solver.Balance()
if err != nil { log.Fatal(err) }
fmt.Println("API error:", result.ErrorId, result.ErrorCode)
if result.ErrorId == 0 { log.Fatal("Expected the placeholder credential to be rejected") }
}
La ejecución verificada imprimió Fixture key: FIXTURE_ONLY, seguida de un error de API con ErrorId igual a 1 y ERROR_KEY_DOES_NOT_EXIST. Trata ese código exacto como la respuesta observada en esta comprobación de relleno, no como una respuesta garantizada para toda credencial inválida.
Esto establece el acceso local al navegador y una ruta real de petición-respuesta hacia la API. No se consultó ninguna cuenta real, no se resolvió ningún reto y no se realizó ningún envío de formulario.
La acción AttributeValue actual devuelve un AttributeResult que contiene el valor del atributo y un indicador de existencia.
El ejemplo comprueba ambos campos antes de continuar. Un atributo ausente debería detener la recopilación de parámetros, en vez de convertirse en un sitekey vacío en una petición de pago. Un selector que funciona en este fixture propio no es un selector universal para todas las integraciones de CAPTCHA.
El SDK comprobado puede devolver una respuesta de servicio parseada sin devolver un error de Go.
Por eso el ejemplo comprueba result.ErrorId después de manejar err. Un fallo de red, un fallo de parseo JSON y una respuesta válida que describe un error de cuenta son condiciones distintas. Lee la respuesta exacta devuelta en lugar de asumir que err == nil significa que la cuenta o la tarea tuvieron éxito.
Canjea tu código de bono de CapSolver
Aumenta tu presupuesto de automatización al instante.
Usa el código de bono CAP26 al recargar tu cuenta de CapSolver para obtener un 5% de bono adicional en cada recarga, sin límites.
Canjéalo ahora en tu Panel de CapSolver
Usa la referencia de tarea actual del CAPTCHA seleccionado para construir la petición de resolución desde la página que realmente inspeccionaste.
Para reCAPTCHA v2, la documentación oficial de la tarea especifica la familia de tareas y campos como websiteURL y websiteKey. Usa la ortografía y capitalización documentadas. No construyas un nombre de tarea de memoria ni copies un ejemplo antiguo del SDK sin comprobar el contrato actual.
El SDK oficial de Go expone Solve() para un mapa de tarea. Una implementación en producción debería proporcionar la credencial real de forma segura, pasar los parámetros actuales de la tarea e inspeccionar el resultado devuelto o el error según la versión fijada del SDK.
La comprobación de conexión anterior no es intencionalmente un programa completo de resolución de pago. Antes de desplegar el paso de resolución, ejecuta un reto permitido con tu propia cuenta financiada y valida el resultado contra la aplicación propia. Ese paso dependiente de credenciales no se ejecutó para este artículo, por lo que no se afirma ninguna tasa de éxito ni finalización de extremo a extremo.
Mantén la URL de la página, la familia del reto, la clave pública y los parámetros opcionales requeridos asociados con la misma operación de navegador. Si la navegación sustituye la página o regenera el reto, vuelve a inspeccionar las entradas antes de iniciar otro intento.
Usa la solución de la manera en que la aplicación propia lo espera y luego verifica que el comportamiento de la aplicación cambió como se pretendía.
Un resultado basado en token no es una instrucción para hacer clic en ningún botón de verificación visible. Algunas aplicaciones usan callbacks, otras vinculan el resultado a un formulario, y la validación final del lado del servidor sigue siendo importante. Consulta la implementación de la aplicación en lugar de adivinar el nombre de una callback de JavaScript.
La documentación de verificación de respuestas de Google explica el paso de verificación del lado del servidor para reCAPTCHA. Que la automatización de navegador alcance una línea de código después de la resolución no es lo mismo que que ese servidor acepte la respuesta.
Mantén la condición de éxito de tu prueba específica. Para un formulario propio, inspecciona su confirmación o registro de prueba. Para un flujo de lectura permitido, inspecciona el contenido esperado. Evita tratar un widget que desaparece como la única señal de finalización cuando la aplicación tiene un resultado más fiable.
Diagnostica el componente que falló antes de volver a ejecutar navegación, comprobaciones de cuenta y resolución juntos.
Un error de compilación apunta a compatibilidad de código y dependencias. Un fallo al iniciar el navegador apunta al ejecutable o al entorno de ejecución. Una clave ausente apunta a la inspección de página. Un error de servicio apunta a la respuesta documentada de la API. Un formulario rechazado después de una solución apunta a la aplicación del resultado y a la propia aplicación.
Para fallos en el contrato de entrada, la guía de resolución de problemas sobre invalid-task-data muestra cómo comparar la petición real con la tarea seleccionada. Más reintentos de navegador no corregirán un campo mal escrito en esa petición.
Conserva un pequeño registro de diagnóstico con las versiones de los paquetes, la etapa fallida, el identificador de tarea cuando esté disponible y la información de error redactada. No registres la clave real de la cuenta ni el token de solución completo. Al escalar, describe lo que la comprobación del navegador y la comprobación de la API establecieron por separado.
Mantén chromedp a cargo del navegador y coloca la llamada al solver documentado en el paso real del CAPTCHA. CapSolver suministra la interfaz de resolución; tu aplicación es responsable del estado de la página, las decisiones de error y la comprobación final de finalización.
P: ¿chromedp incluye resolución de CAPTCHA?
chromedp es un controlador de navegador. Este flujo agrega un servicio de resolución separado para retos compatibles encontrados durante tareas permitidas.
P: ¿El ejemplo gasta crédito del solver?
No se crea ninguna tarea de pago. El ejemplo envía una petición de balance con una clave de relleno deliberadamente inválida y comprueba el error resultante.
P: ¿Por qué la API puede rechazar una petición cuando el error de Go es nulo?
El SDK puede haber recibido y parseado correctamente una respuesta que contiene un error a nivel de servicio. Inspecciona los campos de error de la respuesta además del error de Go.
P: ¿Puedo usar FIXTURE_ONLY como mi sitekey?
No. Son datos de prueba locales usados para verificar la lectura de atributos del navegador. Una tarea de resolución real necesita la clave pública actual de la página permitida.
P: ¿Se ha probado aquí una resolución completa de CAPTCHA de pago?
No. El alcance verificado es el fixture de navegador de chromedp y un rechazo real de la API. La resolución de pago y la aceptación por una aplicación propia requieren tu cuenta y una prueba de extremo a extremo separada.

Aloísio Vítor
Image Processing Expert
Interpreting the visual signals behind web workflows.
SOBRE EL AUTOR
Aprende una arquitectura de raspado web escalable en Rust con reqwest, scraper, raspado asíncrono, raspado con navegador sin cabeza, rotación de proxies y manejo de CAPTCHA conforme.

Automatiza la resolución de CAPTCHA con Nanobot y CapSolver. Utiliza Playwright para resolver reCAPTCHA y Cloudflare autónomamente.
