Làm cách nào để sử dụng curl để nhận yêu cầu GET giống hệt như sử dụng Chrome?


85

Tôi có một api web http://something.com/apivà tôi muốn sử dụng GET để nhận phần thân phản hồi.

Đây là lệnh của tôi:

curl "http://something.com/api"

Tất nhiên, nó không thành công và đưa ra thông báo lỗi.

Khi tôi sử dụng Chrome và nhập url ở trên, mọi thứ đều chính xác. Tuy nhiên tôi làm những điều tương tự với Firefox, url cho tôi thông báo lỗi tương tự. Tôi cố gắng lặp lại hành động với DHC của tiện ích mở rộng Chrome, yêu cầu lại đưa ra phản hồi chính xác. Sau một số tìm kiếm, tôi tin rằng tùy chọn uốn tóc --user-agenttạo nên sự khác biệt. Cách chính xác để đặt tác nhân người dùng thành Chrome là gì? Hay đây không phải là mấu chốt, vấn đề đến từ lĩnh vực khác? Cảm ơn rât nhiều.

Câu trả lời:


122

Nếu bạn cần đặt chuỗi tiêu đề người dùng trong yêu cầu curl, bạn có thể sử dụng -Htùy chọn để đặt tác nhân người dùng như:

curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome

Sử dụng một công cụ proxy như Charles Proxy thực sự giúp thực hiện ngắn gọn một cái gì đó giống như những gì bạn đang yêu cầu. Đây là những gì tôi làm, sử dụng trang SO này làm ví dụ (kể từ tháng 7 năm 2015 sử dụng Charles phiên bản 3.10):

  1. Chạy Charles Proxy
  2. Đưa ra yêu cầu web bằng trình duyệt
  3. Tìm yêu cầu mong muốn trong Charles Proxy
  4. Nhấp chuột phải vào yêu cầu trong Charles Proxy
  5. Chọn 'Sao chép yêu cầu cURL'

Sao chép ví dụ Yêu cầu cURL trong Charles 3.10.2

Bây giờ bạn có một yêu cầu cURL mà bạn có thể chạy trong một thiết bị đầu cuối sẽ phản ánh yêu cầu mà trình duyệt của bạn đã thực hiện. Đây là yêu cầu của tôi đối với trang này trông như thế nào (với tiêu đề cookie đã bị xóa):

curl -H "Host: stackoverflow.com" -H "Cache-Control: max-age=0" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" -H "HTTPS: 1" -H "DNT: 1" -H "Referer: https://www.google.com/" -H "Accept-Language: en-US,en;q=0.8,en-GB;q=0.6,es;q=0.4" -H "If-Modified-Since: Thu, 23 Jul 2015 20:31:28 GMT" --compressed http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome

Sẽ tốt hơn rất nhiều nếu Charles hỗ trợ sao chép / xuất nhiều yêu cầu cURL trong một lần
khôn ngoan hơn

Một số API, chẳng hạn như ArcGIS, sẽ chỉ tôn trọng Accept: text/htmltiêu đề để buộc đầu ra HTML.
sventechie

2
curl -A agent_name là một bước cắt ngắn
ppostma1

23

Mở Công cụ dành cho nhà phát triển Chrome, chuyển đến tab Mạng, đưa ra yêu cầu của bạn (bạn có thể cần chọn "Lưu giữ Nhật ký" nếu trang làm mới). Tìm yêu cầu ở bên trái, nhấp chuột phải, "Sao chép dưới dạng cURL".


Nhưng cookie trong "Sao chép dưới dạng cURL" sẽ hết hạn sau vài phút. Ít nhất là trong trường hợp của hầu hết các trang web. Làm cách nào tôi có thể tự động hóa nó để tìm nạp cookie mới?
Gaurav Kansal

6

Kiểm tra các tiêu đề HTTP mà chrome đang gửi cùng với yêu cầu (Sử dụng tiện ích mở rộng trình duyệt hoặc proxy), sau đó thử gửi cùng một tiêu đề với CURL - Có thể là từng tiêu đề một cho đến khi bạn tìm ra (các) tiêu đề nào khiến yêu cầu hoạt động.

curl -A [user-agent] -H [headers] " http://something.com/api "


Tôi không quen với nó. Bạn có thể cho tôi một số ví dụ thực tế để đặt tác nhân người dùng thành chrome và các tiêu đề có thể không?
wdetac
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.