文档章节

Python+Selenium实现网易我的世界自动激活邀请码(不保证成功)

粉红薯
 粉红薯
发布于 2017/04/13 15:08
字数 1671
阅读 102
收藏 0

 

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())

 

© 著作权归作者所有

粉红薯
粉丝 2
博文 5
码字总数 2639
作品 0
合肥
私信 提问
Python+Selenium搭建UI自动化测试框架

本文原文来自GitHub个人主页 > Python+Selenium搭建UI自动化测试框架 Python语言是非常强大的编程语言,很多时候也拿来当脚本语言用。 Selenium是web应用测试工具,支持Java、Python等多种语...

FunGa
2015/09/06
7.8K
0
【穿穿APP产品优化建议】跟贴区

1. 主功能引导不够:上传图片定制功能、3D试衣功能与看看大家发的图是我们的三个重点功能,发图按钮更是我们的核心功能与需求,但放在主屏幕上方的位置会随着信息流上滑被遮挡。 修改建议:把...

穿穿李明
2016/03/08
10
3
从密码到token, 一个授权的故事

转载自公众号-码农翻身 原创 2017-07-03 老刘 码农翻身 1. 我把密码献给你 小梁开发了一个“信用卡管家”的程序 , 可以自动从邮箱中读取信用卡相关邮件,分析、汇总,形成一个报表。 小梁找...

mamadu
2017/08/21
0
0
java发送邮件遇到的问题

今天尝试用java.mail.jar来实现Java程序发送邮件的功能,遇到一些问题: 一、当使用QQ邮箱向网易邮箱发邮件时: 问题1:530错误,需要建立安全连接,报错如下: javax.mail.AuthenticationF...

Henrykin
2016/10/15
142
0
带着新人学springboot的应用10(springboot+定时任务+发邮件)

  接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件。      1.定时任务      定时任务可以设置精确到秒的准确时间去自动执行方法。      我要一个程序...

SEOwhywhy
2018/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

八、RabbitMQ的集群原理

集群架构 写在前面 RabbitMQ集群是按照低延迟环境设计的,千万不要跨越WAN或者互联网来搭建RabbitMQ集群。如果一定要在高延迟环境下使用RabbitMQ集群,可以参考使用Shovel和Federation工具。...

XuePeng77
今天
1
0
mac系统下,brew 安装mysql,用终端可以连接,navicat却连接不上?

问题: 1.报错? 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found 2.自己通过设置,已经把密......

写bug的攻城狮
昨天
2
0
老生常谈,HashMap的死循环

问题 最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。 由于HashMap...

群星纪元
昨天
5
0
拉普拉斯算子

拉普拉斯算子是二阶微分算子。 我们知道,一维离散信号一阶微分公式如下: 相应的,一维离散信号二阶微分公式如下: 由于图像有x和y两个方向,因此图像信号属于二维离散信号。其在x,y两个...

yepanl
昨天
3
0
记录"正则表达式"

详细请查看我的博客:https://blog.enjoytoshare.club/article/RegularExpression.html 1 写在前面 正则表达式(Regular Expression)在代码中常常简写为regex。正则表达式通常被用来检索、替...

wugenqiang
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部