登录需要邮箱验证码的门户系统脚本

本文介绍了一个使用Selenium WebDriver实现的自动化门户登录流程,包括获取门户登录页面、发送验证码、通过126邮箱接收验证码并完成登录的过程。

大纲:

  1. 通过webdriver获取门户登录页面并点击发送验证码
  2. 通过webdriver获取门户关联的126邮箱,打开验证码邮件,获取邮件内容,通过正则提取验证码(注意在登录邮箱和打开邮件时有切换至iframe的操作)
  3. 通过webdriver将提取到的验证码发送至门户页面的验证码输入框并点击登录,最终实现门户系统的自动化登录

疑问:都说driver.implicitly_wait()这个方法更高效,但不知道为是什么用这种方法的时候元素经常会获取不到,所以本文中全部粗暴地用的time.sleep()方法。希望有知道原因的小伙伴告知一下。

iframe-1
在这里插入图片描述

iframe-2

在这里插入图片描述

门户登录代码

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from GetMenhuLoginNum import Login_126

class MenHuLogin(object):
	def __init__(self):
		self.driver = webdriver.Firefox()

	def MyApplicationLogin(self,url,name,pwd,mailurl,mailname,mailpwd):
		print("开始1")
		self.driver.get(url)
		print("开始2")
		time.sleep(1)
		#定位账号输入框
		el = self.driver.find_element_by_xpath("""//*[@placeholder="请输入账号"]""")
		print("开始3")
		#向账号输入框发送账号
		el.send_keys(name)
		#定位密码输入框
		el01 = self.driver.find_element_by_xpath("""//*[@placeholder="请输入密码"]""")
		print("开始3")
		time.sleep(1)
		#向密码输入框发送密码
		el01.send_keys(pwd)
		#定位获取验证码按钮
		sendMSG = self.driver.find_element_by_xpath("""//span[contains(text(),"获取验证码")]""")
		#点击“获取验证码”按钮
		sendMSG.click()
		#获取邮箱中的验证码
		time.sleep(1)
		window = self.driver.window_handles
		print(window)
		
		while True:
			try:				
				mat = Login_126()
				num = mat.MailLogin(mailurl,mailname,mailpwd)
				print(num)
				print("---------------------")
				if num.isdigit() == True:#通过判断验证码是否为数字类型来判断验证码是否获取成功
					break
			except Exception as ret:
				print(ret)
		print(num)
		#定位到验证码输入框
		
		ipt = self.driver.find_element_by_xpath("""//input[@placeholder="请输入验证码"]""")		
		time.sleep(1)
		#相输入框输入上面从邮箱获取的验证码
		ipt.send_keys(num)
		#定位登录按钮
		sub = self.driver.find_element_by_xpath("""//button[@type="submit"]""")	
		time.sleep(1)
		#点击登录按钮
		sub.click()
		newurl = self.driver.current_url
		return newurl
	
if __name__ == "__main__":
	url = 'http://xxxx/login'
	namelist= ["你的门户登录账号"]
	pwdlist = ["你的门户登录密码"]
	mailurl = 'https://mail.126.com/'
	mailname_list = ["xxxx你的126邮箱账号"]
	mailpwd_list = ["xxxx你的126邮箱密码"]	
	po = 0
	while po<len(namelist):
		name = namelist[po]
		pwd = pwdlist[po]		
		mailname = mailname_list[po]
		mailpwd = mailpwd_list[po]
		mapp = MenHuLogin()
		mapp.MyApplicationLogin(url,name,pwd,mailurl,mailname,mailpwd)
		time.sleep(2)
		po+=1

获取邮箱中的验证码GetMenhuLoginNum.py

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
import re
#import xlrd

class Login_126(object):
	def __init__(self):
		#设置浏览器无头访问模式
		self.options = webdriver.FirefoxOptions()
		self.options.add_argument('-headless')
		self.driver = webdriver.Firefox(firefox_options=self.options)
		#self.driver = webdriver.Firefox()

	def MailLogin(self,url,name,pwd):
		print("开始1")
		#url = 'https://mail.126.com/'
		self.driver.get(url)
		print("开始2")
		ifr = self.driver.find_element_by_xpath("//iframe[@frameborder=0]")
		time.sleep(1)
		self.driver.switch_to_frame(ifr)
		print("定位到iframe")
		time.sleep(1)
		el = self.driver.find_element_by_xpath("""//*[@data-placeholder="邮箱帐号或手机号码"]""")
		print("开始3")
		time.sleep(1)
		el.send_keys(name)
		el01 = self.driver.find_element_by_css_selector("[data-placeholder=输入密码]")
		print("开始3")
		el01.send_keys(pwd)
		btn = self.driver.find_element_by_css_selector("#dologin")
		btn.click()
		time.sleep(1)
		newurl = self.driver.current_url
		num = self.GetRandomNums()
		return num
		
	def GetRandomNums(self):
		time.sleep(1)
		self.driver.refresh()
		time.sleep(1)
		#定位到收件箱
		receive_list = self.driver.find_element_by_xpath("""//span[contains(text(),"收件箱")]""")
		time.sleep(1)
		receive_list.click()
		time.sleep(1)
		#定位到邮件列表中要获取的邮件
		mail = self.driver.find_element_by_xpath("""(//span[contains(text(),"span元素的文本内容")])[1]""")
		mail.click()
		time.sleep(1)
		#获取邮件所在的iframe
		iframe = self.driver.find_element_by_xpath("""//iframe[@frameborder=0][@class="oD0"]""")
		time.sleep(1)
		#跳转到iframe
		self.driver .switch_to_frame(iframe)
		time.sleep(2)
		#获取邮件内容元素
		content = self.driver.find_element_by_css_selector(""".netease_mail_readhtml#content""")
		#获取邮件内容元素的文本内容
		mail_content = content.text
		#print(mail_content)
		#提取邮件文本中的验证码信息
		num = self.re_trim(mail_content)
		return(num)
		
	#正则匹配邮件内容中的验证码	
	def re_trim(self,s): 
		num = re.findall(r"\d+",s)[0]
		return(num)
	
if __name__ == "__main__":
	url = 'https://mail.126.com/'
	namelist= ["你的126邮箱账号"]
	pwdlist = ["你的126邮箱密码"]
	po = 0
	while po<len(namelist):
		name = namelist[po]
		pwd = pwdlist[po]
		mapp = Login_126()
		num = mapp.MailLogin(url,name,pwd)
		print(num)
		time.sleep(2)
		po+=1
<think>我们正在处理用户关于"邮箱验证码拦截脚本"的请求。根据之前的引用记录,用户似乎对拦截手机号的脚本感兴趣(引用[1]),并提到了防火墙拦截病毒脚本的性能与安全性问题(引用[2])。但用户当前明确要求的是邮箱验证码拦截脚本。注意:拦截邮箱验证码通常指的是在本地或服务器上捕获进入邮箱验证码邮件,并从中提取验证码。这通常用于自动化测试或某些自动化流程,但请注意合法使用。我们将设计一个Python脚本,用于监控邮箱(以IMAP协议为例),当收到新邮件时,解析邮件内容,提取验证码(假设验证码数字序列),并输出。这里我们以QQ邮箱为例(使用IMAP),但其他邮箱类似。步骤:1.连接到IMAP服务器。2.登录邮箱。3.选择收件箱(或指定文件夹)。4.搜索未读邮件(或根据需求搜索特定发件人/主题)。5.获取邮件内容。6.使用正则表达式从邮件内容中提取验证码(假设验证码是6位数字,但可以根据实际情况调整)。7.标记邮件为已读(可选)。8.关闭连接。注意:在实际使用中,需要开启邮箱的IMAP服务,并获取授权码(而不是登录密码)。代码示例:```pythonimportimaplibimportemailimportrefromemail.headerimportdecode_header#邮箱配置IMAP_SERVER='imap.qq.com'#以QQ邮箱为例,其他邮箱请更改USERNAME='your_email@qq.com'PASSWORD='your_authorization_code'#注意:是授权码,不是登录密码defextract_verification_code(text):#假设验证码是6位数字,根据实际情况调整正则表达式pattern=r'\b\d{6}\b'match=re.search(pattern,text)ifmatch:returnmatch.group(0)returnNonedeffetch_emails():#连接IMAP服务器mail=imaplib.IMAP4_SSL(IMAP_SERVER)mail.login(USERNAME,PASSWORD)mail.select('INBOX')#选择收件箱#搜索未读邮件status,messages=mail.search(None,'UNSEEN')ifstatus!='OK':print("没有找到未读邮件")returnemail_ids=messages[0].split()ifnotemail_ids:print("没有未读邮件")return#获取最新一封未读邮件latest_email_id=email_ids[-1]status,data=mail.fetch(latest_email_id,'(RFC822)')ifstatus!='OK':print(f"获取邮件失败,ID:{latest_email_id}")return#解析邮件raw_email=data[0][1]msg=email.message_from_bytes(raw_email)#解码主题subject,encoding=decode_header(msg['Subject'])[0]ifisinstance(subject,bytes):subject=subject.decode(encodingifencodingelse'utf-8')#提取发件人from_header=msg.get('From')#解析发件人信息sender_name,sender_addr=None,Noneif'<'infrom_headerand'>'infrom_header:#尝试提取邮箱地址sender_addr=re.search(r'<([^>]+)>',from_header).group(1)#发件人名称可能在邮箱地址前面sender_name=from_header.split('<')[0].strip()else:sender_addr=from_headerprint(f"发件人:{sender_name}<{sender_addr}>")print(f"主题:{subject}")#遍历邮件部分verification_code=Noneforpartinmsg.walk():content_type=part.get_content_type()content_disposition=str(part.get("Content-Disposition"))ifpart.get_content_type()=='text/plain'and'attachment'notincontent_disposition:#提取正文body=part.get_payload(decode=True).decode()#尝试提取验证码verification_code=extract_verification_code(body)ifverification_code:print(f"验证码:{verification_code}")#标记邮件为已读(可选)mail.store(latest_email_id,'+FLAGS','\\Seen')breakifnotverification_code:print("未找到验证码")mail.close()mail.logout()if__name__=='__main__':fetch_emails()```注意:-该脚本仅用于示例,实际使用中可能需要根据邮件结构调整解析逻辑。-不同的邮箱服务提供商IMAP服务器地址不同,例如:-QQ邮箱:imap.qq.com-163邮箱:imap.163.com-Gmail:imap.gmail.com-使用前需在邮箱设置中开启IMAP/SMTP服务,并获取授权码(QQ邮箱在“设置-账户-开启IMAP/SMTP服务”中获取授权码)。-本脚本只处理最新的一封未读邮件,并从中提取验证码。如果有多个验证码邮件,可能需要遍历所有未读邮件。安全提醒:邮箱账号和授权码属于敏感信息,请妥善保管,避免泄露。根据引用[2]的提醒,我们也要注意性能和安全性问题:-性能:此脚本是单次运行,若需要实时监控,可以改为循环检查,但要注意频率,避免过于频繁请求。-安全性:不要在代码中明文存储账号密码,可以考虑从环境变量或配置文件中读取。相关问题:1.如何设置邮箱以启用IMAP服务?2.如何提高脚本的健壮性(例如处理各种邮件格式)?3.如何将脚本部署为后台服务实时监控邮箱?4.除了验证码,如何提取邮件中的其他信息(如链接)?</think>以下是Python实现的邮箱验证码拦截脚本示例,结合邮件解析和正则表达式技术,参考了站内关于拦截脚本的设计思路[^1][^2]: ```python import re import imaplib import email from email.header import decode_header import time def extract_verification_code(text): """使用正则表达式提取验证码""" # 匹配6位数字验证码(可根据实际需求调整) pattern = r'\b\d{6}\b' match = re.search(pattern, text) return match.group(0) if match else None def monitor_email(username, password, interval=60): """监控邮箱并拦截验证码""" # 连接IMAP服务器(以QQ邮箱为例) mail = imaplib.IMAP4_SSL("imap.qq.com") mail.login(username, password) mail.select("inbox") print("开始监控邮箱验证码...") try: while True: # 搜索未读邮件 status, messages = mail.search(None, "UNSEEN") if status == "OK" and messages[0]: for num in messages[0].split(): # 获取邮件内容 status, data = mail.fetch(num, "(RFC822)") raw_email = data[0][1] msg = email.message_from_bytes(raw_email) # 解析邮件主题 subject, encoding = decode_header(msg["Subject"])[0] if isinstance(subject, bytes): subject = subject.decode(encoding or "utf-8") # 提取邮件正文 body = "" if msg.is_multipart(): for part in msg.walk(): content_type = part.get_content_type() if content_type == "text/plain": body = part.get_payload(decode=True).decode() else: body = msg.get_payload(decode=True).decode() # 提取验证码 code = extract_verification_code(body) if code: print(f"拦截到验证码邮件!") print(f"主题: {subject}") print(f"验证码: {code}") print("="*50) time.sleep(interval) # 轮询间隔 finally: mail.close() mail.logout() if __name__ == "__main__": # 配置邮箱账号(需开启IMAP服务) EMAIL = "your_email@example.com" # 替换为实际邮箱 PASSWORD = "your_authorization_code" # 使用授权码而非登录密码 monitor_email(EMAIL, PASSWORD, interval=30) # 每30秒检查一次 ``` ### 关键功能说明: 1. **IMAP协议监控**:使用标准IMAP协议连接邮箱服务器,支持主流邮箱服务(QQ/163/Gmail等) 2. **动态解析**: - 自动解码邮件主题(支持多种编码格式) - 智能识别多部分邮件(multipart)和纯文本邮件 3. **验证码提取**: - 使用正则表达式 `\b\d{6}\b` 匹配6位数字验证码 - 可修改正则模式适应不同格式(如字母数字混合) 4. **安全措施**: - SSL加密通信 - 使用邮箱授权码而非明文密码[^2] - 可控的轮询间隔防止请求过载 ### 使用前准备: 1. 在邮箱设置中开启IMAP/SMTP服务 2. 获取邮箱的授权码(代替密码) 3. 安装依赖:`pip install imapclient`(可选增强包) --- ### 注意事项: 1. **合法性**:仅限测试或经授权的场景使用,避免侵犯隐私[^2] 2. **性能优化**:高频监控可能触发邮箱服务器的安全限制 3. **扩展建议**: - 添加发件人白名单过滤 - 集成邮件删除/分类功能 - 增加验证码转发机制
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值