2025-08-10 12:51:53 +08:00
|
|
|
|
from selenium.webdriver.remote.webdriver 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
|
|
|
|
|
|
import pandas as pd
|
|
|
|
|
|
|
|
|
|
|
|
def generate_public_key(driver: WebDriver):
|
|
|
|
|
|
"""
|
|
|
|
|
|
访问 https://bls-keygen.com/,生成新的主密钥,并提取助记词。
|
|
|
|
|
|
|
|
|
|
|
|
:param driver: Selenium WebDriver 实例
|
|
|
|
|
|
"""
|
|
|
|
|
|
url = "https://bls-keygen.com/"
|
|
|
|
|
|
print(f"正在访问: {url} ...")
|
|
|
|
|
|
driver.get(url)
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 1. 等待并点击 "Generate New Master Key" 按钮
|
|
|
|
|
|
print("正在查找并点击 'Generate New Master Key' 按钮...")
|
|
|
|
|
|
generate_button = WebDriverWait(driver, 20).until(
|
|
|
|
|
|
EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Generate New Master Key')]"))
|
|
|
|
|
|
)
|
|
|
|
|
|
# 使用 JavaScript 点击以增加稳定性,避免普通点击被拦截
|
|
|
|
|
|
driver.execute_script("arguments[0].click();", generate_button)
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 等待新页面加载并找到助记词元素
|
|
|
|
|
|
# 使用 XPath 定位到标题为 "Mnemonic" 的 <p> 标签,然后获取其后面的兄弟 <p> 标签,内容就在里面
|
|
|
|
|
|
print("正在等待新页面加载并提取助记词...")
|
|
|
|
|
|
mnemonic_element = WebDriverWait(driver, 20).until(
|
|
|
|
|
|
EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/span/div[2]/div/div/div/div/div"))
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
mnemonic_phrase = mnemonic_element.text.split("\n")[1].strip()
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 点击下一步按钮
|
|
|
|
|
|
next_button = WebDriverWait(driver, 20).until(
|
|
|
|
|
|
EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Next')]"))
|
|
|
|
|
|
)
|
|
|
|
|
|
driver.execute_script("arguments[0].click();", next_button)
|
|
|
|
|
|
|
|
|
|
|
|
# 4.输入助记词
|
|
|
|
|
|
input_element = WebDriverWait(driver, 20).until(
|
|
|
|
|
|
EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/span/div[2]/div/div/div/div/div[1]/textarea"))
|
|
|
|
|
|
)
|
|
|
|
|
|
input_element.send_keys(mnemonic_phrase)
|
|
|
|
|
|
|
|
|
|
|
|
# 5. 点击下一步按钮
|
|
|
|
|
|
next_button = WebDriverWait(driver, 20).until(
|
|
|
|
|
|
EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Next')]"))
|
|
|
|
|
|
)
|
|
|
|
|
|
driver.execute_script("arguments[0].click();", next_button)
|
|
|
|
|
|
|
|
|
|
|
|
# 6. 找到两个公钥
|
|
|
|
|
|
master_public_key_element = WebDriverWait(driver, 20).until(
|
|
|
|
|
|
EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/span/div[2]/div/div/div/div/div[1]/div[2]"))
|
|
|
|
|
|
)
|
|
|
|
|
|
master_public_key = master_public_key_element.text
|
|
|
|
|
|
|
|
|
|
|
|
valid_public_key_element = WebDriverWait(driver, 20).until(
|
2025-08-10 13:41:07 +08:00
|
|
|
|
EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/span/div[2]/div/div/div/div/div[3]"))
|
2025-08-10 12:51:53 +08:00
|
|
|
|
)
|
2025-08-10 13:41:07 +08:00
|
|
|
|
valid_public_key = valid_public_key_element.text.split("\n")[1].strip()
|
2025-08-10 12:51:53 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return({"mnemonic_phrase": mnemonic_phrase, "master_public_key": master_public_key, "valid_public_key": valid_public_key})
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ 在执行过程中发生错误: {e}")
|
|
|
|
|
|
print("请检查网页结构是否发生变化,或网络连接是否正常。")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def generate_or_address(driver: WebDriver, args):
|
|
|
|
|
|
print(f"开始生成{args.cnt}个地址")
|
|
|
|
|
|
key_infos = []
|
|
|
|
|
|
for i in range(args.cnt):
|
|
|
|
|
|
key_info = generate_public_key(driver)
|
|
|
|
|
|
key_infos.append(key_info)
|
|
|
|
|
|
|
|
|
|
|
|
# 将key_infos写入csv文件
|
|
|
|
|
|
df = pd.DataFrame(key_infos)
|
|
|
|
|
|
df.to_csv("data/or_publickey.csv", index=False)
|
|
|
|
|
|
print(f"已将{args.cnt}个地址写入data/or_publickey.csv")
|
|
|
|
|
|
|