4/25更新:目前激活的地址已经改为http://mc.163.com/fm/
说明:当前实现的是网易我的世界http://mc.163.com/网页的半自动登录+随机生成邀请码+自动激活。
半自动登录:因登录时,点击登录按钮后,还会出现滑块验证码需要验证,目前还没对这块进行处理,所以只能算是半自动。
自动激活:根据随机生成的邀请码自动执行激活操作,激活失败后,会不断尝试,直到出现异常退出。
激活成功与否判断:我是根据点击激活按钮后是否弹出了激活失败的窗口来判断激活成功与否的,因为没有实际激活成功过,所以此种方法是否可行还有待商议。
验证码生成规则问题:根据目前我所知的邀请码,其规则是5位数字+6位小写字母随机组合,正确与否不敢保证。
代码分为两部分:一部分是半自动登录+自动激活的(McLogin.py);一部分是随机生成邀请码的(GenerateRandomString.py)
以下直接贴两部分代码,有空分详情分解说明。
McLogin.py
# coding=utf-8
'''
Created on 2017-4-12
@author: cocoas
@ReadMe: mc 自动登录、自动激活爬虫
'''
from selenium import webdriver
import os
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
from src.vertify import GenerateRandomString
#chrome驱动路径
CHROME_DRIVER_PATH = "D:\...\chromedriver_win32\chromedriver.exe"
#将chrome驱动路径加入环境变量
os.environ["webdriver.chrome.driver"] = CHROME_DRIVER_PATH
#chrome 对象
chrome = webdriver.Chrome(CHROME_DRIVER_PATH)
#地址
URL = "http://mc.163.com/"
#超时时间(s)
TIME_OUT = 60
#登录邮箱
EMAIL = "xxx@163.com"
#登录密码
PASSWORD = "xxx"
#尝试次数
trial_times = 0
'''第一步:浏览器打开MC主页'''
def open_url(url):
'''
url:待打开网址
'''
#设置网页加载超时时间(5分钟)
chrome.set_page_load_timeout(60*5)
#浏览器打开
chrome.get(URL)
# print(chrome.page_source)
#等待登录窗口加载完成
try:
WebDriverWait(chrome,TIME_OUT).until(EC.presence_of_element_located((By.ID,"login")))
except TimeoutException:
print(u"【登录框】加载失败")
return False
print(u"【登录框】加载成功")
# f = open("mc.html","wb")
# f.write(chrome.page_source.encode("utf-8"))
login()
return True
'''第二步:模拟登录'''
def login():
#切换到登录窗口frame
chrome.switch_to.frame(chrome.find_elements_by_tag_name("iframe")[0])
#查找账号输入框
print(u"正在查找邮箱输入框")
elem_email = chrome.find_element_by_name("email")
if elem_email:
print(u"成功查找到邮箱输入框")
else:
print(u"查找邮箱输入框失败")
return False
#填充账号框内容
for ch in EMAIL:
elem_email.send_keys(ch)
#查找密码输入框
print(u"正在查找密码输入框")
elem_passw = chrome.find_element_by_name("password")
if elem_passw:
print(u"成功查找到密码输入框")
else:
print(u"查找密码输入框失败")
return False
#填充密码框内容
for ch in PASSWORD:
elem_passw.send_keys(ch)
#查找登录按钮
print(u"正在查找登录按钮")
elem_login = chrome.find_element_by_id("dologin")
if elem_login:
print(u"成功查找到登录按钮")
else:
print(u"查找登录按钮失败")
return False
#模拟点击登录按钮
elem_login.click()
#睡眠10秒,等待手动处理滑块验证
print(u"######等待用户手动输入滑块验证码...######")
print(u"######请在15秒内完成输入######")
time.sleep(15)
#再次提交登录按钮
elem_login.click()
pop_verify_input_window()
return True
'''第三步:弹出激活邀请码输入窗口'''
def pop_verify_input_window():
#等待激活邀请码按钮出现
try:
WebDriverWait(chrome,TIME_OUT).until(EC.presence_of_element_located((By.CLASS_NAME,"right-wrap")))
except TimeoutException:
print(u"未找到激活邀请码按钮")
return False
#查找激活邀请码按钮
elem_verify = chrome.find_element_by_class_name("right-wrap")
if elem_verify:
print(u"成功查找到激活邀请码按钮")
else:
print(u"查找激活邀请码失败")
return False
#点击激活邀请码按钮
elem_verify.click()
time.sleep(5)
#等待激活邀请码弹窗加载完成
try:
WebDriverWait(chrome,TIME_OUT).until(EC.presence_of_element_located((By.CLASS_NAME,"gift-btn")))
except TimeoutException:
print(u"加载激活邀请码窗口失败")
return False
print(u"加载激活邀请码窗口成功")
verify_code(GenerateRandomString.random_string())
return True
'''第四步:邀请码批量验证'''
def verify_code(code):
global trial_times
trial_times +=1
print("**************************************************")
print("**************************************************")
print("********************第%d次尝试激活*****************"%trial_times)
print("*********正在尝试激活邀请码:%s*************"%code)
print("**************************************************")
print("**************************************************")
#查找邀请码输入框
elem_code = chrome.find_element_by_class_name("gift-num")
if elem_code:
print(u"成功查找到邀请码输入框")
else:
print(u"查找邀请码输入框失败")
return False
#清空邀请码输入框内容
if elem_code.is_displayed():
elem_code.clear()
#输入邀请码
for char in code:
elem_code.send_keys(char)
#查找激活按钮
elem_submit = chrome.find_element_by_class_name("gift-btn")
if elem_submit:
print(u"成功查找到激活按钮")
else:
print(u"查找激活按钮失败")
return False
#点击激活按钮
elem_submit.click()
verify_result()
return True
'''第五步:判断激活成功与否(通过判断激活失败的弹窗是否弹出)'''
def verify_result():
#睡眠15秒,等待激活结果弹窗加载完成
time.sleep(15)
elem_fail = None
try:
#查找激活失败窗口
elem_fail = chrome.find_element_by_class_name("alert_wrap")
except Exception:
print(u"查找激活失败窗口异常:不用关闭窗口,继续尝试激活")
#等待10秒后,重新执行激活操作
verify_code(GenerateRandomString.random_string())
return False
if elem_fail:
print(u"成功查找到激活失败窗口:激活失败")
#关闭激活失败弹窗
close_fail_window()
return False
else:
print(u"查找激活失败窗口失败:可能激活成功")
return True
'''第六步:关闭激活失败提示弹窗'''
def close_fail_window():
#查找激活失败窗口的关闭按钮
elem_close = chrome.find_element_by_class_name("alertClose")
if elem_close:
print(u"成功查找到关闭弹窗按钮")
else:
print(u"查找关闭弹窗按钮失败")
return False
#点击关闭按钮
elem_close.click()
#等待10秒后,重新执行激活操作
verify_code(GenerateRandomString.random_string())
return True
if __name__ == "__main__":
open_url(URL)
GenerateRandomString.py
# coding=utf-8
'''
Created on 2017-4-13
@author: cocoas
@ReadMe: 随机生成数字+字母的字符串
'''
import string
import random
#随机生成一个数字方法
def random_number():
return random.randint(0,9)
#随机生成一个字母
def random_latter():
#生成一个范围在0~25的随机数
index = random.randint(0,25)
return string.ascii_lowercase[index]
#随机生成指定位数的数字
def random_numbers(count = 5):
'''
count:数字位数
'''
numbers = []
while count >0:
numbers.append(str(random_number()))
count -=1
return numbers
#随机生成指定位数的字母组成的字符串
def random_latters(count = 6):
'''
count:字母位数
'''
latters = []
while count >0:
latters.append(random_latter())
count -=1
return latters
#随机生成11位的数字(5位)+字母(6位)组合字符串
def random_string():
s = ""
#随机生成一个5位的数字列表和一个6位的字母列表,组成新的初始列表
str_list = random_numbers()
str_list +=random_latters()
# print(u"原始随机字符串:","".join(str_list))
#循环每次从str_list中取出一个字符,加入新的字符串中,直到str_list为空为止
length = len(str_list)
while length>0:
#随机生成一个0——length-1的数字
index = random.randint(0,length-1)
#从str_list中取出index位置的字符,放入到str中
s += str_list[index]
#从str_list中移除index位置的字符
del str_list[index]
#从新获取str_list长度
length = len(str_list)
return s
if __name__ == "__main__":
print(random_string())