2017-09-06 20 views
5

Tôi đánh giá cao những điều bạn đang làm ở đây. Thông thường tôi có thể tìm ra các vấn đề của tôi với sự trợ giúp của Stackoverflow, nhưng lần này tôi bị kẹt. Hy vọng rằng bạn có thể giúp tôi!Yêu cầu Python không thể đăng nhập

Câu hỏi khá đơn giản: cách đăng nhập trên this webpage sử dụng Yêu cầu của Python?

bước của tôi:

  1. Lấy url đăng nhập
  2. Cung cấp các chi tiết đăng nhập. Theo HTML, tôi cần cung cấp 'email' và 'mật khẩu'.
  3. Tạo một phiên làm việc và sử dụng bài để đăng nhập
  4. Kiểm tra HTML nếu đăng nhập thành công

Thật không may, cách tiếp cận dễ dàng dường như không làm việc trong trường hợp này. Ví dụ, đầu ra của details là:

<script> 
    dataLayer = [{ 
     'environment': 'production', 
     'loggedIn': '0', 
     'userCode': '', 
     'rank': '', 
     'totalBalance': '0', 
     'overAgeCasino': '0' 
    }]; 
</script> 

Rõ ràng, '0' của 'loggedIn' nên thay đổi để '1' nếu đăng nhập thành công.

Trong ví dụ, tôi thấy rằng bạn có thể phải thêm 'csrftoken' và điều này có thể được tìm thấy dưới dạng loại 'ẩn' trong HTML. Tuy nhiên, tên trong phần type = 'hidden' dường như không liên quan gì đến điều này và cũng không có giá trị (link to screenshot of HTML). Một nơi nào đó khác tôi đọc rằng một mã thông báo CSFR cũng được lưu giữ trong CookieJar, nhưng nó không phải là ở đó:

<RequestsCookieJar[<Cookie PHPSESSID=5dib6cf6kpvf29dsn725ljcec7 for .napoleongames.be/>, <Cookie locale=en_GB for .napoleongames.be/>, <Cookie user=false for .napoleongames.be/>]> 

Tôi thấy khó để tin rằng đăng nhập là không thể, nhưng tôi đã chạy ra khỏi ý tưởng . Nếu ai đó biết làm thế nào để làm điều đó với urllib (2), nó cũng hữu ích. Tôi không muốn sử dụng Selenium vì tôi không thể chạy trơn tru.

Code:

import requests 
    from bs4 import BeautifulSoup 
    from datetime import date 

date_str = str(date.today()) 
login_url = 'https://en-gb.sports.napoleongames.be/user/login' 
protected_url = 'proctected_url' 

payload = {'email': '[email protected]', 
      'password': '*********'} 

with requests.Session() as session: 
    session.get(login_url) 
    login_page = session.post(login_url, 
          data=payload) 

    html_body = BeautifulSoup(login_page.content, 'html.parser').find(
     name='body', attrs={'id': 'user_login'}) 
    details = html_body.findAll('script')[0] 
    page = session.get(protected_url) 

Headers:

{'Date': 'Wed, 06 Sep 2017 23:45:52 GMT', 'Server': 'Apache', 'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'Cache-Control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Pragma': 'no-cache', 'X-Frame-Options': 'SAMEORIGIN', 'X-Cache-Page': 'MISS', 'Set-Cookie': 'locale=en_GB; Expires=Mon, 05-Mar-2018 23:45:52 GMT; Domain=.napoleongames.be; Path=/, user=false; expires=Mon, 05-Mar-2018 23:45:52 GMT; Max-Age=15552000; path=/; domain=.napoleongames.be, loyalty=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.napoleongames.be', 'Strict-Transport-Security': 'max-age=15768000', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Content-Length': '10840', 'Connection': 'close', 'Content-Type': 'text/html'} 
+1

Thật không may là một số khung công tác trang web hiện đại phụ thuộc rất nhiều vào javascript, trong đó yêu cầu của khóa học không thể xử lý. Nếu công việc của bạn yêu cầu bạn phải thường xuyên loại bỏ các trang web hiện đại, tôi khuyên bạn nên làm quen với selen, nó rất tuyệt vời và giải quyết vấn đề này một cách dễ dàng. –

+0

@DanielleM. Có nhiều cách xung quanh javascript với các yêu cầu. [Liên kết] (https://stackoverflow.com/a/38081914/7073884) –

+0

@DanielleM. Không, nó chỉ là để cho vui.Tôi cần phải tìm ra các lỗi xảy ra khi tôi sử dụng Selenium. Đầu tiên tôi gặp vấn đề về đường dẫn mà giải pháp hạ cấp, nhưng sau đó đã xảy ra sự cố với geckodriver và sau đó giải pháp được đề xuất là nâng cấp, do đó tôi tập trung vào các yêu cầu – Rob

Trả lời

3

Khi nộp một mẫu đơn, bạn nên tham gia trong việc xem xét các lĩnh vực khác bên trong các thẻ hình thức không chỉ là lĩnh vực bạn cần phải điền lên. Trong trường hợp này, khi bạn nhìn vào bên trong nguồn trang, sẽ có thêm một trường nữa được điền khi đăng nhập.

Bạn có thể thử thêm rằng trong tải trọng của bạn:

payload = {'email': '[email protected]', 
      'password': '*********' 
      'buttons_app_service_user_login[buttonClicked]': 'buttons_app_service_user_login-save'} 

Hãy cho tôi biết nếu mà làm việc hoặc nếu bạn gặp vấn đề khác.

+0

Thành công, cảm ơn rất nhiều! Vì vậy, chìa khóa là sử dụng 'id' thay vì 'giá trị' (trống) – Rob

+0

Có giá trị trống khi tải ban đầu, khi bạn cố gắng gửi biểu mẫu đăng nhập với tên người dùng và mật khẩu trống, bạn sẽ thấy giá trị đang được phổ biến. – chad

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