2012-02-22 38 views
10

Tôi đang làm việc trên API ZOHO và cố cập nhật bản ghi bằng CURL. Tôi đã thử các biến thể CURL khác nhau nhưng nó luôn trả về "sai". Nhưng khi tôi gọi cùng một URL bằng trình duyệt, nó hoạt động.
Có cách nào để chặn các yêu cầu CURL không? Có cách nào khác tôi có thể gọi URL đó bằng POSt hoặc có thể GET cũng làm không? Tôi đã dành gần 2-3 ngày. Nếu bạn là người dùng ZOHO API, bạn có thể vui lòng cho tôi biết mã đã hoạt động cho bạn không?Máy chủ có thể chặn yêu cầu curl không?

curl gần đây tôi đã cố gắng như sau:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
$data = curl_exec($ch); 
curl_close($ch); 

Trả lời

10

Máy chủ không thể chặn yêu cầu curl mỗi lần, nhưng họ có thể chặn bất kỳ yêu cầu nào mà họ không thích. Nếu máy chủ kiểm tra một số thông số mà yêu cầu curl của bạn không thỏa mãn, máy chủ có thể quyết định phản hồi khác nhau.

Trong phần lớn các trường hợp, sự khác biệt về hành vi này được kích hoạt bởi sự hiện diện (hoặc vắng mặt) và các giá trị của các tiêu đề yêu cầu HTTP. Ví dụ: máy chủ có thể kiểm tra xem có tiêu đề User-Agent và có giá trị hợp lệ không (nó cũng có thể kiểm tra nhiều thứ khác).

Để tìm hiểu xem yêu cầu HTTP đến từ trình duyệt trông như thế nào, hãy sử dụng proxy gỡ lỗi HTTP như Fiddler hoặc các công cụ dành cho nhà phát triển của trình duyệt của bạn.

Để thêm tiêu đề của riêng bạn để yêu cầu curl của bạn, sử dụng

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue')); 
+0

Đồng ý với tuyên bố ur "thông số mà yêu cầu curl của bạn không đáp ứng" nhưng trong đó tài liệu chính thức, họ không đề cập đến bất kỳ điều gì như vậy. Một điều nữa, có API phải được gọi qua HTTPS .... CURL quản lý nội bộ hoặc tôi phải thêm một cái gì đó nhiều hơn để đối phó với HTTPS? –

+0

@AmitPatil: Có, curl thực hiện HTTPS.Thực sự không thể nói về API ZOHO, tôi chưa bao giờ nhìn vào nó. – Jon

+0

* "Trong phần lớn các trường hợp, sự khác biệt trong hành vi này được kích hoạt bởi sự hiện diện (hoặc vắng mặt) và các giá trị của các tiêu đề yêu cầu HTTP" * Yêu cầu chặn hiện đại thông minh hơn nhiều so với hiện nay, imho. –

5

Để trả lời câu hỏi của bạn "Có cách nào họ có thể chặn các yêu cầu CURL?": Có, trên thực tế, người ta có thể phát hiện yêu cầu cURL bằng cách đọc tiêu đề User-Agent.

Bạn có thể thay đổi tác nhân người dùng bằng cách gọi curl_setopt($ch, CURLOPT_USERAGENT, 'My user agent string!');.

15

Nhiều máy chủ web muốn chặn các yêu cầu HTTP giả mạo bởi cái gì khác hơn là một trình duyệt, để ngăn chặn chương trình lạm dụng. Nếu bạn muốn mô phỏng/giả vờ yêu cầu của bạn từ một trình duyệt, bạn ít nhất phải:

  1. Vượt qua các tiêu đề chính xác cùng hơn các trình duyệt của bạn (sử dụng ví dụ Firebug để có được chúng)

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    
  2. Thay đổi user agent (tên của trình duyệt)

    curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
    
  3. Enable cookie (cho ví dụ như chuyển hướng và xử lý session)

    curl_setopt ($ch, CURLOPT_COOKIEJAR, $file); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
    
  4. Thêm referers

    curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com'); 
    curl_setopt($curl, CURLOPT_AUTOREFERER, true); 
    

Và cầu nguyện bạn đã không bỏ lỡ bất cứ điều gì!

Các vấn đề liên quan