Python urllib2 登录到 minecraft.net

Jad*_*una 4 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()
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Jon*_*Jon 5

使用Selenium而不是怎么样urllib?在做诸如身份验证等复杂的事情时。我更喜欢使用Selenium它,因为它就像网络浏览一样。此解决方案需要安装 Firefox。

安装

>>> sudo pip install selenium
Run Code Online (Sandbox Code Playgroud)

代码

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()
Run Code Online (Sandbox Code Playgroud)

我没有 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
Run Code Online (Sandbox Code Playgroud)

如果您打算额外支持另一个浏览器,您可以使用 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)
Run Code Online (Sandbox Code Playgroud)

这个嵌套try-except子句不是最好的编程风格,但我相信它可以帮助您将它用于您的目的。在IPython Selenium支持中完成选项卡

  • 苹果浏览器
  • 火狐
  • 歌剧和
  • IE。

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