一、需求背景
在做的一个项目需要注册大量某个网站的用户,利用多个用户获取某些资源,比如利用每个用户的免费使用额度查询数据等。手工操作进行用户注册很浪费人力,于是尝试写脚本自动化实现。
二 、任务拆解
- 邮箱账号准备
- 在网站进行注册
- 邮箱接收验证码,回填网站
- 完成新用户登录
三、提前准备
1. 邮箱账号
在邮箱账号准备方面比较棘手,国内大多数标准邮箱服务都需要绑定手机号。搜索了一下“邮箱接码”、“临时邮箱”,发现了一个不错的适合注册不重要平台的邮箱服务——Snapmail。
Snapmail介绍
Snapmail适用场景
不想收到垃圾邮件,不想暴露隐私,你可以用xx@snapmail.cc去注册网站,保护你的真实邮箱。
其他临时邮箱不具备的便捷性:
- 提供了API,方便在自动化测试中使用
- 可以用任意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秒重新收取邮件,重试20次
for 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也对此做出了说明——“目前所有的邮箱地址都是公共的,如果你泄露了邮箱地址,其他人就能添加这个地址后看到你的邮件内容。” 因此如果涉及对安全和隐私性比较高的需求时,不建议使用这类临时邮箱。