Os servidores podem bloquear solicitações curl?
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);
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:
-
Passe exatamente os mesmos cabeçalhos que seus navegadores (use, por exemplo, Firebug para obtê-los)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
Altere o agente do usuário (nome do navegador)
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
-
Ative os cookies (por exemplo, redirecionamento e tratamento de sessão)
curl_setopt ($ch, CURLOPT_COOKIEJAR, $file); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
-
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.