import sys import time import random import string...

Создано: 13 марта 2025 г.

Отвечено с использованием O1 от Chat01

Вопрос

import sys
import time
import random
import string
import csv
import re
import requests
from bs4 import BeautifulSoup

===== Selenium 必要的导入 =====

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

###############################################

请根据实际情况修改下列路径:

###############################################

Chromedriver 路径(请确保解压后文件存在于此路径)

CHROME_DRIVER_PATH = r"C:\Users\minus\Downloads\chromedriver-win64\chromedriver.exe"

Chrome 浏览器的可执行文件路径(此处版本为 134.0.6998.89)

CHROME_BINARY_PATH = r"C:\Program Files\Google\Chrome\Application\chrome.exe"

def generate_random_string(length=10):
"""生成指定长度的随机字符串(包含字母与数字)。"""
return ''.join(random.choices(string.ascii_letters + string.digits, k=length))

def generate_temp_email():
"""生成临时邮箱地址(chacuo.net)。"""
random_name = generate_random_string(10)
return f"{random_name}@chacuo.net"

def get_activation_code(email_name, max_retries=12, interval=5):
"""
轮询 24mail.chacuo.net 邮箱,获取来自 [email protected] 的邮件,
提取其中的 6 位数字激活码。
"""
base_url = "http://24mail.chacuo.net/enus"
get_url = f"{base_url}?setname={email_name}"
headers = {"User-Agent": "Mozilla/5.0"}

text
for _ in range(max_retries): try: response = requests.get(get_url, headers=headers, timeout=10) soup = BeautifulSoup(response.text, 'html.parser') # 查找邮件列表中所有邮件 emails = soup.select("div.mail_list div.mail_item") for email_item in emails: sender = email_item.select_one("div.mail_from").text.strip() # 检查发件人是否为 [email protected] if "[email protected]" in sender: mail_id = email_item["data-id"] mail_url = f"http://24mail.chacuo.net/getmailcontent?mid={mail_id}&name={email_name}" mail_response = requests.get(mail_url, headers=headers, timeout=10) mail_soup = BeautifulSoup(mail_response.text, 'html.parser') content = mail_soup.get_text() # 正则提取 6 位数字激活码 match = re.search(r"(\d{6})", content) if match: return match.group(1) except Exception as e: print(f"获取激活码时出现错误: {e}") time.sleep(interval) return None

def save_to_csv(email, password, filename="accounts.csv"):
"""保存注册成功的账号和密码到 CSV 文件。"""
with open(filename, "a", newline="", encoding="utf-8") as csvfile:
writer = csv.writer(csvfile)
# 如果文件为空,先写入表头
if csvfile.tell() == 0:
writer.writerow(["email", "password"])
writer.writerow([email, password])

def register_account(driver):
"""
核心注册流程:
1. 生成随机临时邮箱、密码
2. 填写 klingai.com 注册表单
3. 等待并获取激活码
4. 完成账号激活
5. 判断激活是否成功,若成功则写入 CSV
"""
try:
# 生成随机邮箱和密码
email = generate_temp_email()
email_name = email.split('@')[0]
password = generate_random_string(8) + "@Ab1" # 保证一定复杂度

text
# 打开 klingai.com 首页 driver.get("https://klingai.com/") wait = WebDriverWait(driver, 20) # 点击“Sign In for Free Credits” sign_in_button = wait.until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Sign In for Free Credits')]")) ) sign_in_button.click() # 点击“Sign Up for Free” signup_link = wait.until( EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Sign Up for Free')]")) ) signup_link.click() # 填写注册表单 email_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@type='email']"))) email_input.send_keys(email) password_input = driver.find_element(By.XPATH, "//input[@type='password']") password_input.send_keys(password) submit_button = driver.find_element(By.XPATH, "//button[@type='submit']") submit_button.click() print(f"等待激活邮件,邮箱:{email}") activation_code = get_activation_code(email_name) if not activation_code: print(f"未能获取激活码,注册失败:{email}") return False print(f"激活码已获取:{activation_code}") # 打开激活页面并输入激活码 driver.get("https://klingai.com/activate") code_input = wait.until( EC.presence_of_element_located((By.XPATH, "//input[@placeholder='Enter code']")) ) code_input.send_keys(activation_code) activate_button = driver.find_element(By.XPATH, "//button[contains(text(), 'Activate')]") activate_button.click() # 简单等待后判断是否跳转到成功页面(如 dashboard) time.sleep(3) current_url = driver.current_url.lower() if "dashboard" in current_url or "activate?success" in current_url: print(f"账号注册并激活成功: {email}") save_to_csv(email, password) return True else: print(f"激活失败或未跳转到预期页面: {email}") return False except Exception as e: print(f"注册流程出现异常: {e}") return False

def main():
"""
主函数:
1. 命令行方式运行,例如:python register_klingai.py 5
表示批量注册 5 个账号;
2. 如不带参数,将提示输入注册账号数量。
"""
# 获取注册账号数量
if len(sys.argv) == 2:
num_accounts = int(sys.argv[1])
else:
try:
num_accounts = int(input("请输入要批量注册的账号数量: "))
except ValueError:
print("请输入一个正整数。")
sys.exit(1)

text
if num_accounts <= 0: print("注册数量必须大于 0。") sys.exit(1) # ===== Selenium 启动 ===== chrome_options = webdriver.ChromeOptions() chrome_options.binary_location = CHROME_BINARY_PATH chrome_options.add_argument("--remote-allow-origins=*") # 如遇到环境问题,可尝试增加以下参数: # chrome_options.add_argument("--no-sandbox") # chrome_options.add_argument("--disable-gpu") # chrome_options.add_argument("--disable-dev-shm-usage") service = Service(CHROME_DRIVER_PATH) driver = webdriver.Chrome(service=service, options=chrome_options) try: for i in range(num_accounts): print(f"\n开始注册第 {i + 1}/{num_accounts} 个账号...") success = register_account(driver) if success: print(f"第 {i + 1} 个账号注册成功!") else: print(f"第 {i + 1} 个账号注册失败。") # 随机延迟,防止过于频繁访问 time.sleep(random.uniform(5, 10)) finally: driver.quit()

if name == "main":
main() C:\Users\minus\anaconda3\envs\PY310\python.exe "C:/Users/minus/Desktop/crawl_stock_date/批量注册 httpsklingai.com - 副本.py"
请输入要批量注册的账号数量: 1

开始注册第 1/1 个账号...
注册流程出现异常: Message:
Stacktrace:
GetHandleVerifier [0x00007FF63631FE45+26629]
(No symbol) [0x00007FF636286010]
(No symbol) [0x00007FF63611931A]
(No symbol) [0x00007FF63616F8E7]
(No symbol) [0x00007FF63616FB1C]
(No symbol) [0x00007FF6361C34A7]
(No symbol) [0x00007FF636197AEF]
(No symbol) [0x00007FF6361C0169]
(No symbol) [0x00007FF636197883]
(No symbol) [0x00007FF636160550]
(No symbol) [0x00007FF636161803]
GetHandleVerifier [0x00007FF6366772BD+3529853]
GetHandleVerifier [0x00007FF63668DA22+3621858]
GetHandleVerifier [0x00007FF6366824D3+3575443]
GetHandleVerifier [0x00007FF6363EB77A+860474]
(No symbol) [0x00007FF63629088F]
(No symbol) [0x00007FF63628CBC4]
(No symbol) [0x00007FF63628CD66]
(No symbol) [0x00007FF63627C2C9]
BaseThreadInitThunk [0x00007FFF1A557374+20]
RtlUserThreadStart [0x00007FFF1BCBCC91+33]

第 1 个账号注册失败。

Process finished with exit code 0
用中文回复问题

Мысль

Identifying the issue

The error likely stems from Selenium's inability to interact with the browser due to page loading or element identification problems.

Navigating code challenges

The error involves locating the "Sign In for Free Credits" button, potentially due to site changes or loading delays. Updating the code or adjusting parsing strategies might resolve the issue.

Identifying driver issues

The error might stem from a version mismatch between Chrome and chromedriver. The user should ensure compatibility by updating chromedriver to match their Chrome version, currently at 134.0.6998.

Addressing browser compatibility

Ensuring the driver matches the browser version, updating Python to an older release like 3.7 or 3.8, and tackling captcha issues can help resolve the problem.

Outlining solutions

Updating the driver, verifying site HTML accuracy, addressing geoblocks, and modifying the button text are potential fixes for the Selenium error.

Reasoned about selenium registration failure for 47 seconds

Ответ

根据你提供的报错信息和代码运行日志,出现 “注册流程出现异常: Message: … Stacktrace: …” 这一类 selenium.common.exceptions 错误,通常有以下几种常见原因和排查思路,供你在本地调试时参考:


1. 浏览器版本与 Chromedriver 版本不兼容

Selenium 必须使用与浏览器版本匹配的 Chromedriver。如果 Chromedriver 版本比浏览器的主版本号低或高,都可能引发异常。你在脚本中注明了:

python
CHROME_DRIVER_PATH = r"C:\Users\minus\Downloads\chromedriver-win64\chromedriver.exe" CHROME_BINARY_PATH = r"C:\Program Files\Google\Chrome\Application\chrome.exe"

以及注释:此处版本为 134.0.6998.89

建议你先在命令行执行以下命令,查看当前实际安装的 Chrome 浏览器版本(如果你安装了多个版本,需要确认脚本指定的 CHROME_BINARY_PATH 所对应的那个版本):

bash
chrome.exe --version

或进入“关于 Google Chrome”查看版本号。然后再比对 Chromedriver 的版本。如果它们的主版本号(例如 134.xx 对应 chromedriver 也应是 134.xx)不一致,就需要下载对应版本的 Chromedriver。

排查方法

  1. 打开命令行,输入 chrome.exe --version 查看实际浏览器版本;
  2. ChromeDriver - WebDriver for Chrome(或国内镜像)下载与你 浏览器版本 完全匹配的 chromedriver.exe;
  3. 确保脚本中 CHROME_DRIVER_PATH 指向的即是那个匹配版本的 chromedriver 文件。

2. 查找元素的 XPATH 或者控件文本已发生变动

很多时候目标网站更新了 UI 或者元素的属性/文案发生变化,你原来写的 XPATHtext 匹配就会失效,从而导致在 driver.find_element...WebDriverWait 阶段抛出 NoSuchElementExceptionTimeoutException 等错误。你的脚本中,最先查找的是:

python
sign_in_button = wait.until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Sign In for Free Credits')]")) ) sign_in_button.click()

如果页面上不再有 “Sign In for Free Credits” 这个按钮文字,或者它由 <button> 改成了 <a><div>,就会出现报错。

排查方法

  1. 在脚本运行前,手动访问 https://klingai.com/,在浏览器里按下 F12 打开开发者工具,查看首页中是否还有含有 “Sign In for Free Credits” 的按钮;
  2. 如果找不到同样的文字,或元素不再是 button,可能需要更新 XPATH 和文本关键字;
  3. 或者使用更灵活的定位方法(id、class、CSS 选择器等),或者根据更新后的网页结构重新编写 XPATH。

3. 网络、地理区域或网站反爬策略导致页面无法正确加载

有时目标网站会对某些 IP 地址或某些区域做访问限制,或者会采用 Cloudflare / reCAPTCHA 等方式阻止自动脚本。这种情况下,Selenium 可能等不到页面上的特定元素,最终触发超时或无法点击等错误。

排查方法

  1. 在本地访问 https://klingai.com/ 是否有被重定向、验证等情况?
  2. 如果网站启用了防爬机制,可能需要手动通过验证码,或者使用带有验证码打码服务、代理等方式;
  3. 检查是否需要挂代理或 VPN 来访问,或者页面是否会跳转到其他域名。

4. 其他可能原因及调试建议

  1. Selenium/Chrome 启动参数问题
    你在代码中添加了:

    python
    chrome_options.add_argument("--remote-allow-origins=*")

    这是因为 Chrome 111+ 版本和 Selenium 在部分场景会出现 “Disallowed host path” 的警告。如果你使用的 Selenium 或者 chrome driver 较新,可以保留;若依然存在异常,可以尝试加上或注释掉其它常见参数,比如:

    python
    chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-dev-shm-usage")

    或者尝试去掉一些参数后再看能否正常运行。

  2. 显式等待时间不够
    如果网页加载特别慢,WebDriverWait 里的 20 秒(wait = WebDriverWait(driver, 20)))可能不够,有时可以适当增大等待时间。

  3. 调试模式

    • 你可以在 register_account() 里,在每一步点击或输入前后都 print() 出对应步骤,确认是在哪一步卡住。
    • 或者使用 driver.save_screenshot("xxx.png") 把页面截屏下来,查看页面到底加载了什么内容,是否实际加载成功。
  4. 手动检查是否有验证码或多余的登录
    如果页面在点击 Sign In for Free Credits 时弹出验证弹窗、验证码或者某些确认窗口,就会导致脚本无法正常点击下一步。


5. 总结与建议

  • 第一步一定要确认 Chrome 浏览器版本与 Chromedriver 版本匹配,这是最常见的问题之一;
  • 第二步 检查你的 XPATH、text 定位是否与网站最新的 HTML 结构一致;
  • 第三步 观察目标网站是否有人工验证、验证码或区域限制;
  • 第四步 在本地多输出日志、截图,以便精确定位是哪一步出现异常。

如果以上方法都尝试后依然无法解决,建议在脚本里添加更详细的日志或截图,具体查看是哪一步卡住,然后再针对性修改脚本。


希望以上思路能帮你快速排查问题,如果还有更多异常信息或调试进展,欢迎补充说明。祝调试顺利!

Поделиться этим Q&A