2011-11-29 111 views
14

Tôi đang cố gắng đăng nhập vào page bằng cách sử dụng Python.Đăng nhập vào trang web bằng python

tôi đã cố gắng sử dụng các bước được mô tả trên other Stack Overflow post này, và nhận được đoạn mã sau:

import urllib, urllib2, cookielib 

username = 'username' 
password = 'password' 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
login_data = urllib.urlencode({'username' : username, 'j_password' : password}) 
opener.open('http://friends.cisv.org/index.cfm', login_data) 
resp = opener.open('http://friends.cisv.org/index.cfm?fuseaction=activities.list') 
print resp.read() 

nhưng điều đó đã cho tôi kết quả như sau:

<SCRIPT LANGUAGE="JavaScript"> 
    alert('Sorry. You need to log back in to continue. You will be returned to the home page when you click on OK.'); 
    document.location.href='index.cfm'; 
</SCRIPT> 

Tôi đang làm gì sai?

+0

Từ phần mở rộng .cfm trên tập lệnh xử lý của bạn, tôi cho rằng bạn đang sử dụng chương trình phụ trợ Coldfusion để thực sự xử lý các thông tin đăng nhập này. Chúng ta cần phải biết nội dung và thủ tục nằm trong tập tin đó là gì, bởi vì phản hồi sẽ được đưa vào python, nhưng Coldfusion sẽ chuyển javascript và chuyển hướng. Vấn đề này là serverside và không phải trong khách hàng python. – DeaconDesperado

+0

Tôi cho rằng OP không sở hữu trang web và chỉ hy vọng tương tác với trang web theo chương trình với tư cách là người dùng. Việc xác thực trang web không có vấn đề gì cả, bạn chỉ cần xem dữ liệu biểu mẫu nào được gửi khi đăng nhập và cung cấp cùng một dữ liệu. Không cần phải biết những gì đang xảy ra phía máy chủ. Xem ví dụ của tôi dưới đây. – Acorn

Trả lời

29

Tôi khuyên bạn nên sử dụng mô-đun requests tuyệt vời.

Mã bên dưới sẽ giúp bạn đăng nhập vào trang web và duy trì cookie trong suốt thời gian của phiên.

import requests 
import sys 

EMAIL = '' 
PASSWORD = '' 

URL = 'http://friends.cisv.org' 

def main(): 
    # Start a session so we can have persistant cookies 
    session = requests.session(config={'verbose': sys.stderr}) 

    # This is the form data that the page sends when logging in 
    login_data = { 
     'loginemail': EMAIL, 
     'loginpswd': PASSWORD, 
     'submit': 'login', 
    } 

    # Authenticate 
    r = session.post(URL, data=login_data) 

    # Try accessing a page that requires you to be logged in 
    r = session.get('http://friends.cisv.org/index.cfm?fuseaction=user.fullprofile') 

if __name__ == '__main__': 
    main() 
+0

Cảm ơn, điều đó đã hoạt động như một sự quyến rũ! – iomartin

+0

Trong giải pháp trên sau "r = session.get ('http://friends.cisv.org/index.cfm?fuseaction=user.fullprofile')" –

+0

Giải pháp này không thể chấp nhận được khi bạn không có quyền kiểm soát và khả năng cài đặt thư viện bên ngoài. Một bản địa của giải pháp hộp được ưa thích. – KoCMoHaBTa

3

Cụm từ "đăng nhập" không may là rất mơ hồ. Mã được đưa ra ở đây rõ ràng là đã cố đăng nhập bằng cách sử dụng xác thực cơ sở HTTP. Tôi muốn đặt cược đoán rằng trang web này muốn bạn gửi tên người dùng và mật khẩu trong một số loại biểu mẫu POST (đó là cách hầu hết các biểu mẫu đăng nhập dựa trên web hoạt động). Trong trường hợp này, bạn cần gửi yêu cầu POST phù hợp và giữ lại bất kỳ cookie nào được gửi lại cho bạn cho các yêu cầu trong tương lai. Thật không may tôi không biết điều này sẽ là gì, nó phụ thuộc vào trang web. Bạn sẽ cần phải tìm ra cách nó thường ghi lại một người dùng và cố gắng làm theo mẫu đó.

Các vấn đề liên quan