Comment utiliser CURL via un proxy?

128

Je cherche à configurer curl pour utiliser un serveur proxy. L'url est fournie par un formulaire html, ce qui n'a pas posé de problème. Sans le proxy, cela fonctionne bien. J'ai trouvé du code sur ce site et sur d'autres, mais ils ne fonctionnent pas. Toute aide pour trouver la bonne solution serait très appréciée. Je sens que les soufflets sont proches, mais qu'il me manque quelque chose. Merci.

Le code ci-dessous, j'ai adapté d'ici http://www.webmasterworld.com/forum88/10572.htm mais il renvoie un message d'erreur concernant un T_VARIABLE manquant à la ligne 12.

<?

$url = '$_POST[1]';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1)
curl_exec ($ch); 
$curl_info = curl_getinfo($ch);
curl_close($ch);
echo '<br />';
print_r($curl_info);
?>

Le soufflet est de curl à proxy ne renvoie aucun contenu

<?

$proxy = "66.96.200.39:80";
$proxy = explode(':', $proxy);
$url = "$_POST[1]";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HEADER, 1);

$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;
?>

est actuellement en ligne sur pelican-cement.com mais ne fonctionne pas non plus.

MISE À JOUR: Merci pour toute votre aide, j'ai apporté les modifications ci-dessus. Maintenant, il ne renvoie qu'un écran vide.

<?

$url = $_POST['1'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_exec ($ch); 
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;
?> 
user586011
la source
3
Il vous manque un point-virgule sur la ligne 12
Pekka
aussi, vous devez changer $ url = '$ _POST [1]' en $ url = $ _POST [1] - sinon, $ url sera une chaîne au lieu de l'URL que vous voulez
yoavmatchulsky
De plus, la clé du tableau $ _POST est une chaîne et non un entier, vous voudrez donc qu'elle dise$_POST['1']
fiiv
2
Le formulaire sur pelican-cement.com a des entrées nommées "firstname" et "lastname", mais aucune ne porte le nom "1".
John Flatness
2
@ user586011: Veuillez ajouter votre solution comme réponse ci-dessous et l'accepter. Ne mettez pas la solution dans la question, cela ne fonctionne pas bien.
hakre

Réponses:

221

Voici une version fonctionnelle avec vos bogues supprimés.

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
//$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

J'ai ajouté CURLOPT_PROXYUSERPWDau cas où l'un de vos mandataires nécessiterait un nom d'utilisateur et un mot de passe. J'ai mis CURLOPT_RETURNTRANSFERà 1, de sorte que les données soient renvoyées à la $curl_scraped_pagevariable.

J'ai supprimé un deuxième supplément curl_exec($ch);qui empêcherait le retour de la variable. J'ai consolidé votre adresse IP et votre port proxy en un seul paramètre.

J'ai également supprimé CURLOPT_HTTPPROXYTUNNELet CURLOPT_CUSTOMREQUESTcomme c'était la valeur par défaut.

Si vous ne voulez pas que les en-têtes soient renvoyés, commentez CURLOPT_HEADER.

Pour désactiver le proxy, définissez-le simplement sur null.

curl_setopt($ch, CURLOPT_PROXY, null);

N'hésitez pas à poser toutes les questions, je travaille avec cURLtous les jours.

GravyCode
la source
agréable de savoir que vous travaillez avec CURL tous les jours. J'ai essayé de configurer un proxy socks et cela fonctionne sur ma machine locale mais ne fonctionne pas sur mon serveur dédié Linux. Une idée ?
coding_idiot
@coding_idiot La plupart des hébergeurs Web bloquent les ports qui ne sont pas 80 ou 443 pour des raisons de sécurité.
sousdev
Je l'ai déjà résolu cependant. Je suis sûr que d'autres en profiteront.
coding_idiot
@GravyCode: si nous obtenons un proxy de certains services, dans ce cas, dois-je passer un nom d'utilisateur / mot de passe?
Pragnesh Chauhan
1
Comment dois-je savoir si le port proxy est bloqué par l'hébergeur?
user1788736
35

J'ai expliqué l'utilisation de diverses options CURL requises pour CURL PROXY.

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);         // URL for CURL call
curl_setopt($ch, CURLOPT_PROXY, $proxy);     // PROXY details with port
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);   // Use if proxy have username and password
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // If expected to call with specific PROXY type
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  // If url has redirects then go to the final redirected URL.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  // Do not outputting it out directly on screen.
curl_setopt($ch, CURLOPT_HEADER, 1);   // If you want Header information of response else make 0
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;
Somnath Muluk
la source
3
Ces commentaires sont utiles, mais d'autres devraient noter que les options supplémentaires ne sont pas réellement nécessaires .
Nate
-1

Voici une fonction bien testée que j'ai utilisée pour mes projets avec des commentaires détaillés et explicites


Il arrive souvent que les ports autres que 80 soient bloqués par le pare-feu du serveur, de sorte que le code semble fonctionner correctement sur localhost mais pas sur le serveur

function get_page($url){

global $proxy;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HEADER, 0); // return headers 0 no 1 yes
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return page 1:yes
curl_setopt($ch, CURLOPT_TIMEOUT, 200); // http request timeout 20 seconds
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follow redirects, need this if the url changes
curl_setopt($ch, CURLOPT_MAXREDIRS, 2); //if http server gives redirection responce
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); // cookies storage / here the changes have been made
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // the page encoding

$data = curl_exec($ch); // execute the http request
curl_close($ch); // close the connection
return $data;
}
hammad1238
la source
1
Cela m'a aidé: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // false pour https
villamejia
1
@villamejia Attention, cependant, en utilisant CURLOPT_SSL_VERIFYPEER = false. Cela signifie que cURL ne fera aucune vérification de certificat lors de la connexion au serveur https, rendant ainsi la connexion vulnérable à une éventuelle attaque d'intermédiaire - par conséquent, la sécurité des données n'est plus garantie. Mieux vaut utiliser CURLOPT_CAPATH pour donner un répertoire contenant un ensemble d'autorités de certification racine valides ( /etc/ssl/certssur Debian / Ubuntu, par exemple)
Ale