Pergunta

Estou trabalhando na API ZOHO e tentando atualizar o registro usando cURL.Tentei diferentes variações de cURL, mas sempre retorna "falso".Mas quando eu chamo o mesmo URL usando um navegador, ele funciona.

Existe alguma maneira de eles bloquearem solicitações cURL?Existe alguma outra maneira de chamar esse URL usando um POST ou talvez uma solicitação GET?

O código cURL que tentei é o seguinte:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);
Foi útil?

Solução

Os servidores não podem bloquear solicitações cURL per se, mas podem bloquear qualquer solicitação de que não gostem.Se o servidor verificar alguns parâmetros que sua solicitação cURL não satisfaz, ele pode decidir responder de forma diferente.

Na grande maioria dos casos, essa diferença de comportamento é desencadeada pela presença (ou ausência) e valores dos cabeçalhos de solicitação HTTP.Por exemplo, o servidor pode verificar se o cabeçalho User-Agent está presente e tem um valor válido (ele também pode verificar muitas outras coisas).

Para descobrir a aparência da solicitação HTTP proveniente do navegador, use um proxy de depuração HTTP como Fiddler ou as ferramentas de desenvolvedor do seu navegador.

Para adicionar seus próprios cabeçalhos à solicitação cURL, use

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue'));

Outras dicas

Muitos servidores web desejam bloquear solicitações HTTP forjadas por algo diferente de um navegador, para evitar abusos de bots. Se você deseja simular / fingir sua solicitação de um navegador, você deve pelo menos:

  1. Passe exatamente os mesmos cabeçalhos que seus navegadores (use, por exemplo, Firebug para obtê-los)

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
  2. Altere o agente do usuário (nome do navegador)

    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    
  3. Ative os cookies (por exemplo, redirecionamento e tratamento de sessão)

    curl_setopt ($ch, CURLOPT_COOKIEJAR, $file);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    

  4. Adicionar referenciadores

    curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    

E reze para que não tenha perdido nada!

Para responder à sua pergunta "Existe alguma maneira de eles bloquearem solicitações CURL?" : Sim, na verdade, é possível detectar uma solicitação cURL lendo o cabeçalho User-Agent.

Você pode alterar o agente do usuário chamando curl_setopt($ch, CURLOPT_USERAGENT, 'My user agent string!');.

Só para elaborar um pouco mais sobre isso, você pode usar o curl_setopt ($ ch, CURLOPT_USERAGENT, 'Mozilla / 5.0');ou algo parecido para falsificar o agente do usuário.Nesse caso, o servidor pensaria que um navegador Firefox estava fazendo a solicitação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top