จะใช้ CURL ผ่านพร็อกซีได้อย่างไร?


128

ฉันต้องการตั้งค่า curl เพื่อใช้พร็อกซีเซิร์ฟเวอร์ url จัดทำโดยรูปแบบ html ซึ่งไม่มีปัญหา หากไม่มีพร็อกซีก็ใช้งานได้ดี ฉันพบรหัสในไซต์นี้และไซต์อื่น ๆ แต่ใช้ไม่ได้ ความช่วยเหลือใด ๆ ในการค้นหาวิธีแก้ปัญหาที่ถูกต้องจะได้รับการชื่นชมมาก ฉันรู้สึกว่าคนร้องอยู่ใกล้ แต่ฉันขาดอะไรไป ขอบคุณ.

รหัสร้องที่ฉันดัดแปลงมาจากที่นี่http://www.webmasterworld.com/forum88/10572.htmแต่ส่งกลับข้อความแสดงข้อผิดพลาดเกี่ยวกับ T_VARIABLE ที่หายไปในบรรทัด 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);
?>

การร้องมาจากcurl ถึง proxy ไม่ส่งคืนเนื้อหา

<?

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

ขณะนี้อยู่บน pelican-cement.com แต่ก็ใช้ไม่ได้เช่นกัน

อัปเดต: ขอบคุณสำหรับความช่วยเหลือฉันได้ทำการเปลี่ยนแปลงข้างต้น ตอนนี้ส่งคืนเฉพาะหน้าจอว่างเปล่า

<?

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

นอกจากนี้คุณต้องเปลี่ยน $ url = '$ _POST [1]' เป็น $ url = $ _POST [1] มิฉะนั้น $ url จะเป็นสตริงแทน URL ที่คุณต้องการ
yoavmatchulsky

นอกจากนี้คีย์ในอาร์เรย์ $ _POST เป็นสตริงที่ไม่ใช่จำนวนเต็มดังนั้นคุณจึงต้องการให้มันบอกว่า$_POST['1']
fiiv

2
แบบฟอร์มบน pelican-cement.com มีอินพุตชื่อ "firstname" และ "lastname" แต่ไม่มีชื่อ "1"
John Flatness

2
@ user586011: โปรดเพิ่มโซลูชันของคุณเป็นคำตอบด้านล่างและยอมรับ อย่าใส่คำตอบลงในคำถามซึ่งไม่ได้ผล
hakre

คำตอบ:


221

นี่คือเวอร์ชันที่ใช้งานได้โดยนำข้อบกพร่องของคุณออก

$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_PROXYUSERPWDในกรณีที่พร็อกซีของคุณต้องการชื่อผู้ใช้และรหัสผ่าน ฉันตั้งค่าCURLOPT_RETURNTRANSFERเป็น 1 เพื่อที่ข้อมูลจะถูกส่งกลับไปยัง$curl_scraped_pageตัวแปร

ฉันลบส่วนพิเศษที่สองออกcurl_exec($ch);ซึ่งจะหยุดการส่งคืนตัวแปร ฉันรวมพร็อกซี IP และพอร์ตของคุณไว้ในการตั้งค่าเดียว

ฉันยังลบCURLOPT_HTTPPROXYTUNNELและCURLOPT_CUSTOMREQUESTมันเป็นค่าเริ่มต้น

CURLOPT_HEADERหากคุณไม่ต้องการที่ส่วนหัวกลับออกมาแสดงความคิดเห็น

หากต้องการปิดใช้งานพร็อกซีเพียงแค่ตั้งค่าเป็นโมฆะ

curl_setopt($ch, CURLOPT_PROXY, null);

คำถามใด ๆ อย่าลังเลที่จะถามฉันทำงานกับcURLทุกวัน


ยินดีที่ได้ทราบว่าคุณทำงานกับ CURL ทุกวัน ฉันลองตั้งค่าพร็อกซีถุงเท้าแล้วมันใช้งานได้บนเครื่องของฉัน แต่ไม่ทำงานบนเซิร์ฟเวอร์เฉพาะของลินุกซ์ ความคิดใด ๆ ?
coding_idiot

@coding_idiot เว็บโฮสต์ส่วนใหญ่บล็อกพอร์ตที่ไม่ใช่ 80 หรือ 443 ด้วยเหตุผลด้านความปลอดภัย
sousdev

ฉันได้แก้ไขไปแล้ว ฉันแน่ใจว่าคนอื่นจะได้รับประโยชน์จากสิ่งนี้
coding_idiot

@GravyCode: หากเราได้รับพรอกซีจากบริการบางอย่างในกรณีนั้นฉันต้องส่งชื่อผู้ใช้ / รหัสผ่านหรือไม่?
Pragnesh Chauhan

1
ฉันจะรู้ได้อย่างไรว่าเว็บโฮสต์บล็อกพอร์ตพร็อกซี
user1788736

35

ฉันได้อธิบายการใช้ตัวเลือก CURL ต่างๆที่จำเป็นสำหรับ 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;

3
ความคิดเห็นเหล่านี้จะเป็นประโยชน์ แต่คนอื่น ๆ ควรทราบว่าตัวเลือกเพิ่มเติมจะไม่จริงต้อง
เนท

-1

นี่คือฟังก์ชั่นที่ผ่านการทดสอบมาเป็นอย่างดีซึ่งฉันใช้สำหรับโครงการของฉันพร้อมความคิดเห็นที่อธิบายตนเองโดยละเอียด


มีหลายครั้งที่พอร์ตอื่นที่ไม่ใช่ 80 ถูกบล็อกโดยไฟร์วอลล์เซิร์ฟเวอร์ดังนั้นรหัสจึงดูเหมือนจะทำงานได้ดีบน localhost แต่ไม่อยู่บนเซิร์ฟเวอร์

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
สิ่งนี้ช่วยฉันได้: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // เท็จสำหรับ https
villamejia

1
@villamejia ระวังในการใช้ CURLOPT_SSL_VERIFYPEER = false ซึ่งหมายความว่า cURL จะไม่ทำการตรวจสอบใบรับรองใด ๆ เมื่อเชื่อมต่อกับเซิร์ฟเวอร์ https ดังนั้นจึงทำให้การเชื่อมต่อมีความเสี่ยงที่จะเกิดการโจมตีจากคนตรงกลางได้ - ดังนั้นจึงไม่รับประกันความปลอดภัยของข้อมูลอีกต่อไป ใช้ CURLOPT_CAPATH ดีกว่าเพื่อให้ไดเรกทอรีที่มีชุดของหน่วยงานการรับรองรูทที่ถูกต้อง ( /etc/ssl/certsบน Debian / Ubuntu เป็นต้น)
Ale
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.