Bagaimana cara menggunakan CURL melalui proxy?

128

Saya mencari untuk mengatur curl untuk menggunakan server proxy. Url disediakan oleh formulir html, yang tidak menjadi masalah. Tanpa proxy itu berfungsi dengan baik. Saya telah menemukan kode pada ini dan situs lain, tetapi mereka tidak berfungsi. Setiap bantuan dalam menemukan solusi yang tepat akan sangat dihargai. Saya merasa bahwa bawahnya dekat, tetapi saya kehilangan sesuatu. Terima kasih.

Kode di bawah ini saya adaptasi dari sini http://www.webmasterworld.com/forum88/10572.htm tetapi mengembalikan pesan kesalahan tentang T_VARIABLE yang hilang pada baris 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);
?>

Di bawah ini dari curl hingga proxy tidak mengembalikan konten

<?

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

saat ini hidup di pelican-cement.com tetapi juga tidak berfungsi.

PEMBARUAN: Terima kasih atas semua bantuan Anda, saya membuat perubahan di atas. Sekarang hanya mengembalikan layar kosong.

<?

$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;
?> 
pengguna586011
sumber
3
Anda kehilangan titik koma di saluran 12
Pekka
juga, Anda perlu mengubah $ url = '$ _POST [1]' menjadi $ url = $ _POST [1] - jika tidak, $ url akan menjadi string alih-alih URL yang Anda inginkan
yoavmatchulsky
Juga, kunci dalam array $ _POST adalah string bukan bilangan bulat sehingga Anda ingin mengatakannya$_POST['1']
fiiv
2
Formulir di pelican-cement.com memiliki input bernama "firstname" dan "lastname", tetapi tidak ada yang bernama "1".
John Flatness
2
@ user586011: Silakan tambahkan solusi Anda sebagai jawaban di bawah ini dan terima. Jangan memasukkan solusi ke pertanyaan, itu tidak bekerja dengan baik.
hakre

Jawaban:

221

Ini adalah versi yang berfungsi dengan bug Anda dihapus.

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

Saya telah menambahkan CURLOPT_PROXYUSERPWDjika ada proksi Anda memerlukan nama pengguna dan kata sandi. Saya menetapkan CURLOPT_RETURNTRANSFERke 1, sehingga data akan dikembalikan ke $curl_scraped_pagevariabel.

Saya menghapus tambahan kedua curl_exec($ch);yang akan menghentikan variabel yang dikembalikan. Saya menggabungkan IP proxy dan port Anda ke dalam satu pengaturan.

Saya juga menghapus CURLOPT_HTTPPROXYTUNNELdan CURLOPT_CUSTOMREQUESTkarena itu adalah default.

Jika Anda tidak ingin tajuk dikembalikan, beri komentar CURLOPT_HEADER.

Untuk menonaktifkan proxy, cukup setel ke nol.

curl_setopt($ch, CURLOPT_PROXY, null);

Setiap pertanyaan jangan ragu untuk bertanya, saya bekerja dengan cURLsetiap hari.

GravyCode
sumber
senang mengetahui bahwa Anda bekerja dengan CURL setiap hari. Saya mencoba mengatur proxy kaus kaki dan berfungsi pada mesin lokal saya tetapi tidak berfungsi pada server khusus linux saya. Ada ide ?
coding_idiot
@coding_idiot Kebanyakan host web memblokir port yang bukan 80 atau 443 karena alasan keamanan.
sousdev
Saya sudah menyelesaikannya. Saya yakin orang lain akan mendapat manfaat dari ini.
coding_idiot
@GravyCode: jika kita mendapatkan proxy dari beberapa layanan dalam hal ini apakah saya harus lulus username / password?
Pragnesh Chauhan
1
Bagaimana saya harus tahu jika port proxy diblokir oleh webhost?
user1788736
35

Saya telah menjelaskan penggunaan berbagai opsi CURL yang diperlukan untuk 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
sumber
3
Komentar-komentar ini bermanfaat, tetapi yang lain harus mencatat bahwa opsi tambahan sebenarnya tidak diperlukan .
Nate
-1

Berikut adalah fungsi yang telah teruji dengan baik yang saya gunakan untuk proyek saya dengan komentar penjelasan diri yang terperinci


Ada beberapa kali ketika port selain 80 diblokir oleh firewall server sehingga kode tersebut tampaknya berfungsi dengan baik di localhost tetapi tidak pada server

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
sumber
1
Ini membantu saya: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
villamejia
1
@villamejia Berhati-hatilah, dalam menggunakan CURLOPT_SSL_VERIFYPEER = false. Ini berarti bahwa CURL tidak akan melakukan pemeriksaan sertifikat ketika menghubungkan ke server https, sehingga membuat koneksi rentan terhadap kemungkinan serangan man-in-the-middle - oleh karena itu keamanan data tidak dijamin lagi. Lebih baik gunakan CURLOPT_CAPATH untuk memberikan direktori yang berisi sekumpulan otoritas sertifikasi root yang valid ( /etc/ssl/certspada Debian / Ubuntu, misalnya)
Ale