From e128c474932a7f97140674dda6fb4e368b351bac Mon Sep 17 00:00:00 2001 From: wangqifan Date: Sun, 10 Aug 2025 12:51:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0or-publickey=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=BB=A5=E7=94=9F=E6=88=90=E5=8A=A9=E8=AE=B0=E8=AF=8D?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=92=8C=E5=A4=84=E7=90=86=E5=87=BD=E6=95=B0=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=96=B0=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + main.py | 10 +++- modules/or_address_handler.py | 2 +- modules/or_publickey_handler.py | 83 +++++++++++++++++++++++++++++++++ operate.md | 27 +++++++++++ 5 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 modules/or_publickey_handler.py diff --git a/.gitignore b/.gitignore index a2b7c52..3f25f23 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __pycache__/*.pyc chrome_user_data/* modules/__pycache__/*.pyc data/o-address.csv +data/or_publickey.csv diff --git a/main.py b/main.py index fc1e384..4f93651 100644 --- a/main.py +++ b/main.py @@ -3,10 +3,12 @@ import argparse from browser_manager import get_chrome_driver from modules.or_address_handler import process_addresses +from modules.or_publickey_handler import generate_or_address # 模块映射 MODULES = { "or-address": process_addresses, + "or-publickey": generate_or_address, # 在这里可以添加更多的模块 # "another-module": another_handler_function, } @@ -29,6 +31,12 @@ def main(): action="store_true", help="使用此参数连接到已存在的 Chrome 调试实例。" ) + parser.add_argument( + "--cnt", + type=int, + default=1, + help="生成地址的数量。" + ) args = parser.parse_args() # 2. 根据参数选择浏览器启动方式 @@ -46,7 +54,7 @@ def main(): if handler_function: print(f"--- 开始执行模块: {module_name} ---") - handler_function(driver) + handler_function(driver, args) print(f"--- 模块: {module_name} 执行完毕 ---") else: # 这段代码理论上不会执行,因为 argparse 的 choices 已经做了限制 diff --git a/modules/or_address_handler.py b/modules/or_address_handler.py index eff3b5a..1bb0ea6 100644 --- a/modules/or_address_handler.py +++ b/modules/or_address_handler.py @@ -7,7 +7,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC -def process_addresses(driver): +def process_addresses(driver,args): """ 处理 o-address.csv 文件,访问 Etherscan 并更新地址信息。 :param driver: Selenium WebDriver 实例。 diff --git a/modules/or_publickey_handler.py b/modules/or_publickey_handler.py new file mode 100644 index 0000000..d0dc620 --- /dev/null +++ b/modules/or_publickey_handler.py @@ -0,0 +1,83 @@ +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" 的

标签,然后获取其后面的兄弟

标签,内容就在里面 + 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( + EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/span/div[2]/div/div/div/div/div[1]/div[2]")) + ) + valid_public_key = valid_public_key_element.text + + + 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") + \ No newline at end of file diff --git a/operate.md b/operate.md index df241e3..c2c88d8 100644 --- a/operate.md +++ b/operate.md @@ -33,3 +33,30 @@ python main.py --module or-address --debug ``` 4. 脚本将会自动接管在步骤一中打开的浏览器,并执行后续操作。请观察命令行中的输出信息以了解程序运行状态。 + +## 2、or-publickey助记词生成 + +本业务用于访问 [https://bls-keygen.com/](https://bls-keygen.com/) 网站,自动生成并提取助记词。 + +### 步骤一:运行主程序 + +对于此任务,您可以直接运行脚本,程序会自动打开和关闭浏览器。 + +1. 确保您的计算机已经安装了Python环境以及本项目所需的所有依赖包。 +2. 打开一个新的命令行工具,并确保当前路径位于项目根目录下。 +3. 执行以下命令启动自动化脚本: + ```shell + python main.py --module or-publickey + ``` +4. 脚本将自动执行所有步骤,并在命令行中输出获取到的助记词。 + +### (可选)使用调试模式运行 + +如果您希望观察浏览器中的操作过程,也可以使用调试模式。 + +1. 按照 **"1、or钱包地址转换"** 中的 **"步骤一"** 启动一个调试模式的Chrome浏览器。 +2. 运行以下命令: + ```shell + python main.py --module or-publickey --debug --cnt=50 + ``` +3. 脚本将使用您手动打开的浏览器执行任务。