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. 脚本将使用您手动打开的浏览器执行任务。