Làm thế nào để vượt qua trang đăng nhập với Wget?


263

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 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ế với tư cách là người dùng được xác thực?


Câu trả lời:


342

Dựa trên 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

Đảm bảo --post-datatham số được mã hóa chính xác theo phần trăm (đặc biệt là ký hiệu!) Hoặc yêu cầu có thể sẽ thất bại. Cũng đảm bảo rằng userpasswordlà các phím chính xác; bạn có thể tìm ra các khóa chính xác bằng cách kiểm tra HTML của trang đăng nhập (xem phần tính năng kiểm tra phần tử của trình duyệt của bạn và tìm namethuộc tính trên các trường tên người dùng và mật khẩu).


10
thêm --keep-session-cookies vào lệnh đầu tiên hay thứ hai?
Felipe Alvarez

4
Bạn không cần -p( --page-requisites) cho việc này.
ændrük

14
Cũng đáng để thêm --delete-aftervào lần truy xuất đầu tiên để cuối cùng bạn không lưu trang kết quả khi đăng nhập.
Jim Hunziker

2
Tôi đang gặp lỗi WGET64: missing URLTôi đặt toàn bộ lệnh wget trong một dòng và xóa `\`
Mowgli

6
--keep-session-cookies chỉ cần cho lệnh đầu tiên. Nó báo lệnh đầu tiên bao gồm cookie phiên khi lưu cookie vào tệp. Lệnh thứ hai chỉ cần đọc tất cả các cookie từ tệp được cung cấp.
wadim

63

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

ảnh chụp màn hình Sử dụng "Sao chép dưới dạng 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--databằng wget --header--post-data.


1
Giải pháp tuyệt vời!
Menteith

Tuyệt vời! Cũng chỉ cho tôi tùy chọn sử dụng curl thay vì wget, vì nó có thể làm điều tương tự và tôi thậm chí không cần thay đổi các tham số.
ngày

Giải pháp rất sạch sẽ và đơn giản, +1!
Kresimir Pendic

Điều này làm việc cho tôi, trong khi wgetvới cookie chính xác thì không; Tôi nghi ngờ dịch vụ web kiểm tra nhiều tiêu đề GET khác nhau, thậm chí những tiêu đề dường như không quan trọng như "Tác nhân người dùng" hoặc "Kiểm soát bộ đệm".
Arthur

@Arthur đối với tôi giải pháp này là người duy nhất làm việc. Tôi đã cố gắng xóa càng nhiều dữ liệu tiêu đề khỏi URL càng tốt và về cơ bản là dữ liệu cookie. Vì vậy, tôi nghi ngờ wgetcung cấp dữ liệu một cách sai lầm.
Florian Blume

62

Tôi trực tiếp đưa cookie của một kết nối hiện có để wget với --no-cookies và tiêu đề yêu cầu HTTP Cookie. Trong trường hợp của tôi, đó là thông tin đăng nhập của trường đạ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à một yêu cầu POST. Ví dụ: lấy tất cả danh sách người dùng Moodle:

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


7
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 chính mình và sau đó sử dụng nó từ một máy không đầu khác từ dòng lệnh. :)
tuxude

3
Bạn cũng có thể đặt nhiều cookie cùng một lúc, --header "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C

29

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

Khi bạn nhận được 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 sao chép-dán đơn giản được cung cấp cho bạn.


1
tiếc là không áp dụng được trong kịch bản tự động
Znik

1
Câu hỏi không chỉ định kịch bản tự động. Giải pháp này cho phép 99% công việc được tự động hóa.
Will Sheppard

1
Thật không may, Google phải quá thông minh cho thủ thuật này. Tôi vẫn nhận được một trang đăng nhập.
Josiah Yoder

1
Tất nhiên, Google sử dụng các reCAPTCHA bí mật ... như tôi đã thấy rất nhiều nơi, sử dụng API lập trình tiêu chuẩn là tùy chọn thiết thực nhất trong trường hợp này.
Josiah Yoder

10

Tôi muốn một lớp lót không tải xuống bất kỳ tập tin nào; đây là một ví dụ về đường ống đầu ra cookie vào yêu cầu tiếp theo. Tôi chỉ thử nghiệm những điều sau trên Gentoo, nhưng nó sẽ hoạt động 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 tệp, hãy đổi -O -thành-O /some/file/name


9

Bạn không cần cURL để thực hiện 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.


8

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

wget http://username:password@www.domain.com/page.html

Nếu họ đang sử dụng dữ liệu biểu mẫu đã gửi, thay vào đó , bạn sẽ cần sử dụng một cái gì đó như cURL .


Tôi không có quyền truy cập để thay đổi bất cứ điều gì trên máy chủ, nó chỉ được đọc
Señor Reginold Francis

7
Vì thế? Không ai trong số này yêu cầu bạn thay đổi bất cứ điều gì trên máy chủ.
ceejayoz

5

Một giải pháp sử dụng lynx và wget.

Lưu ý: Lynx phải được biên dịch với --enable-continent-cookies cờ để làm việc này

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 tin cookie, tôi chọn lynx. lynx là một trình duyệt web văn bản. Trước tiên, bạn cần một tệp cấu hình cho lynx để lưu cookie. Tạo một tập tin lynx.cfg. Viết các 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 tên người dùng và mật khẩu, và chọn 'bảo vệ tôi trên máy tính này' hoặc một 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 một 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 tập tin 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

2
Nếu đăng nhập yêu cầu javascript thì sao? lynx dường như không hỗ trợ javascript.
Tiberiu

1

Ví dụ để tải về với wget trên máy chủ một liên kết tệp lớn có thể được lấy trong trình duyệt của bạn.

Ví dụ: sử dụng Google Chrome.

Đăng nhập nơi bạn cần, và nhấn tải xuống. Đi để tải về và sao chép liên kết của bạn.

nhập mô tả hình ảnh ở đây

Sau đó mở DevTools trên trang nơi bạn đăng nhập, truy cập Bảng điều khiển và nhận cookie của bạn, bằng cách nhậpdocument.cookie

nhập mô tả hình ảnh ở đây

Bây giờ, đi đến máy chủ và tải xuống tệp của bạn: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

nhập mô tả hình ảnh ở đây


Câu trả lời này dường như không phù hợp với Google - nơi có hai trang cookie!
Josiah Yoder

Tất nhiên, Google sử dụng các reCAPTCHA bí mật ... như tôi đã thấy rất nhiều nơi, sử dụng API lập trình tiêu chuẩn là tùy chọn thiết thực nhất trong trường hợp này.
Josiah Yoder
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.