From bc3b45acd795fd539cc94f9481495b96218214ca Mon Sep 17 00:00:00 2001 From: dghc2023 <3053714263@qq.com> Date: Sat, 7 Dec 2024 17:21:04 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了修改密码的验证 --- main.py | 189 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 100 insertions(+), 89 deletions(-) diff --git a/main.py b/main.py index bc6798e..aea8925 100644 --- a/main.py +++ b/main.py @@ -104,7 +104,7 @@ def generate_user_agent(): return user_agent -def random_sleep(tab, min_seconds=0, max_seconds=2): +def random_sleep(tab, min_seconds=1, max_seconds=3): """在 min_seconds 和 max_seconds 之间随机停顿""" tab.wait(random.uniform(min_seconds, max_seconds)) @@ -467,11 +467,10 @@ def click_use_other_account_button2(tab, next_span): # 修改辅助邮箱账号 -def modify_the_secondary_email1(tab, auxiliary_email_account): - button = tab.ele('@@tag()=i@@text()=edit', timeout=15) +def modify_the_secondary_email1(tab, button, auxiliary_email_account): button.click(by_js=True) tab.wait(2) - input = tab.ele('@type=email', timeout=15) + input = button input.clear() for char in auxiliary_email_account: input.input(char) # Enter one character at a time @@ -754,33 +753,12 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re print("任务被强制停止,退出主函数") return None # 直接返回 None,跳过当前任务 - if not region: - region = "ALL" # 如果没有区域信息,则使用默认区域 - - # 获取一个随机代理并传递给当前账号 - proxy = proxy_manager.get_random_proxy_by_region(region=region, remove_after_fetch=True) - - if proxy: # 如果分配成功 - proxy_host, proxy_port, proxy_user, proxy_pass = proxy['host'], proxy['port'], proxy['user'], \ - proxy['password'] - print(f"为账号 {email_account} 分配代理:{proxy_host}:{proxy_port}:{proxy_user}:{proxy_pass}") - - db_manager.update_record(email_account,proxy=f"{proxy_host}:{proxy_port}:{proxy_user}:{proxy_pass}") - else: - print(f"为账号 {email_account} 分配代理失败,跳过此账号。") - - with write_lock: - try: - print("更新剩余可用IP") - proxy_manager.export_proxies("剩下的可用IP.txt") - except Exception as e: - print(f"导出代理时发生错误: {e}") - if not proxy_host: save_log(random_number, f"没有{region}区域的代理") update_status_in_db(email_account, f"没有{region}区域代理") return False + lock = FileLock("proxy_auth_extension.lock") with lock: # 加锁,确保其他进程在解锁前无法操作 @@ -874,20 +852,26 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re click_the_login_button(tab, login_a) random_sleep(tab) - tab.wait(3) + login = tab.ele('@@tag()=span@@text()=登录', timeout=10) + if login: + random_sleep(tab) + # 将随机数设置为窗口标题 + script = f"document.title = '{random_number}';" + # 执行 JS 脚本 + tab.run_js(script) + print("登录运行完毕") + save_log(random_number, "已经进入登录界面") + else: + update_status_in_db(email_account, '登录超时') + return ( + email_account, email_password, old_recovery_email, new_password, new_recovery_email, proxy_host, + proxy_port, + proxy_username, proxy_password, region) + random_sleep(tab) - # 将随机数设置为窗口标题 - script = f"document.title = '{random_number}';" - # 执行 JS 脚本 - tab.run_js(script) actual_title = tab.run_js("return document.title;") - print("登录运行完毕") - save_log(random_number, "已经进入登录界面") - - tab.wait(7) - save_log(random_number, f"设置标题为: {random_number}, 实际标题为: {actual_title}\n") # 获取所有 Chrome 窗口 @@ -1032,30 +1016,6 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re print("如果出现错误,输入密码运行完毕") save_log(random_number, "如果出现错误后,输入密码运行完毕") - - # 看下是否出现了手机号 - telephone = tab.ele("@text()=请输入电话号码,以便通过短信接收验证码。", timeout=5) - if telephone: - save_log(random_number, '接码') - update_status_in_db(email_account, '接码') - return email_account - - print("检查手机号2运行完毕") - save_log(random_number, "检查手机号2运行完毕") - - wrong = tab.ele('@@tag()=a@@text()=了解详情', timeout=5) - if wrong: - save_log(random_number, '出现账号状态异常') - update_status_in_db(email_account, '出现账号状态异常') - return ( - email_account, email_password, old_recovery_email, new_password, new_recovery_email, proxy_host, - proxy_port, - proxy_username, proxy_password, region) - - print("检查谷歌账号是否存在异常活动完毕") - save_log(random_number, "检查谷歌账号是否存在异常活动完毕") - - # 确定密码是否被修改的开关 password_change = False @@ -1067,7 +1027,7 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re input_password(tab, hwnd, new_password, password_input) save_log(random_number, f"输入新密码完毕") tab.wait(7) - if tab.wait.ele_deleted('#passwordNext', timeout=5) == False: + if tab.wait.ele_deleted('#passwordNext', timeout=10) == False: update_status_in_db(email_account, '被盗') return email_account password_change = True @@ -1085,10 +1045,31 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re print("输入新密码运行完毕") save_log(random_number, "输入新密码运行完毕") + # 看下是否出现了手机号 + telephone = tab.ele("@text()=请输入电话号码,以便通过短信接收验证码。", timeout=5) + if telephone: + save_log(random_number, '接码') + update_status_in_db(email_account, '接码') + return email_account + + print("检查手机号2运行完毕") + save_log(random_number, "检查手机号2运行完毕") + + wrong = tab.ele('@@tag()=a@@text()=了解详情', timeout=5) + alternate_email_button = tab.ele('@text()=确认您的辅助邮箱', timeout=5) + if wrong and not alternate_email_button: + save_log(random_number, '出现账号状态异常') + update_status_in_db(email_account, '出现账号状态异常') + return ( + email_account, email_password, old_recovery_email, new_password, new_recovery_email, proxy_host, + proxy_port, + proxy_username, proxy_password, region) + + print("检查谷歌账号是否存在异常活动完毕") + save_log(random_number, "检查谷歌账号是否存在异常活动完毕") + try: - # 使用辅助邮箱验证 - alternate_email_button = tab.ele('@text()=确认您的辅助邮箱', timeout=15) if alternate_email_button: click_alternate_email_verification_button(tab, alternate_email_button) random_sleep(tab) @@ -1119,10 +1100,11 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re print("我要开始修改辅助邮箱账号了") try: - button = tab.ele('@@tag()=i@@text()=edit', timeout=15) + button = tab.ele('@type=email', timeout=15) if button: - modify_the_secondary_email1(tab, new_recovery_email) # 使用传入的新辅助邮箱 + modify_the_secondary_email1(tab,button, new_recovery_email) # 使用传入的新辅助邮箱 print("修改完成") + auxiliary_email_account_change = True else: print("没有修改辅助邮箱的界面,跳过") # auxiliary_email_account_change = True @@ -1146,25 +1128,12 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re if password_change and auxiliary_email_account_change: logutGoogle(tab) + tab.wait(3) update_status_in_db(email_account, '已更改') return email_account tab.handle_alert(accept=True) - # 点击继续按钮 - continue_div1 = tab.ele('@text()=Continue with smart features', timeout=15) - if continue_div1: - try: - click_continue_button(tab, continue_div1) - except ElementNotFoundError as e: - print(f"找不到继续按钮的元素:{e}") - save_log(random_number, f"找不到继续按钮的元素:{e}") - update_status_in_db(email_account, "请求错误,请重试") - return ( - email_account, email_password, old_recovery_email, new_password, new_recovery_email, proxy_host, - proxy_port, - proxy_username, proxy_password, region) - try: # 安全设置 tab.handle_alert(accept=True) @@ -1172,7 +1141,6 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re tab.handle_alert(accept=True) tab.get("https://myaccount.google.com/security?gar=WzEyMF0") except ElementNotFoundError as e: - print(f"找不到头像的元素:{e}") save_log(random_number, f"进入安全设置后出错:{e}") update_status_in_db(email_account,"进入安全设置的时候请求错误,请重试") return ( @@ -1187,6 +1155,12 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re print("进入安全设置后仍然未登录") save_log(random_number, '进入安全设置后仍然未登录') update_status_in_db(email_account, '登录失败') + return ( + email_account, email_password, old_recovery_email, new_password, new_recovery_email, proxy_host, + proxy_port, + proxy_username, proxy_password, region) + + password_change_time1 = tab.ele("@text():Last changed").inner_html try: # 如果密码没被修改 @@ -1197,6 +1171,18 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re input_password_new(tab, new_password) # 使用传入的新密码 # 点击确认修改 click_span_with_class(tab) + + + password_change_time2 = tab.ele("@text():Last changed").inner_html + if password_change_time2 != password_change_time1: + password_change = True + else: + save_log(random_number, '密码没有成功修改') + print("密码没有成功修改") + return ( + email_account, email_password, old_recovery_email, new_password, new_recovery_email, proxy_host, + proxy_port, + proxy_username, proxy_password, region) except ElementNotFoundError as e: print(f"找不到修改密码的元素:{e}") save_log(random_number, f"找不到修改密码的元素:{e}") @@ -1211,6 +1197,7 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re try: if auxiliary_email_account_change: logutGoogle(tab) + tab.wait(3) update_status_in_db(email_account, '已更改') return email_account # 修改辅助邮箱2 @@ -1218,6 +1205,7 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re save_log(random_number, f"辅助邮箱是否被修改:{flag}") if flag: logutGoogle(tab) + tab.wait(3) update_status_in_db(email_account, '已更改') return email_account else: @@ -1279,8 +1267,10 @@ def main(email_account, email_password, old_recovery_email, new_password, new_re print("辅助邮箱账号已经更改完毕") save_log(random_number, "辅助邮箱账号已经更改完毕") logutGoogle(tab) + tab.wait(3) update_status_in_db(email_account, "已更改") - break + return email_account + else: # 如果未找到验证码,点击重新发送按钮并进入下一次循环 print("未找到验证码,点击重新发送按钮") @@ -1504,7 +1494,35 @@ def run_gui(): print("停止信号已接收,中止任务!") break + # 获取邮箱和区域信息 + account_email = row[0] + region = row[9] # 假设第6列存储的是账号的区域信息 + if not region: + region = "ALL" # 如果没有区域信息,则使用默认区域 + + # 获取一个随机代理并传递给当前账号 + proxy = proxy_manager.get_random_proxy_by_region(region=region, remove_after_fetch=True) + + if proxy: # 如果分配成功 + proxy_host, proxy_port, proxy_user, proxy_pass = proxy['host'], proxy['port'], proxy['user'], \ + proxy['password'] + print(f"为账号 {account_email} 分配代理:{proxy_host}:{proxy_port}:{proxy_user}:{proxy_pass}") + + db_manager.update_record(account_email, + proxy=f"{proxy_host}:{proxy_port}:{proxy_user}:{proxy_pass}") + row = row[:5] + (proxy_host, proxy_port, proxy_user, proxy_pass) + row[9:] # 将代理信息加入到数据行中 + else: + print(f"为账号 {account_email} 分配代理失败,跳过此账号。") + + with write_lock: + try: + print("更新剩余可用IP") + proxy_manager.export_proxies("剩下的可用IP.txt") + except Exception as e: + print(f"导出代理时发生错误: {e}") + + update_proxy_stats() # 传递锁给子进程,并将当前账号数据传递给 main 函数 result = pool.apply_async(main, args=(row), callback=lambda result: progress_queue.put(result)) @@ -1582,11 +1600,6 @@ def run_gui(): return data - def periodic_update(): - # 每隔一定时间调用一次更新代理统计信息的函数 - update_proxy_stats() - root.after(5000, periodic_update) # 每5000毫秒(5秒)调用一次 - root = tk.Tk() root.title("程序控制界面") @@ -1630,8 +1643,6 @@ def run_gui(): lbl_proxy_stats = tk.Label(root, text="代理统计信息未加载") lbl_proxy_stats.grid(row=8, column=1, padx=5, pady=10, columnspan=2) - periodic_update() - root.protocol("WM_DELETE_WINDOW", on_closing) # 绑定窗口关闭事件 root.mainloop() @@ -1652,4 +1663,4 @@ if __name__ == "__main__": os.remove(file_path) freeze_support() - run_gui() + run_gui() \ No newline at end of file