Envie um token de CAPTCHA por um proxy HTTP em Go
Use um cliente HTTP Go separado para o site de destino, configurado com o proxy selecionado por solvethree.SuccessfulProxy. Envie Solution.Token com a identidade de navegador retornada. Mantenha esse transporte do destino separado do transporte da API solvethree usado pelo cliente do SDK.
Nesta página
Prepare a tarefa
- 1.
Configure o SDK Go e as credenciais
Use o módulo oficial
solvethree.com/sdk, versãov0.1.0, com Go 1.22 ou posterior. A referência de integração com Go contém detalhes de configuração. DefinaSOLVETHREE_API_KEYcom a chave de API do seu workspace e mantenha-a no servidor. DefinaSOLVETHREE_PROXYcom a URL do seu proxy HTTP ou HTTPS. - 2.
Configure o site antes da resolução
O workspace precisa de um perfil ativo para o hostname de destino. Configure o perfil do site primeiro; enviar um hostname e uma ação não cria um perfil.
- 3.
Substitua o destino do exemplo
Altere
accounts.example.com, a açãologine o endpoint da aplicação para corresponder à sua integração.Siteé um hostname, não uma URL completa. Para reCAPTCHA, forneça exatamente um entreProxyeProxyCandidates; não preencha os camposTypeouURLda tarefa. O tipo padrão de reCAPTCHA é Enterprise v3.
Envie pelo proxy que resolveu a tarefa
package main
import (
"context"
"fmt"
"log"
"os"
"net/http"
"net/url"
"strings"
"time"
solvethree "solvethree.com/sdk"
)
func main() {
client, err := solvethree.NewClient(os.Getenv("SOLVETHREE_API_KEY"), nil)
if err != nil { log.Fatal(err) }
ctx, cancel := context.WithTimeout(context.Background(), 180*time.Second)
defer cancel()
input := solvethree.TaskRequest{Site: "accounts.example.com", Action: "login", Proxy: os.Getenv("SOLVETHREE_PROXY")}
result, err := client.Solve(ctx, input, solvethree.SolveOptions{})
if err != nil { log.Fatal(err) }
fmt.Println("Ready task:", result.ID)
proxy, ok := solvethree.SuccessfulProxy(input, result)
if !ok { log.Fatal("No valid successful proxy") }
proxyURL, err := url.Parse(proxy)
if err != nil { log.Fatal(err) }
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
defer transport.CloseIdleConnections()
targetClient := &http.Client{Transport: transport, Timeout: 30*time.Second,
CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
request, err := http.NewRequestWithContext(ctx, "POST", "https://accounts.example.com/login",
strings.NewReader(url.Values{"g-recaptcha-response": {result.Solution.Token}}.Encode()))
if err != nil { log.Fatal(err) }
request.Header.Set("User-Agent", result.Solution.UserAgent)
request.Header.Set("sec-ch-ua", result.Solution.SecChUA)
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
response, err := targetClient.Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
fmt.Println("Application HTTP status:", response.StatusCode)
// Inspect the application response to determine whether submission succeeded.
}O SDK resolve a tarefa, mas não envia nada ao site. Após a resolução, o exemplo clona http.DefaultTransport e define o Proxy do clone por meio de http.ProxyURL. Apenas o targetClient separado usa esse transporte; o transporte da API do cliente do SDK permanece inalterado.
Mantenha as credenciais do proxy no componente de informações do usuário da URL. url.Parse as preserva para o transporte do proxy. Codifique em porcentagem os caracteres reservados no nome de usuário ou na senha, em vez de dividir a URL manualmente ou enviar as credenciais do proxy em um cabeçalho Authorization ao destino.
Guarde os dados de entrada originais da tarefa e use SuccessfulProxy mesmo que atualmente você forneça apenas um proxy. Com ProxyCandidates, o candidato bem-sucedido é identificado por Solution.EgressAttempts, um índice da lista original que começa em um. A função auxiliar evita ter que adivinhar qual candidato funcionou; pare se ela retornar false. As listas de candidatos aceitam no máximo doze URLs distintas de proxies HTTP ou HTTPS, sem caminho, consulta ou fragmento.
Inclua os cabeçalhos, os campos de formulário e a sessão do destino
O exemplo usa url.Values para codificar Solution.Token como dados de formulário no campo g-recaptcha-response e define o tipo de conteúdo correspondente. Substitua esse nome de campo se a aplicação esperar outro. Adicione os outros campos exigidos pelo endpoint, como os dados de login e qualquer valor anti-CSRF vinculado à sessão; um token de CAPTCHA não é uma requisição de login completa.
Use UserAgent e SecChUA retornados, como faz o exemplo. Se a solução também fornecer entradas em Headers, aplique esses cabeçalhos retornados à requisição ao destino também — o exemplo não copia essa coleção. Mantenha a identidade do navegador consistente e o tipo de conteúdo correto para o corpo que você está enviando.
O exemplo não tem um repositório de cookies. Se o destino exigir uma sessão, crie um com net/http/cookiejar, associe-o a targetClient.Jar antes de iniciar o fluxo no destino e reutilize esse cliente para a requisição da página e o envio do formulário. Use o mesmo proxy bem-sucedido durante toda essa sessão. O cliente da API solvethree não é o cliente de sessão do destino.
Verifique o erro da resolução antes de acessar a solução. Somente uma tarefa pronta tem uma solução utilizável; errorCode e error de uma tarefa que falhou explicam a falha. Na requisição ao destino, trate o erro de Do e depois verifique o status HTTP antes de interpretar o corpo da resposta. Feche response.Body sempre que Do retornar uma resposta sem erro, inclusive em respostas HTTP sem sucesso.
O exemplo desativa os redirecionamentos automáticos e imprime o status da aplicação. Inspecione o corpo da resposta e qualquer redirecionamento esperado para determinar se a aplicação aceitou o envio. Uma tarefa pronta — ou um status HTTP de sucesso por si só — não comprova esse resultado.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.