import sys import time import random import string...
Criado em: 13 de março de 2025
Criado em: 13 de março de 2025
import sys
import time
import random
import string
import csv
import re
import requests
from bs4 import BeautifulSoup
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
###############################################
###############################################
CHROME_DRIVER_PATH = r"C:\Users\minus\Downloads\chromedriver-win64\chromedriver.exe"
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"}
textfor _ 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)
textif 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
用中文回复问题
根据你提供的报错信息和代码运行日志,出现 “注册流程出现异常: Message: … Stacktrace: …” 这一类 selenium.common.exceptions
错误,通常有以下几种常见原因和排查思路,供你在本地调试时参考:
Selenium 必须使用与浏览器版本匹配的 Chromedriver。如果 Chromedriver 版本比浏览器的主版本号低或高,都可能引发异常。你在脚本中注明了:
pythonCHROME_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
所对应的那个版本):
bashchrome.exe --version
或进入“关于 Google Chrome”查看版本号。然后再比对 Chromedriver 的版本。如果它们的主版本号(例如 134.xx
对应 chromedriver
也应是 134.xx
)不一致,就需要下载对应版本的 Chromedriver。
排查方法:
- 打开命令行,输入
chrome.exe --version
查看实际浏览器版本;- 在 ChromeDriver - WebDriver for Chrome(或国内镜像)下载与你 浏览器版本 完全匹配的 chromedriver.exe;
- 确保脚本中
CHROME_DRIVER_PATH
指向的即是那个匹配版本的 chromedriver 文件。
很多时候目标网站更新了 UI 或者元素的属性/文案发生变化,你原来写的 XPATH
、text
匹配就会失效,从而导致在 driver.find_element...
或 WebDriverWait
阶段抛出 NoSuchElementException
、TimeoutException
等错误。你的脚本中,最先查找的是:
pythonsign_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>
,就会出现报错。
排查方法:
- 在脚本运行前,手动访问
https://klingai.com/
,在浏览器里按下F12
打开开发者工具,查看首页中是否还有含有 “Sign In for Free Credits” 的按钮;- 如果找不到同样的文字,或元素不再是 button,可能需要更新 XPATH 和文本关键字;
- 或者使用更灵活的定位方法(id、class、CSS 选择器等),或者根据更新后的网页结构重新编写 XPATH。
有时目标网站会对某些 IP 地址或某些区域做访问限制,或者会采用 Cloudflare / reCAPTCHA 等方式阻止自动脚本。这种情况下,Selenium 可能等不到页面上的特定元素,最终触发超时或无法点击等错误。
排查方法:
- 在本地访问
https://klingai.com/
是否有被重定向、验证等情况?- 如果网站启用了防爬机制,可能需要手动通过验证码,或者使用带有验证码打码服务、代理等方式;
- 检查是否需要挂代理或 VPN 来访问,或者页面是否会跳转到其他域名。
Selenium/Chrome 启动参数问题
你在代码中添加了:
pythonchrome_options.add_argument("--remote-allow-origins=*")
这是因为 Chrome 111+ 版本和 Selenium 在部分场景会出现 “Disallowed host path” 的警告。如果你使用的 Selenium 或者 chrome driver 较新,可以保留;若依然存在异常,可以尝试加上或注释掉其它常见参数,比如:
pythonchrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-dev-shm-usage")
或者尝试去掉一些参数后再看能否正常运行。
显式等待时间不够
如果网页加载特别慢,WebDriverWait
里的 20 秒(wait = WebDriverWait(driver, 20)
))可能不够,有时可以适当增大等待时间。
调试模式
register_account()
里,在每一步点击或输入前后都 print()
出对应步骤,确认是在哪一步卡住。driver.save_screenshot("xxx.png")
把页面截屏下来,查看页面到底加载了什么内容,是否实际加载成功。手动检查是否有验证码或多余的登录
如果页面在点击 Sign In for Free Credits
时弹出验证弹窗、验证码或者某些确认窗口,就会导致脚本无法正常点击下一步。
如果以上方法都尝试后依然无法解决,建议在脚本里添加更详细的日志或截图,具体查看是哪一步卡住,然后再针对性修改脚本。
希望以上思路能帮你快速排查问题,如果还有更多异常信息或调试进展,欢迎补充说明。祝调试顺利!