Proxy aracılığıyla CURL nasıl kullanılır?


128

Bir proxy sunucusu kullanmak için curl'yi ayarlamak istiyorum. Url, sorun olmayan bir html formu tarafından sağlanır. Proxy olmadan iyi çalışıyor. Bu ve diğer sitelerde kod buldum, ancak çalışmıyorlar. Doğru çözümü bulmada herhangi bir yardım çok takdir edilecektir. Körüğün yakın olduğunu hissediyorum ama bir şeyi kaçırıyorum. Teşekkür ederim.

Buradan uyarladığım aşağıdaki kod http://www.webmasterworld.com/forum88/10572.htm, ancak 12. satırda eksik bir T_VARIABLE hakkında bir hata mesajı veriyor.

<?

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

Feryat curl'den proxy'ye kadar içerik döndürmez

<?

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

şu anda pelican-cement.com'da yayında ama aynı zamanda çalışmıyor.

GÜNCELLEME: Tüm yardımlarınız için teşekkür ederim, yukarıdaki değişiklikleri yaptım. Şimdi yalnızca boş bir ekran döndürüyor.

<?

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

3
12. satırda noktalı virgül eksik
Pekka

ayrıca, $ url = '$ _POST [1]' değerini $ url = $ _POST [1] olarak değiştirmeniz gerekir - aksi takdirde, $ url istediğiniz URL yerine bir dize olur
yoavmatchulsky

Ayrıca, $ _POST dizisindeki anahtar bir tamsayı değil bir dizedir, bu yüzden şunu söylemesini istersiniz$_POST['1']
fiiv

2
Pelican-cement.com'daki formda "ad" ve "soyad" adlı girişler var, ancak hiçbiri "1" olarak adlandırılmamış.
John Flatness

2
@ user586011: Lütfen çözümünüzü aşağıya bir cevap olarak ekleyin ve kabul edin. Çözümü soruya koymayın, bu pek işe yaramaz.
hakre

Yanıtlar:


221

İşte böcekleriniz kaldırılmış çalışan bir sürüm.

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

CURLOPT_PROXYUSERPWDVekillerinizden herhangi birinin bir kullanıcı adı ve şifre gerektirmesi durumunda ekledim . CURLOPT_RETURNTRANSFERVerinin $curl_scraped_pagedeğişkene dönmesi için 1'e ayarladım .

curl_exec($ch);Değişkenin döndürülmesini durduracak ikinci bir fazladan kaldırdım . Proxy IP'nizi ve bağlantı noktanızı tek bir ayarda birleştirdim.

Ben de kaldırdım CURLOPT_HTTPPROXYTUNNELve CURLOPT_CUSTOMREQUESTvarsayılan olduğu için.

Başlıkların döndürülmesini istemiyorsanız, yorum yapın CURLOPT_HEADER.

Proxy'yi devre dışı bırakmak için onu null olarak ayarlayın.

curl_setopt($ch, CURLOPT_PROXY, null);

Herhangi bir soru sormakta özgürüm, cURLher gün çalışıyorum.


Her gün CURL ile çalıştığınızı bilmek güzel. Bir çorap proxy'si ayarlamayı denedim ve yerel makinemde çalışıyor ancak linux adanmış sunucumda çalışmıyor. Herhangi bir fikir ?
coding_idiot

@coding_idiot Çoğu web sunucusu, güvenlik nedenleriyle 80 veya 443 olmayan bağlantı noktalarını engeller.
sousdev

Yine de çözdüm zaten. Eminim başkaları bundan faydalanacaktır.
coding_idiot

@GravyCode: Bu durumda bazı servislerden proxy alırsak kullanıcı adı / şifreyi geçmem gerekir mi?
Pragnesh Chauhan

1
Proxy bağlantı noktasının web barındırıcısı tarafından engellendiğini nasıl bilebilirim?
user1788736

35

CURL PROXY için gerekli olan çeşitli CURL seçeneklerinin kullanımını açıkladım.

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

3
Bu yorumlar faydalıdır, ancak diğerleri ek seçeneklerin gerçekte gerekli olmadığına dikkat etmelidir .
Nate

-1

İşte projelerim için kullandığım ve kendinden açıklamalı ayrıntılı yorumlar içeren iyi test edilmiş bir fonksiyon


80 dışındaki bağlantı noktalarının sunucu güvenlik duvarı tarafından engellendiği birçok kez vardır, bu nedenle kod yerel ana bilgisayarda iyi çalışıyor, ancak sunucuda çalışmıyor gibi görünüyor.

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

1
Bu bana yardımcı oldu: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // https için yanlış
villamejia

1
@villamejia CURLOPT_SSL_VERIFYPEER = false kullanırken dikkatli olun. Bu, cURL'nin https sunucusuna bağlanırken herhangi bir sertifika kontrolü yapmayacağı ve dolayısıyla bağlantıyı olası bir ortadaki adam saldırısına karşı savunmasız hale getireceği anlamına gelir - bu nedenle artık veri güvenliği garanti edilmez. Bir dizi geçerli kök sertifika yetkilisi içeren bir dizin vermek için daha iyi CURLOPT_CAPATH kullanın ( /etc/ssl/certsörneğin Debian / Ubuntu'da)
Ale
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.