添加or-publickey模块以生成助记词,并更新相关文档和处理函数以支持新功能。
This commit is contained in:
parent
d83e81efcc
commit
e128c47493
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@ __pycache__/*.pyc
|
|||||||
chrome_user_data/*
|
chrome_user_data/*
|
||||||
modules/__pycache__/*.pyc
|
modules/__pycache__/*.pyc
|
||||||
data/o-address.csv
|
data/o-address.csv
|
||||||
|
data/or_publickey.csv
|
||||||
|
|||||||
10
main.py
10
main.py
@ -3,10 +3,12 @@
|
|||||||
import argparse
|
import argparse
|
||||||
from browser_manager import get_chrome_driver
|
from browser_manager import get_chrome_driver
|
||||||
from modules.or_address_handler import process_addresses
|
from modules.or_address_handler import process_addresses
|
||||||
|
from modules.or_publickey_handler import generate_or_address
|
||||||
|
|
||||||
# 模块映射
|
# 模块映射
|
||||||
MODULES = {
|
MODULES = {
|
||||||
"or-address": process_addresses,
|
"or-address": process_addresses,
|
||||||
|
"or-publickey": generate_or_address,
|
||||||
# 在这里可以添加更多的模块
|
# 在这里可以添加更多的模块
|
||||||
# "another-module": another_handler_function,
|
# "another-module": another_handler_function,
|
||||||
}
|
}
|
||||||
@ -29,6 +31,12 @@ def main():
|
|||||||
action="store_true",
|
action="store_true",
|
||||||
help="使用此参数连接到已存在的 Chrome 调试实例。"
|
help="使用此参数连接到已存在的 Chrome 调试实例。"
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--cnt",
|
||||||
|
type=int,
|
||||||
|
default=1,
|
||||||
|
help="生成地址的数量。"
|
||||||
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
# 2. 根据参数选择浏览器启动方式
|
# 2. 根据参数选择浏览器启动方式
|
||||||
@ -46,7 +54,7 @@ def main():
|
|||||||
|
|
||||||
if handler_function:
|
if handler_function:
|
||||||
print(f"--- 开始执行模块: {module_name} ---")
|
print(f"--- 开始执行模块: {module_name} ---")
|
||||||
handler_function(driver)
|
handler_function(driver, args)
|
||||||
print(f"--- 模块: {module_name} 执行完毕 ---")
|
print(f"--- 模块: {module_name} 执行完毕 ---")
|
||||||
else:
|
else:
|
||||||
# 这段代码理论上不会执行,因为 argparse 的 choices 已经做了限制
|
# 这段代码理论上不会执行,因为 argparse 的 choices 已经做了限制
|
||||||
|
|||||||
@ -7,7 +7,7 @@ from selenium.webdriver.common.by import By
|
|||||||
from selenium.webdriver.support.ui import WebDriverWait
|
from selenium.webdriver.support.ui import WebDriverWait
|
||||||
from selenium.webdriver.support import expected_conditions as EC
|
from selenium.webdriver.support import expected_conditions as EC
|
||||||
|
|
||||||
def process_addresses(driver):
|
def process_addresses(driver,args):
|
||||||
"""
|
"""
|
||||||
处理 o-address.csv 文件,访问 Etherscan 并更新地址信息。
|
处理 o-address.csv 文件,访问 Etherscan 并更新地址信息。
|
||||||
:param driver: Selenium WebDriver 实例。
|
:param driver: Selenium WebDriver 实例。
|
||||||
|
|||||||
83
modules/or_publickey_handler.py
Normal file
83
modules/or_publickey_handler.py
Normal file
@ -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" 的 <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(
|
||||||
|
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")
|
||||||
|
|
||||||
27
operate.md
27
operate.md
@ -33,3 +33,30 @@
|
|||||||
python main.py --module or-address --debug
|
python main.py --module or-address --debug
|
||||||
```
|
```
|
||||||
4. 脚本将会自动接管在步骤一中打开的浏览器,并执行后续操作。请观察命令行中的输出信息以了解程序运行状态。
|
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. 脚本将使用您手动打开的浏览器执行任务。
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user