Làm thế nào để sử dụng CURL qua proxy?


128

Tôi đang tìm cách thiết lập curl để sử dụng máy chủ proxy. Các url được cung cấp bởi một hình thức html, không phải là một vấn đề. Không có proxy nó hoạt động tốt. Tôi đã tìm thấy mã trên trang này và các trang khác, nhưng chúng không hoạt động. Bất kỳ trợ giúp trong việc tìm giải pháp chính xác sẽ được nhiều đánh giá cao. Tôi cảm thấy rằng dưới đây là gần, nhưng tôi đang thiếu một cái gì đó. Cảm ơn bạn.

Mã dưới đây tôi đã điều chỉnh từ đây http://www.webmasterworld.com/forum88/10572.htm nhưng nó trả về một thông báo lỗi về một T_VARIABLE bị thiếu trên dòng 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);
?>

Dưới đây là từ curl thông qua proxy trả về không có nội dung

<?

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

hiện đang trực tiếp trên pelican-ced.com nhưng cũng không hoạt động.

CẬP NHẬT: Cảm ơn tất cả sự giúp đỡ của bạn, tôi đã thực hiện các thay đổi ở trên. Bây giờ nó chỉ trả về một màn hình trống.

<?

$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
Bạn đang thiếu một dấu chấm phẩy trên dòng 12
Pekka

đồng thời, bạn cần thay đổi $ url = '$ _POST [1]' thành $ url = $ _POST [1] - nếu không, $ url sẽ là một chuỗi thay vì URL bạn muốn
yoavmatchulsky

Ngoài ra, khóa trong mảng $ _POST là một chuỗi không phải là số nguyên nên bạn muốn nó nói$_POST['1']
bốc lửa

2
Biểu mẫu trên pelican-ced.com có ​​các đầu vào có tên "Firstname" và "Lastname", nhưng không có tên "1".
John Flatness

2
@ user586011: Vui lòng thêm giải pháp của bạn dưới dạng câu trả lời bên dưới và chấp nhận nó. Đừng đặt giải pháp vào câu hỏi, nó không hoạt động tốt.
hakre

Câu trả lời:


221

Đây là một phiên bản làm việc với các lỗi của bạn được loại bỏ.

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

Tôi đã thêm CURLOPT_PROXYUSERPWD trong trường hợp bất kỳ proxy nào của bạn yêu cầu tên người dùng và mật khẩu. Tôi đặt CURLOPT_RETURNTRANSFERthành 1, để dữ liệu sẽ được trả về $curl_scraped_pagebiến.

Tôi đã xóa thêm một giây curl_exec($ch); sẽ dừng biến được trả về. Tôi hợp nhất IP proxy và cổng của bạn thành một cài đặt.

Tôi cũng đã gỡ bỏ CURLOPT_HTTPPROXYTUNNELCURLOPT_CUSTOMREQUESTvì nó là mặc định.

Nếu bạn không muốn các tiêu đề trở lại, hãy bình luận CURLOPT_HEADER .

Để vô hiệu hóa proxy, chỉ cần đặt nó thành null.

curl_setopt($ch, CURLOPT_PROXY, null);

Bất kỳ câu hỏi cảm thấy tự do để hỏi, tôi làm việc với cURLmỗi ngày.


Rất vui khi biết rằng bạn làm việc với CURL hàng ngày. Tôi đã thử đặt proxy vớ và nó hoạt động trên máy cục bộ của tôi nhưng không hoạt động trên máy chủ chuyên dụng linux của tôi. Bất kỳ ý tưởng ?
mã hóa_idiot

@coding_idiot Hầu hết các máy chủ web đều chặn các cổng không phải là 80 hoặc 443 vì lý do bảo mật.
sousdev

Tôi đã giải quyết nó mặc dù. Tôi chắc rằng những người khác sẽ được hưởng lợi từ điều này.
mã hóa_idiot

@GravyCode: nếu chúng tôi nhận được proxy từ một số dịch vụ trong trường hợp đó tôi có bắt buộc phải chuyển tên người dùng / mật khẩu không?
Pragnesh Chauhan

1
Làm thế nào tôi nên biết nếu cổng proxy bị chặn bởi webhost?
dùng1788736

35

Tôi đã giải thích việc sử dụng các tùy chọn CURL khác nhau cần thiết cho 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
Những bình luận này rất hữu ích, nhưng những người khác cần lưu ý rằng các tùy chọn bổ sung không thực sự cần thiết .
Nate

-1

Đây là một chức năng được thử nghiệm tốt mà tôi đã sử dụng cho các dự án của mình với các bình luận tự giải thích chi tiết


Có nhiều lần các cổng khác ngoài 80 bị chặn bởi tường lửa máy chủ, do đó mã có vẻ hoạt động tốt trên localhost nhưng không phải trên máy chủ

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
Điều này đã giúp tôi: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, sai); // sai cho https
Villamejia

1
@villamejia Cảnh giác, tuy nhiên, khi sử dụng CURLOPT_SSL_VERIFYPEER = false. Điều này có nghĩa là cURL sẽ không thực hiện bất kỳ kiểm tra chứng chỉ nào khi kết nối với máy chủ https, do đó khiến kết nối dễ bị tấn công giữa chừng - vì vậy bảo mật dữ liệu không còn được đảm bảo nữa. Sử dụng tốt hơn CURLOPT_CAPATH để cung cấp một thư mục chứa một tập hợp các cơ quan chứng nhận gốc hợp lệ ( /etc/ssl/certsví dụ: trên Debian / Ubuntu)
Ale
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.