Python urllib2 Войти на сайт minecraft.net

У меня проблема. Я пишу простой скрипт для входа в minecraft.net, а затем список всех классических серверов. Но когда я запускаю свой скрипт, он просто перенаправляет меня обратно на minecraft.net/login. Вот что я имею до сих пор:

import urllib2 import urllib import re url = "https://www.minecraft.net/login" page = urllib2.urlopen(url) data = page.read() page.close() authToken = re.search('name="authenticityToken"[\s]+value="(.+)"', data).group(1) data_dict = { "username": "USERNAME", "password": "PASSWORD", "remember": "true", #"redirect": "https://www.minecraft.net", "authenticityToken": authToken } print urllib.urlencode(data_dict) req = urllib2.Request(url, data=urllib.urlencode(data_dict)) page = urllib2.urlopen(req) data = page.read() page.close() 

Что я делаю неправильно?

Вы можете добавить модуль cookielib для входа на ваш сайт.

 #!/usr/bin/python import urllib, urllib2, cookielib, re login_url = "https://minecraft.net/login" cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) respon = opener.open(login_url).read() authToken = re.search('name="authenticityToken"[\s]+value="(.+)"', respon).group(1) data_dict = { "username": "USERNAME", "password": "PASSWORD", "remember": "true", "authenticityToken": authToken } login = opener.open(login_url, urllib.urlencode(data_dict)) logged_in = login.read() if login_url in logged_in: print 'Login failed' else: print 'Login OK' 

Как насчет использования Selenium вместо urllib ? Когда вы делаете сложные вещи, такие как аутентификация и т. Д., Я предпочитаю использовать Selenium как он похож на веб-браузер. Это решение требует установки Firefox.

Монтаж

 >>> sudo pip install selenium 

Код

 from selenium import webdriver # initialize the browser and go to the site. browser = webdriver.Firefox() url = 'https://www.minecraft.net/login' user_name = 'your_user_name' password = 'your_password' browser.get(url) # retrieve all necessary page elements user_name_field = browser.find_element_by_id('username') password_field = browser.find_element_by_id('password') user_name_field.send_keys(user_name) password_field.send_keys(password) sign_in_btn = browser.find_element_by_id('signin') # log in sign_in_btn.click() 

У меня нет учетной записи Minecraft, поэтому я не могу ее протестировать, но вы, вероятно, можете получить все серверы Minecraft благодаря таким методам, как:

  • browser.find_elements_by_partial_link_text
  • browser.find_elements_by_class_name
  • browser.find_elements_by_css_selector

Как правило, я рекомендую протестировать ваш код Selenium с помощью ipython , где вы можете увидеть работу браузера. (Установка: sudo pip install ipython )

В случае большого количества обработки Javascript, пожалуйста, добавьте следующие строки в код:

 browser = webdriver.Firefox() browser.browser.implicitly_wait(30) # seconds 

Если вы планируете дополнительно поддерживать другой браузер, вы можете поддержать его с помощью предложений try catch

 import sys browser = None try: browser = webdriver.Firefox() except Exception as e: try: browser = webdriver.Chrome() except Exception as e2: try: browser = webdriver.Safari() except Exception as e3: print 'Could not find Firefox, Chrome or Safari!' sys.exit(0) 

Это вложенное предложение try-except не является лучшим стилем программирования, но я уверен, что он поможет вам использовать его для ваших целей. Выполнение вкладок в поддержке IPython Selenium

  • Сафари
  • Fire Fox
  • Опера и
  • IE.

В моем случае я использовал Selenium в основном с Firefox.

Для любых полузасушливых HTTP-запросов вы должны использовать модуль запросов ( http://requests.readthedocs.org/en/latest/ ) вместо urllib. Это сэкономит вам много боли.

Вам нужно будет сделать что-то вроде:

 import requests import re data = requests.get("https://minecraft.net/login") auth_token = re.search('name="authenticityToken"[\s]+value="(.+)"', data).group(1) # If needed, you may have to urlencode all that. data_dict = { "username": "USERNAME", "password": "PASSWORD", "remember": "true", #"redirect": "https://www.minecraft.net", "authenticityToken": auth_token } logged_in_data = requests.post("https://minecraft.net/login", data_dict)