Wie verwende ich CURL über einen Proxy?

128

Ich möchte curl so einstellen, dass ein Proxyserver verwendet wird. Die URL wird von einem HTML-Formular bereitgestellt, was kein Problem war. Ohne den Proxy funktioniert es gut. Ich habe Code auf dieser und anderen Websites gefunden, aber sie funktionieren nicht. Jede Hilfe bei der Suche nach der richtigen Lösung wäre sehr dankbar. Ich habe das Gefühl, dass der Balg nahe ist, aber dass mir etwas fehlt. Danke.

Der folgende Code, den ich von hier aus angepasst habe, http://www.webmasterworld.com/forum88/10572.htm , gibt jedoch eine Fehlermeldung über ein fehlendes T_VARIABLE in Zeile 12 zurück.

<?

$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);
?>

Der Balg ist von Curl bis Proxy kein Inhalt zurückgegeben

<?

$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;
?>

ist derzeit live auf pelican-cement.com, funktioniert aber auch nicht.

UPDATE: Vielen Dank für all Ihre Hilfe. Ich habe die oben genannten Änderungen vorgenommen. Jetzt wird nur noch ein leerer Bildschirm zurückgegeben.

<?

$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
quelle
3
Sie vermissen ein Semikolon in Zeile 12
Pekka
Außerdem müssen Sie $ url = '$ _POST [1]' in $ url = $ _POST [1] ändern. Andernfalls ist $ url eine Zeichenfolge anstelle der gewünschten URL
yoavmatchulsky
Auch ist der Schlüssel in dem $ _POST Array ein String keine ganze Zahl ist, so dass Sie es wollen würden sagen$_POST['1']
fiiv
2
Das Formular auf pelican-cement.com enthält Eingaben mit den Namen "Vorname" und "Nachname", jedoch keine mit dem Namen "1".
John Flatness
2
@ user586011: Bitte fügen Sie Ihre Lösung als Antwort unten hinzu und akzeptieren Sie sie. Stellen Sie die Lösung nicht in die Frage, das funktioniert nicht gut.
hakre

Antworten:

220

Hier ist eine funktionierende Version, bei der Ihre Fehler entfernt wurden.

$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;

Ich habe hinzugefügt, CURLOPT_PROXYUSERPWDfalls einer Ihrer Proxies einen Benutzernamen und ein Passwort benötigt. Ich setze CURLOPT_RETURNTRANSFERauf 1, damit die Daten an die $curl_scraped_pageVariable zurückgegeben werden.

Ich habe ein zweites Extra entfernt, curl_exec($ch);das die Rückgabe der Variablen verhindern würde. Ich habe Ihre Proxy-IP und Ihren Port in einer Einstellung zusammengefasst.

Ich habe auch entfernt CURLOPT_HTTPPROXYTUNNELund CURLOPT_CUSTOMREQUESTda es die Standardeinstellung war.

Wenn Sie nicht möchten, dass die Header zurückgegeben werden, kommentieren Sie dies aus CURLOPT_HEADER.

Um den Proxy zu deaktivieren, setzen Sie ihn einfach auf null.

curl_setopt($ch, CURLOPT_PROXY, null);

Bei Fragen stehe ich Ihnen gerne cURLjeden Tag zur Verfügung.

GravyCode
quelle
Schön zu wissen, dass Sie jeden Tag mit CURL arbeiten. Ich habe versucht, einen Socken-Proxy einzurichten, der auf meinem lokalen Computer funktioniert, aber auf meinem dedizierten Linux-Server nicht. Irgendeine Idee ?
Coding_idiot
@coding_idiot Die meisten Webhosts blockieren aus Sicherheitsgründen Ports, die nicht 80 oder 443 sind.
Sousdev
Ich habe es aber schon gelöst. Ich bin sicher, dass andere davon profitieren werden.
Coding_idiot
@GravyCode: Wenn wir in diesem Fall Proxy von einigen Diensten erhalten, muss ich Benutzername / Passwort übergeben?
Pragnesh Chauhan
1
Wie soll ich wissen, ob der Proxy-Port vom Webhost blockiert wird?
user1788736
34

Ich habe die Verwendung verschiedener CURL-Optionen erklärt, die für CURL PROXY erforderlich sind.

$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
quelle
3
Diese Kommentare sind hilfreich, andere sollten jedoch beachten, dass die zusätzlichen Optionen nicht erforderlich sind .
Nate
-1

Hier ist eine gut getestete Funktion, die ich für meine Projekte mit detaillierten selbsterklärenden Kommentaren verwendet habe


Es gibt viele Fälle, in denen andere Ports als 80 von der Server-Firewall blockiert werden, sodass der Code auf localhost, jedoch nicht auf dem Server einwandfrei zu funktionieren scheint

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
quelle
1
Dies hat mir geholfen: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // falsch für https
villamejia
1
@villamejia Vorsicht bei der Verwendung von CURLOPT_SSL_VERIFYPEER = false. Dies bedeutet, dass cURL beim Herstellen einer Verbindung zum https-Server keine Zertifikatsprüfung durchführt, wodurch die Verbindung für einen möglichen Man-in-the-Middle-Angriff anfällig wird. Daher ist die Datensicherheit nicht mehr garantiert. Verwenden Sie besser CURLOPT_CAPATH, um ein Verzeichnis mit einer Reihe gültiger Root-Zertifizierungsstellen ( /etc/ssl/certsz. B. unter Debian / Ubuntu) anzugeben
Ale