Question

Je travaille sur l'API ZOHO et j'essaie de mettre à jour l'enregistrement à l'aide de Curl. J'ai essayé différentes variations de curl, mais elle renvoie toujours "faux". Mais lorsque j'appelle la même URL à l'aide d'un navigateur, cela fonctionne.

Y a-t-il un moyen de bloquer les demandes de boucle? Y a-t-il une autre manière que je peux appeler cette URL en utilisant un message ou peut-être une demande de GET?

Le code de curl que j'ai essayé est comme ci-dessous:

$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);
Était-ce utile?

La solution

Les serveurs ne peuvent pas bloquer les demandes de boucle en soi, mais ils peuvent bloquer toute demande qu'ils n'aiment pas. Si le serveur vérifie certains paramètres que votre demande Curl ne satisfait pas, il pourrait décider de répondre différemment.

Dans la grande majorité des cas, cette différence de comportement est déclenchée par la présence (ou l'absence) et les valeurs des en-têtes de demande HTTP. Par exemple, le serveur peut vérifier que le User-Agent L'en-tête est présent et a une valeur valide (il pourrait également vérifier beaucoup d'autres choses).

Pour savoir à quoi ressemble la demande HTTP du navigateur, utilisez un proxy de débogage HTTP comme Violoneux ou les outils de développeur de votre navigateur.

Pour ajouter vos propres en-têtes à votre demande de boucle, utilisez

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

Autres conseils

De nombreux serveurs Web souhaitent bloquer les demandes HTTP forgées par autre chose qu'un navigateur, pour éviter les abus de bots. Si vous souhaitez simuler / prétendre votre demande d'un navigateur, vous devez au moins:

  1. Passez les mêmes en-têtes exacts que vos navigateurs (utilisez IE Pyromane les attraper)

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
  2. Modifier l'agent utilisateur (nom du navigateur)

    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    
  3. Activer les cookies (pour la redirection par exemple et la manipulation de session)

    curl_setopt ($ch, CURLOPT_COOKIEJAR, $file);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    
  4. Ajouter des références

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

Et priez que vous n'ayez rien manqué!

Pour répondre à ta question "Y a-t-il un moyen de bloquer les demandes de boucle?": Oui, en fait, on peut détecter une demande de boucle en lisant le User-Agent entête.

Vous pouvez modifier l'agent utilisateur en appelant curl_setopt($ch, CURLOPT_USERAGENT, 'My user agent string!');.

Juste pour en élaborer un peu plus à ce sujet, vous pouvez utiliser le curl_setopt ($ ch, curlopt_useragent, 'mozilla / 5.0'); ou quelque chose comme ça pour simuler l'agent utilisateur. Dans ce cas, le serveur penserait qu'un navigateur Firefox faisait la demande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top