จะผ่านหน้าเข้าสู่ระบบด้วย Wget ได้อย่างไร


263

ฉันพยายามใช้Wgetเพื่อดาวน์โหลดหน้า แต่ฉันไม่สามารถผ่านหน้าจอเข้าสู่ระบบได้

ฉันจะส่งชื่อผู้ใช้ / รหัสผ่านโดยใช้ข้อมูลโพสต์ในหน้าเข้าสู่ระบบจากนั้นดาวน์โหลดหน้าจริงในฐานะผู้ใช้ที่ได้รับการรับรองความถูกต้องได้อย่างไร


คำตอบ:


342

ตามหน้าคู่มือ:

# 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

ตรวจสอบให้แน่ใจว่า--post-dataพารามิเตอร์มีการเข้ารหัสเป็นเปอร์เซ็นต์อย่างถูกต้อง(โดยเฉพาะเครื่องหมายแอมเปอร์แซนด์!) มิฉะนั้นคำขออาจล้มเหลว ตรวจสอบให้แน่ใจด้วยว่าuserและpasswordเป็นกุญแจที่ถูกต้อง; คุณสามารถค้นหาคีย์ที่ถูกต้องได้ด้วยการเปิด HTML ของหน้าเข้าสู่ระบบ (ดูที่คุณสมบัติ "ตรวจสอบองค์ประกอบ" ของเบราว์เซอร์ของคุณและค้นหาnameแอตทริบิวต์ในฟิลด์ชื่อผู้ใช้และรหัสผ่าน)


10
เพิ่ม --keep-session-cookies ไปยังคำสั่งแรกหรือครั้งที่สอง?
Felipe Alvarez

4
คุณไม่ต้องการ-p( --page-requisites) สำหรับสิ่งนี้
ændrük

14
นอกจากนี้ยังเป็นการเพิ่มมูลค่า--delete-afterให้กับการดึงข้อมูลครั้งแรกเพื่อที่คุณจะได้ไม่ต้องบันทึกหน้าผลลัพธ์จากการเข้าสู่ระบบ
Jim Hunziker

2
ฉันได้รับข้อผิดพลาดWGET64: missing URLฉันใส่คำสั่ง wget ทั้งหมดในบรรทัดเดียวและลบ `\ '
Mowgli

6
--keep-session-cookies เป็นสิ่งจำเป็นสำหรับคำสั่งแรกเท่านั้น มันบอกให้คำสั่งแรกที่จะรวมคุกกี้เซสชั่นเมื่อบันทึกคุกกี้ลงในไฟล์ คำสั่งที่สองเพียงแค่อ่านคุกกี้ทั้งหมดจากไฟล์ที่ให้ไว้
wadim

63

หากคุณต้องการใช้ครั้งเดียวคุณสามารถเข้าสู่ระบบผ่านเบราว์เซอร์และคัดลอกส่วนหัวที่ต้องการหลังจากนั้น:

ภาพหน้าจอ ใช้ "คัดลอกเป็นม้วน" ในเครือข่ายแท็บเครื่องมือสำหรับนักพัฒนา (โหลดหน้าหลังเปิด) และแทนที่ธงหัวขดของ-Hและ--dataมี wget ของและ--header--post-data


1
สุดยอดทางออก!
menteith

! น่ากลัว นอกจากนี้ยังชี้ให้ฉันเห็นตัวเลือกในการใช้ขดแทน wget เนื่องจากมันสามารถทำสิ่งเดียวกันและฉันไม่จำเป็นต้องเปลี่ยนพารามิเตอร์
มกราคม 19

ทางออกที่สะอาดและเรียบง่าย +1!
Kresimir Pendic

สิ่งนี้ใช้ได้สำหรับฉันในขณะwgetที่คุกกี้ที่ถูกต้องไม่ได้ ฉันสงสัยว่าเว็บเซอร์วิสจะตรวจสอบส่วนหัว GET ที่แตกต่างกันหลายแห่งแม้ดูเหมือนจะไม่สำคัญเช่น "User-Agent" หรือ "Cache-Control"
อาเธอร์

@ อาร์เธอร์สำหรับฉันทางออกนี้เป็นเพียงคนเดียวที่ทำงาน ฉันพยายามลบข้อมูลส่วนหัวออกจาก URL มากที่สุดและลงเอยด้วยข้อมูลคุกกี้เป็นหลัก ดังนั้นฉันสงสัยว่าจะwgetให้ข้อมูลผิดวิธี
Florian Blume

62

ฉันให้คุกกี้ของการเชื่อมต่อที่มีอยู่โดยตรงเพื่อใช้กับ - ไม่มีคุกกี้และส่วนหัวคำขอคุกกี้ HTTP ในกรณีของฉันมันคือการเข้าสู่ระบบของมหาวิทยาลัย Moodle ที่การเข้าสู่ระบบดูซับซ้อนมากขึ้น (ใช้คำขอหลายรายการพร้อมตั๋วเข้าสู่ระบบ) ฉันเพิ่ม --post-data เพราะมันเป็นคำขอ POST ตัวอย่างเช่นรับรายชื่อผู้ใช้ 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
เคล็ดลับที่ยอดเยี่ยม สิ่งนี้มีประโยชน์เมื่อคุณสามารถเข้าถึงคุกกี้จากเครื่องของคุณเองจากนั้นใช้จากเครื่องที่ไม่มีเครื่องอื่นจากบรรทัดคำสั่ง :)
Tuxdude

3
คุณสามารถตั้งค่าคุกกี้หลายรายการได้ในเวลาเดียวกัน - ส่วนหัว "คุกกี้: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C

29

ผมมีปัญหาเหมือนกัน. ทางออกของฉันคือการเข้าสู่ระบบผ่าน Chrome และบันทึกข้อมูลคุกกี้ลงในไฟล์ข้อความ นี้จะกระทำได้อย่างง่ายดายด้วยส่วนขยายของ Chrome: Chrome ขยายการส่งออก

เมื่อคุณได้รับข้อมูลคุกกี้นอกจากนี้ยังมีตัวอย่างเกี่ยวกับวิธีการใช้พวกเขาด้วย wget บรรทัดคำสั่งคัดลอกวางง่ายให้กับคุณ


1
น่าเสียดายที่ใช้ไม่ได้กับการเขียนสคริปต์อัตโนมัติ
Znik

1
คำถามไม่ได้ระบุการเขียนสคริปต์อัตโนมัติ วิธีนี้ช่วยให้ 99% ของงานเป็นไปโดยอัตโนมัติ
จะ Sheppard

1
น่าเสียดายที่ Google ต้องฉลาดเกินไปสำหรับเคล็ดลับนี้ ฉันยังได้รับหน้าเข้าสู่ระบบ
โยสิยาห์ Yoder

1
แน่นอนว่า Google ใช้ reCAPTCHAs ลับ ... อย่างที่ฉันเคยเห็นหลายแห่งการใช้ API แบบมาตรฐานเป็นทางเลือกที่ดีที่สุดในกรณีนี้
โยสิยาห์ Yoder

10

ฉันต้องการหนึ่งซับที่ไม่ดาวน์โหลดไฟล์ใด ๆ นี่คือตัวอย่างของการไพพ์เอาต์พุตคุกกี้ลงในคำขอถัดไป ฉันทดสอบสิ่งต่อไปนี้บน Gentoo เท่านั้น แต่ควรทำงานในสภาพแวดล้อมส่วนใหญ่ * * * * 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' (นี่คือหนึ่งบรรทัดแม้ว่าจะมีการหุ้มเบราว์เซอร์ของคุณ)

หากคุณต้องการบันทึกผลลัพธ์ไปยังไฟล์ให้เปลี่ยน-O -เป็น-O /some/file/name


9

คุณไม่ต้องการ cURL ในการทำข้อมูลแบบฟอร์มที่โพสต์ --post-data 'key1=value1&key2=value2'ทำงานได้ดี หมายเหตุ: คุณยังสามารถส่งชื่อไฟล์เพื่อ wget ด้วยข้อมูล POST ในไฟล์


8

หากพวกเขากำลังใช้การรับรองความถูกต้องพื้นฐาน:

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

หากพวกเขากำลังใช้ข้อมูลแบบฟอร์มที่โพสต์คุณจะต้องใช้บางอย่างเช่นcURLแทน


ฉันไม่สามารถเข้าถึงการเปลี่ยนแปลงอะไรบนเซิร์ฟเวอร์มันเป็นแบบอ่านอย่างเดียว
Señor Reginold Francis

7
ดังนั้น? สิ่งนี้ไม่ต้องการให้คุณเปลี่ยนแปลงอะไรบนเซิร์ฟเวอร์
ceejayoz

5

วิธีการแก้ปัญหาที่ใช้คมและ wget

หมายเหตุ: Lynx จะต้องมีการคอมไพล์ด้วยแฟล็ก --enable-persistent-cookiesเพื่อให้ทำงานได้

เมื่อคุณต้องการใช้ wget เพื่อดาวน์โหลดไฟล์บางไฟล์จากเว็บไซต์ที่ต้องเข้าสู่ระบบคุณเพียงแค่ต้องมีไฟล์คุกกี้ เพื่อสร้างไฟล์คุกกี้ฉันเลือก lynx คมเป็นเว็บเบราเซอร์ข้อความ ก่อนอื่นคุณต้องมีไฟล์กำหนดค่าสำหรับ lynx เพื่อบันทึกคุกกี้ สร้างไฟล์ lynx.cfg เขียนการกำหนดค่าเหล่านี้ลงในไฟล์

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

จากนั้นเริ่มต้นคมด้วยคำสั่งนี้:

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

หลังจากที่คุณป้อนชื่อผู้ใช้และรหัสผ่านแล้วเลือก 'เก็บฉันไว้ในพีซีเครื่องนี้' หรือสิ่งที่คล้ายกัน หากเข้าสู่ระบบสำเร็จคุณจะเห็นเว็บเพจข้อความสวยงามของเว็บไซต์ และคุณออกจากระบบ ในไดเรกทอรีปัจจุบันคุณจะพบไฟล์คุกกี้ชื่อเป็น cookie.file นี่คือสิ่งที่เราต้องการเพื่อ wget

จากนั้น wget สามารถดาวน์โหลดไฟล์จากเว็บไซต์ด้วยคำสั่งนี้

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz

2
แล้วถ้าการเข้าสู่ระบบต้องการจาวาสคริปต์ล่ะ ดูเหมือนจะไม่รองรับจาวาสคริปต์
Tiberiu

1

ตัวอย่างการดาวน์โหลดด้วยwgetบนเซิร์ฟเวอร์ลิงก์ไฟล์ขนาดใหญ่ที่สามารถรับได้ในเบราว์เซอร์ของคุณ

ตัวอย่างการใช้ Google Chrome

เข้าสู่ระบบที่คุณต้องการและกดดาวน์โหลด ไปดาวน์โหลดและคัดลอกลิงค์ของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเปิดDevToolsบนหน้าที่คุณเข้าสู่ระบบไปที่คอนโซลและรับคุกกี้โดยป้อนdocument.cookie

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ไปที่เซิร์ฟเวอร์และดาวน์โหลดไฟล์ของคุณ: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

ป้อนคำอธิบายรูปภาพที่นี่


คำตอบนี้ดูเหมือนจะไม่ได้ดีสำหรับ Google - มีคุกกี้สองหน้า!
โยสิยาห์ Yoder

แน่นอนว่า Google ใช้ reCAPTCHAs ลับ ... อย่างที่ฉันเคยเห็นหลายแห่งการใช้ API แบบมาตรฐานเป็นทางเลือกที่ดีที่สุดในกรณีนี้
โยสิยาห์ Yoder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.