2011-04-30 35 views
6

Tôi muốn viết một kịch bản Python để tự động đăng nhập vào tài khoản sử dụng băng thông rộng của tôi. Tôi chưa bao giờ gửi POST trước và tôi đang gặp rắc rối với nó.Python 3, urllib POST gửi

import urllib.request, urllib.parse, urllib.error 
import socket 

try: 
    details = urllib.parse.urlencode({ 'IDToken1': 'USERNAME', 'IDToken2': 'PASSWORD' }) 
    url = urllib.request.Request('https://login1.telecom.co.nz/distauth/UI/Login?realm=XtraUsers&goto=https%3A%2F%2Fwww.telecom.co.nz%3A443%2Fjetstreamum%2FxtraSum%3Flink%3Drdt', details) 
    url.add_header("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13") 

    responseData = urllib.request.urlopen(url).read().decode('utf8', 'ignore') 
    responseFail = False 

except urllib.error.HTTPError as e: 
    responseData = e.read().decode('utf8', 'ignore') 
    responseFail = False 

except urllib.error.URLError: 
    responseFail = True 

except socket.error: 
    responseFail = True 

except socket.timeout: 
    responseFail = True 

except UnicodeEncodeError: 
    print("[x] Encoding Error") 
    responseFail = True 

print(responseData) 

Từ HTML Tôi có nguồn gốc mà IDToken1 là id tên truy cập và IDToken2 là id mật khẩu.

Đây là vấn đề của tôi:

  • Khi tôi nhập đúng tên người dùng và mật khẩu, tải trang đăng nhập, nhưng:

  • Khi tôi nhập tên người dùng hoặc mật khẩu không chính xác, tôi nhận được một trang có nội dung:

    Máy chủ này đã gặp phải lỗi nội bộ ngăn không cho nó thực hiện yêu cầu của bạn. Nguyên nhân có khả năng nhất là cấu hình sai. Vui lòng yêu cầu quản trị viên tìm kiếm thư trong nhật ký lỗi của máy chủ.

+0

Vâng, điều này là rất khó khăn mà không nhìn thấy trang thực tế bạn đang sử dụng ... có lẽ bạn nên kiểm tra những gì đang thực sự được gửi bởi trình duyệt của bạn với các dev Chrome công cụ hoặc gói sniffer như Wireshark? – Strayer

Trả lời

7
details = urllib.parse.urlencode({'IDToken1': 'USERNAME', 'IDToken2': 'PASSWORD'}) 

Thêm dòng sau:

details = details.encode('UTF-8') 
0

Điều đó có thể do thiết kế. Điều gì sẽ xảy ra nếu bạn làm điều đó trong một trình duyệt? Thực tế là nó hoạt động với dữ liệu chính xác có nghĩa là bạn đang làm đúng.