2009-08-24 30 views
194

Tôi đang cố gắng sử dụng Wget để tải xuống một trang nhưng tôi không thể vượt qua màn hình đăng nhập.Làm thế nào để vượt qua trang đăng nhập với Wget?

Làm cách nào để gửi tên người dùng/mật khẩu bằng dữ liệu bài đăng trên trang đăng nhập và sau đó tải xuống trang thực tế làm người dùng được xác thực?

+2

Đối với curl: http://stackoverflow.com/questions/12399087/curl-to-access-a-page-that-requires-a-login-from-a-different-page –

Trả lời

276

Dựa trên các trang hướng dẫn:

# Log in to the server. This only needs to be done once. 
wget --save-cookies cookies.txt \ 
    --keep-session-cookies \ 
    --post-data 'user=foo&password=bar' \ 
    --delete-after \ 
    http://server.com/auth.php 

# Now grab the page or pages we care about. 
wget --load-cookies cookies.txt \ 
    http://server.com/interesting/article.php 

Hãy chắc chắn rằng các tham số --post-data là đúng percent-encoded (đặc biệt là ampersands!) Hoặc theo yêu cầu có thể sẽ thất bại. Đồng thời, đảm bảo rằng userpassword là các khóa chính xác; bạn có thể tìm ra các khóa chính xác bằng cách xoay HTML của trang đăng nhập (xem xét tính năng "kiểm tra phần tử" của trình duyệt và tìm thuộc tính name trên các trường tên người dùng và mật khẩu).

+9

thêm --keep-session-cookies vào lệnh đầu tiên hoặc lệnh thứ hai? –

+4

Bạn không cần '-p' (' --page-requisites') cho việc này. –

+12

Nó cũng đáng để thêm '--delete-after' vào lần truy xuất đầu tiên, do đó bạn không phải dừng lưu trang kết quả khi đăng nhập. –

7

Nếu họ đang sử dụng xác thực cơ bản:

wget http://username:[email protected]/page.html 

Nếu họ đang sử dụng dữ liệu mẫu được đăng, bạn sẽ cần phải sử dụng một cái gì đó giống như cURL để thay thế.

+0

Tôi không có truy cập để thay đổi bất cứ điều gì trên máy chủ, nó chỉ đọc –

+7

Vì vậy? Không có điều này đòi hỏi bạn phải thay đổi bất cứ điều gì trên máy chủ. – ceejayoz

8

Bạn không cần cURL để làm dữ liệu Biểu mẫu đã đăng. --post-data 'key1=value1&key2=value2' hoạt động tốt. Lưu ý: bạn cũng có thể chuyển tên tệp để wget với dữ liệu POST trong tệp.

21

Tôi đã gặp vấn đề tương tự. Giải pháp của tôi là đăng nhập thông qua Chrome và lưu dữ liệu cookie vào một tệp văn bản. Điều này có thể dễ dàng thực hiện với tiện ích mở rộng này của Chrome: Chrome cookie.txt export extension.

Khi bạn nhận dữ liệu cookie, cũng có một ví dụ về cách sử dụng chúng với wget. Một dòng lệnh copy-paste đơn giản được cung cấp cho bạn.

+1

tiếc là không áp dụng được trong tự động viết mã – Znik

40

Tôi trực tiếp cung cấp cookie của một kết nối hiện có để wget với --no-cookie và tiêu đề yêu cầu HTTP Cookie. Trong trường hợp của tôi, đó là đăng nhập vào đại học Moodle, nơi đăng nhập có vẻ phức tạp hơn (sử dụng nhiều yêu cầu với một vé đăng nhập). Tôi đã thêm --post-data vì đó là yêu cầu POST. Ví dụ, nhận được tất cả Moodle danh sách người sử dụng:

wget --no-cookies --header "Cookie: <name>=<value>" --post-data 'tab=search&name=+&personsubmit=Rechercher&keywords=&keywordsoption=allmine' https://moodle.unistra.fr/message/index.php

+2

Mẹo tuyệt vời. Điều này rất hữu ích khi bạn có thể truy cập cookie từ máy của riêng bạn và sau đó sử dụng nó từ một máy không có đầu khác từ dòng lệnh. :) – Tuxdude

20

Nếu bạn cần nó cho một thời gian sử dụng, bạn có thể đăng nhập thông qua trình duyệt và sao chép tiêu đề cần thiết sau:

screenshot Sử dụng "Copy như cURL "trong tab Mạng của Công cụ dành cho nhà phát triển (tải lại trang sau khi mở) và thay thế cờ tiêu đề của curl -H bằng w23's --header.

7

Tôi muốn một lớp lót không tải xuống bất kỳ tệp nào; đây là một ví dụ về đường dẫn đầu ra của cookie vào yêu cầu tiếp theo. Tôi chỉ thử nghiệm sau đây trên Gentoo, nhưng nó phải làm việc trong hầu hết các * môi trường nix:

wget -q -O /dev/null --save-cookies /dev/stdout --post-data 'u=user&p=pass' 'http://example.com/login' | wget -q -O - --load-cookies /dev/stdin 'http://example.com/private/page' (đây là một dòng, mặc dù nó có khả năng kết thúc tốt đẹp trên trình duyệt của bạn)

Nếu bạn muốn đầu ra được lưu vào một , thay đổi -O - tới -O /some/file/name

0

Tôi đã sử dụng một giải pháp sử dụng lynx và wget. Khi bạn muốn sử dụng wget để tải xuống một số tệp từ một trang web yêu cầu đăng nhập, bạn chỉ cần một tệp cookie. Để tạo tệp cookie, tôi chọn lynx. lynx là trình duyệt web văn bản. Trước tiên, bạn cần tệp cấu hình cho lynx để lưu cookie. Tạo tệp lynx.cfg. Viết những cấu hình này vào tập tin.

SET_COOKIES:TRUE 
ACCEPT_ALL_COOKIES:TRUE 
PERSISTENT_COOKIES:TRUE 
COOKIE_FILE:cookie.file 

Sau đó bắt đầu lynx với lệnh này:

lynx -cfg=lynx.cfg http://the.site.com/login 

Sau khi bạn nhập vào tên người dùng và mật khẩu, và chọn 'bảo hộ tôi trên máy này' hoặc cái gì đó tương tự. Nếu đăng nhập thành công, bạn sẽ thấy một trang web văn bản đẹp của trang web. Và bạn đăng xuất. Trong thư mục hiện tại, bạn sẽ tìm thấy tệp cookie có tên là cookie.file. Đây là những gì chúng ta cần cho wget.

Sau đó, wget có thể tải xuống tệp từ trang web bằng lệnh này.

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz 
Các vấn đề liên quan