Python urllib2登录到minecraft.net

时间:2013-12-06 15:45:23

标签: python login urllib2 minecraft

我遇到了问题。我正在编写一个简单的脚本来登录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()

我做错了什么?

3 个答案:

答案 0 :(得分:4)

使用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支持

中完成标签页
  • Safari浏览器
  • 火狐
  • Opera和
  • IE。

就我而言,我主要使用Selenium和Firefox。

答案 1 :(得分:3)

对于任何类型的半复杂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)

答案 2 :(得分:2)

您可以添加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'