自动化实现通过邮箱注册网站用户的实践

1,346 阅读4分钟

一、需求背景

在做的一个项目需要注册大量某个网站的用户,利用多个用户获取某些资源,比如利用每个用户的免费使用额度查询数据等。手工操作进行用户注册很浪费人力,于是尝试写脚本自动化实现。

二 、任务拆解

  1. 邮箱账号准备
  2. 在网站进行注册
  3. 邮箱接收验证码,回填网站
  4. 完成新用户登录

三、提前准备

1. 邮箱账号

在邮箱账号准备方面比较棘手,国内大多数标准邮箱服务都需要绑定手机号。搜索了一下“邮箱接码”、“临时邮箱”,发现了一个不错的适合注册不重要平台的邮箱服务——Snapmail。

Snapmail介绍

www.snapmail.cc/#/

Snapmail适用场景

不想收到垃圾邮件,不想暴露隐私,你可以用xx@snapmail.cc去注册网站,保护你的真实邮箱。

其他临时邮箱不具备的便捷性:

  1. 提供了API,方便在自动化测试中使用
  2. 可以用任意Snapmail邮箱地址去注册网站,然后再到Snapmail网站上添加地址,接收邮件

2. Selenium运行环境准备

笔者用Python+Selenium编写自动化脚本,提前把运行环境安装配置好,此类教程随便搜索一下都可以找到,这里不再赘述。

需要准备的环境:

python+selenium+chrome+chrome-driver

其中chrome-driver和chrome的对应关系可以在这里查找:

chromedriver.chromium.org/downloads

四、用Selenium实现自动化注册

1. 首先编写打开网站、进行注册的功能

首先准备要注册的username,同时可作为Snapmail邮箱地址的前缀。比如采用小写字母和数字的组合生成随机字符串作为username:

def generate_random_string():
    characters = string.ascii_lowercase + string.digits
    random_string = ''.join(random.choice(characters) for _ in range(12))
    return random_string

批量生成一批用户名,另外保存到一个文件,维护好username和对应的密码,然后就可以用这些用户名和密码进行注册了:

def signUp(username,pwd):
    driver = uc.Chrome()
    driver.get(WEB_URL)
    time.sleep(3)
    driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div[1]/div/header[2]/nav/div[2]/ul/li[7]/a").click()
    time.sleep(5)
    driver.find_element(By.NAME, "username").click()
    driver.find_element(By.NAME, "username").send_keys(username)
    driver.find_element(By.NAME, "email").click()
    driver.find_element(By.NAME, "email").send_keys(username+"@snapmail.cc")
    driver.find_element(By.NAME, "password").click()
    driver.find_element(By.NAME, "password").send_keys(pwd)
    driver.find_element(By.CSS_SELECTOR, "div > .ButtonOld_button__5QpuO").click()
    time.sleep(3)
    # driver.close()

2.获取和填写验证码

这次注册的网站,在完成sign up操作后,会自动跳转到需要填写验证码的页面,因此代码中不需要另外唤起页面,仅需要通过Snapmail的API获取邮箱中的验证码即可,提取验证码的方式根据实际邮件进行调整。获取验证码的代码如下:

def getCode(email):
    validation_code = None
    # 每隔5秒重新收取邮件,重试20for i in range(20):
        req = requests.get('https://snapmail.cc/emaillist/' + email)
        if req.status_code == 200:
            email_text = json.loads(req.text)[0]['text']
            validation_code = re.search(r'This is a ([a-zA-Z0-9]{4}) email', email_text)
            break
        time.sleep(5)
    if validation_code:
        return validation_code.group(1)

再将获取的验证码回填到注册网站:

code=getCode(username+"@snapmail.cc")
driver.find_element(By.NAME, "code").send_keys(code)
driver.find_element(By.CSS_SELECTOR, ".ButtonOld_button__5QpuO:nth-child(1)").click()
time.sleep(1)

3.完成新用户登录

填写完验证码后,注册网站自动引导到了登录页面,于是用刚才注册的账号进行登录

driver.find_element(By.NAME, "username").click()
driver.find_element(By.NAME, "username").send_keys(username)
driver.find_element(By.NAME, "password").click()
driver.find_element(By.NAME, "password").send_keys(pwd) 
driver.find_element(By.XPATH, "/html/body/div[1]/div/div/main/div/div/div/form/div/div/div/button").click()
time.sleep(3)

至此,就完成了一个新的目标网站用户的注册和登录。本次目的是为了准备大量的新用户,最简单的就是写个循环,把上面代码串起来循环跑就可以了。

五、注意事项

此外,还有一些在使用时需要注意的问题:

  • 环境稳定性问题

    • 由于Chrome的频繁更新,浏览器自动升级后,原本用的chrome-driver可能就不再和浏览器兼容了,这种情况下再运行selenium打开网页就会失败,需要去下载新的驱动。
    • 一台电脑或服务器上能打开的浏览器数量有限,即使采用headless模式,也不能重复打开许多浏览器,需要特别大量的用户注册时,可以考虑同时安排在多台服务器上执行,或者延长执行时间串行处理。
  • 网站拒绝临时邮箱注册

    • 并不是所有的网站都接受临时邮箱注册用户的,有些网站会拦截临时邮箱注册的用户,也有些网站强依赖手机绑定。
  • 账号的安全性问题

    • 用snapmail这类临时邮箱,可以方便的用新的不同的邮箱地址去接收临时邮件,便利的同时也会有安全问题。比如别人通过和你相同的邮箱地址,也可以访问其中的邮件。Snapmail也对此做出了说明——“目前所有的邮箱地址都是公共的,如果你泄露了邮箱地址,其他人就能添加这个地址后看到你的邮件内容。” 因此如果涉及对安全和隐私性比较高的需求时,不建议使用这类临时邮箱。