千家信息网

怎么用Python+Selenium实现读取网易邮箱验证码

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要为大家展示了"怎么用Python+Selenium实现读取网易邮箱验证码",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"怎么用Python+Se
千家信息网最后更新 2025年02月01日怎么用Python+Selenium实现读取网易邮箱验证码

这篇文章主要为大家展示了"怎么用Python+Selenium实现读取网易邮箱验证码",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"怎么用Python+Selenium实现读取网易邮箱验证码"这篇文章吧。

在自动化工作中,有可能会遇到一些发送邮箱验证码类似的功能,如下

我们一般的解决思路就是 :

发送邮件—>打开邮箱—>输入邮箱账户密码—>登录邮箱—>打开未读邮件—>获取验证码—>保存验证码—>读取验证码

以下是一个实现打开网易邮箱读取未读邮件获取验证码的代码

    def wangyi(self,username, password, name):        dr = webdriver.Edge()  # 打开另一个浏览器        dr.maximize_window()  # 窗口最大化        dr.get("https://mail.163.com/")  # 打开QQ邮箱        time.sleep(2)        iframe = dr.find_element(by="xpath",                                     value="/html/body/div[2]/div[3]/div[1]/div/div[4]/div[1]/div[1]/iframe")        dr.switch_to.frame(iframe)  # 切换至内嵌页面        time.sleep(0.5)        dr.find_element(by="name", value="email").clear()  # 清除内容        time.sleep(0.5)        dr.find_element(by="name", value="email").send_keys(username)  # 输入账户        time.sleep(0.5)        dr.find_element(by="name", value="password").clear()  # 清除内容        time.sleep(0.5)        dr.find_element(by="name", value="password").send_keys(password)        time.sleep(0.5)        dr.find_element(by="id", value="dologin").click()  # 进入邮箱首页        dr.switch_to.parent_frame()  # 切回父级页面        time.sleep(2)        num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量        if int(num) > 0:            print("存在未读邮件")            dr.find_element(By.ID, "gWel-animMailIcon").click()  # 点击未读邮件            time.sleep(2)            count = dr.find_elements(By.CLASS_NAME, "da0")            print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件            for i in range(1, len(count)):                emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名                print(emailname)                print(name)                if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作                    dr.find_element(By.CLASS_NAME, 'da0').click()  # 点击邮件查看详情                    time.sleep(1)                    iframe = dr.find_element(By.XPATH,                                                 "/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe")  #                    # 定位内嵌页面                    dr.switch_to.frame(iframe)  # 切换到内嵌页面                    time.sleep(1)                    res = dr.find_element(By.CLASS_NAME,                                              'netease_mail_readhtml.netease_mail_readhtml_webmail').text  # 获取整个邮件信息                    print(res)                    dr.switch_to.parent_frame()  # 切回父级界面                    self.code = re.findall(pattern="\d+", string=res)  # 使用正则表达式获取邮箱验证码                    print(self.code)                    break  # 获取完成退出遍历        else:            print('不存在未读邮件')  # 如果没有找到则打印没有找到        # dr.quit()  # 关闭浏览器

打开邮箱我们会发现,登录这一个小版块是一个内嵌页面,所以一般的定位方法都会定位失败,会报无法点击到该元素,或者找不到该元素的错误,这是我们就会用到dr.switch_to.frame(iframe) 切换至内嵌页面的方法,当我们切换到内嵌页面的时候,就可以对内嵌页面中的元素进行定位操作。但如果操作完成后希望到内嵌页面外进行操作的话,就需要使用dr.switch_to.parent_frame() 把焦点切回父级界面。

进入邮箱后,首先要判断是否收到了邮件,所以通过未读邮件右上角的角标来判断是否收到了邮件,如果收到了才进行下一步操作,如果没有收到则提示没有收到邮件,当然也可以优化一下,设置一个循环,定时多久查看一次,超过多少时间则报错。

这边是用了text方法去获取角标文本进行判断,当然获取的文本是str 格式的,需要使用INT方法进行转为整型进行判断

num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量        if int(num) > 0:            print("存在未读邮件")        else:            print("未收到邮件")

判断存在未读邮件后,我们点入未读邮件中,去查看未读邮件信息,首先,我们要获取未读邮件文本信息进行遍历比对,点进去可以发现,邮件的属性可以使用Class_name进行匹定位,但是一样的Class_name有邮件数量+1个,研究后发现第一封邮件的定位为第二个,所以使用遍历 for i in range(1, len(count)),从第二个元素开始,len(count)中的count指的是该元素,len(count)返回值为该元素的数量也就是邮件数量+1,

实现代码:

            count = dr.find_elements(By.CLASS_NAME, "da0")            print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件            for i in range(1, len(count)):                emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名                print(emailname)                print(name)                if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作                    print("找到邮件执行下一步")                else:                    print("未找到邮件")

找到邮件后需要获取文本信息,可以观察到,文本信息还是比较简单的,其中就只有验证码是数字,所以使用简单的正则匹配可以轻松的将数字匹配出来,值得注意的是,文本内容也是一个内嵌页面,所以也需要切换焦点

具体实现代码:

dr.find_element(By.CLASS_NAME, 'da0').click()  # 点击邮件查看详情time.sleep(1)iframe = dr.find_element(By.XPATH,"/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe")  # 定位内嵌页面dr.switch_to.frame(iframe)  # 切换到内嵌页面time.sleep(1)res = dr.find_element(By.CLASS_NAME, 'netease_mail_readhtml.netease_mail_readhtml_webmail').text  # 获取整个邮件信息print(res)dr.switch_to.parent_frame()  # 切回父级界面self.code = re.findall(pattern="\d+", string=res)  # 使用正则表达式获取邮箱验证码

返回结果:

因为返回结果是一个列表,所以后续使用是需要使用code[0]取出

完整功能代码:

import reimport timefrom selenium import webdriverfrom selenium.webdriver.common.by import By"""使用 Selenium 完成 通过验证码修改密码操作--网易邮箱在未读邮件中获取验证码 change_pwd 方法中:password 登录密码newpassword 新密码url : 网站地址 wangyi 方法中:username:邮箱账户password:邮箱密码name:你期望匹配的邮件名字"""class Get_Code:    def change_pwd(self,password,newpassword,url):        driver = webdriver.Chrome()  # 打开浏览器        driver.get(url)        driver.maximize_window()  # 窗口最大化        time.sleep(0.5)        driver.find_element(by=By.XPATH, value="/html/body/div/div/div[1]/div/div[2]/div[3]/div[1]").click()  # 点击登录        time.sleep(1)        driver.find_element(by=By.ID, value="horizontal_login_userAccount").send_keys("selenium3366@163.com")  # 输入登录账户        driver.find_element(by=By.ID, value="horizontal_login_password").send_keys(password)  # 输入登录密码        driver.find_element(by=By.CLASS_NAME, value="atn-btn-orange.ant-btn.ant-btn-lg.ant-btn-block").click()  # 点击登录        time.sleep(2)        driver.find_element(by=By.XPATH,                            value="""//*[@id="app"]/div/div[1]/div/div[2]/div[3]/div[1]""").click()  # 点击头像进入个人中心        time.sleep(2)        driver.find_element(by=By.XPATH,                            value="""//*[@id="app"]/div/div[2]/div[1]/div[2]/div[3]""").click()  # 点击change_password        time.sleep(1)        driver.find_element(by=By.XPATH, value="""//*[@id="horizontal_login_newPassword"]""").send_keys(            newpassword)  # 输入新密码        driver.find_element(by=By.XPATH,                            value="""//*[@id="app"]/div/div/div[2]/form/div[2]/div/div/span/div/div[2]/a""").click()  # 点击发送验证码        time.sleep(8)  # 等待验证码发送到该邮箱        self.wangyi(username="selenium3366", password="*******, name="okmarket账户信息更改")  # 调用方法获取验证码        driver.find_element(by=By.XPATH, value=        "/html/body/div[1]/div/div/div[2]/form/div[2]/div/div/span/div/div[1]/input").send_keys(            self.code[0])  # 输入验证码        time.sleep(0.5)        driver.find_element(by=By.XPATH, value=        """/html/body/div[1]/div/div/div[2]/form/div[3]/div/div/span/button""").click()  # 点击按钮        time.sleep(1)        text = driver.find_element(by=By.XPATH, value="""/html/body/div[2]/span/div/div/div/span""").text        print(text)        try:            assert text == "password update success"        #断言            print("修改密码成功")        except:            print("修改失败")    def wangyi(self,username, password, name):        dr = webdriver.Edge()  # 打开另一个浏览器        dr.maximize_window()  # 窗口最大化        dr.get("https://mail.163.com/")  # 打开QQ邮箱        time.sleep(2)        iframe = dr.find_element(by="xpath",                                     value="/html/body/div[2]/div[3]/div[1]/div/div[4]/div[1]/div[1]/iframe")        dr.switch_to.frame(iframe)  # 切换至内嵌页面        time.sleep(0.5)        dr.find_element(by="name", value="email").clear()  # 清除内容        time.sleep(0.5)        dr.find_element(by="name", value="email").send_keys(username)  # 输入账户        time.sleep(0.5)        dr.find_element(by="name", value="password").clear()  # 清除内容        time.sleep(0.5)        dr.find_element(by="name", value="password").send_keys(password)        time.sleep(0.5)        dr.find_element(by="id", value="dologin").click()  # 进入邮箱首页        dr.switch_to.parent_frame()  # 切回父级页面        time.sleep(2)        num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量        if int(num) > 0:            print("存在未读邮件")            dr.find_element(By.ID, "gWel-animMailIcon").click()  # 点击未读邮件            time.sleep(2)            count = dr.find_elements(By.CLASS_NAME, "da0")            print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件            for i in range(1, len(count)):                emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名                print(emailname)                print(name)                if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作                    dr.find_element(By.CLASS_NAME, 'da0').click()  # 点击邮件查看详情                    time.sleep(1)                    iframe = dr.find_element(By.XPATH,                                                 "/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe")  #                    # 定位内嵌页面                    dr.switch_to.frame(iframe)  # 切换到内嵌页面                    time.sleep(1)                    res = dr.find_element(By.CLASS_NAME,                                              'netease_mail_readhtml.netease_mail_readhtml_webmail').text  # 获取整个邮件信息                    print(res)                    dr.switch_to.parent_frame()  # 切回父级界面                    self.code = re.findall(pattern="\d+", string=res)  # 使用正则表达式获取邮箱验证码                    print(self.code)                    break  # 获取完成退出遍历        else:            print('不存在未读邮件')  # 如果没有找到则打印没有找到        # dr.quit()  # 关闭浏览器if __name__ == '__main__':    a = Get_Code()    a.change_pwd(password="a123456",newpassword="a1234567",url="*******")

完整效果演示:

以上是"怎么用Python+Selenium实现读取网易邮箱验证码"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

邮件 邮箱 验证 页面 信息 数量 账户 内容 切换 定位 方法 登录 输入 元素 密码 文本 网易 浏览器 浏览 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 mysql存的数据库在哪里 网络安全宣传周 答题 虹口区信息软件开发厂家批发价 生产设备软件开发税率 数据库设计规范性 如何创建web服务器 服务器发送命令刷新页面 云南软件开发网上价格 蛋白水平表达差异分析数据库 数据库优化和数据库操作优化 三级网络技术历年题库下载 台州无尽网络技术 幼儿园网络安全规章制度 服务器异常维修方法 商城县天气预报软件开发 软件开发知识产权及保密协议 各种数据库结构区别 国泰安数据库可以免费使用吗 两台服务器做负载均衡 宝塔 gis中怎么合并数据库 福建互联网养老软件开发系统 吃鸡有没有比较好的服务器 关于网络安全的方向 成都市网络安全员总决赛 北京专业网络技术服务口碑推荐 新个体工商软件开发 数据库文件格式后缀 现金流动网络技术 性价比高的重庆联通服务器托管 关于社区网络安全的通知
0