# 基于web3自动交互操作引用代码资料备份

By [rhapsodisch](https://paragraph.com/@rhapsodisch) · 2024-03-23

---

**1\. 使用Selenium实现自动化操作钱包**

对于使用Selenium进行Web3自动化操作，需要编写一个Python脚本来控制浏览器进行以下步骤：

1.  打开浏览器并导航到钱包界面。
    
2.  自动填写登录表单，提交以登录钱包。
    
3.  导航到显示余额的页面，提取余额信息。
    
4.  如果需要执行交易，导航到执行交易的页面，自动填写交易表单并提交。
    

一个基本的Selenium脚本框架用来描述这个过程：

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 初始化webdriver
    driver = webdriver.Chrome()
    
    try:
        # 打开钱包页面
        driver.get("https://www.examplewallet.com/login")
    
        # 填写登录信息（小心处理和存储你的凭据）
        username_field = driver.find_element(By.ID, "username")
        password_field = driver.find_element(By.ID, "password")
        
        username_field.send_keys("your_username")
        password_field.send_keys("your_password")
    
        # 点击登录按钮
        login_button = driver.find_element(By.ID, "loginButton")
        login_button.click()
    
        # 等待登录完成并跳转
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "balancePage"))
        )
    
        # 获取钱包余额信息
        balance = driver.find_element(By.ID, "balanceValue").text
        print("Wallet balance is:", balance)
    
        # 进行更多的操作，例如交易
        # ...
    
    finally:
        # 关闭浏览器
        driver.quit()
    

请注意，上面的代码是一个非常基本的示例，并不会真正工作，您需要根据您所使用的钱包网站的实际元素和逻辑进行调整。

**2\. 维护多个钱包并批量操作**

**对于批量操作多个钱包，更好的做法是直接与区块链网络交云动或者使用每个钱包提供的API，而不是通过自动化一个Web界面。**

1.  **基于CLI的钱包工具**：有些钱包提供命令行工具，通过命令行就可以进行钱包操作。这样的工具可以很容易地集成到您的脚本中。
    
2.  **钱包API**：特定钱包的API可以允许您直接进行查询余额、发起交易等操作，这通常比通过自动化Web界面更可靠、更安全。
    
3.  **区块链节点或服务**: 您可以直接与之交互，其本地或远程客户端API通常允许程序性地执行钱包操作。
    
4.  **第三方库**：如 `web3.py` 是一个可与Ethereum交互的Python库，允许您直接从Python脚本中发送交易、查询余额等。
    

这里给出一个使用 `web3.py` 的基本示例：

    from web3 import Web3
    
    # web3连接设置
    w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545')) # 示例endpoint
    
    # 检查连接
    if w3.isConnected():
        # 获取钱包余额
        balance = w3.eth.get_balance('钱包地址')
        print(w3.fromWei(balance, 'ether'))
    
        # 发送交易
        tx = {'to': '接收方钱包地址', 'value': w3.toWei(1, 'ether')}
        signed_tx = w3.eth.account.signTransaction(tx, '私钥')
        tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)
        print(tx_hash.hex())
    

这些代码片段仅用于说明目的，不应直接用于生产环境。处理加密货币和钱包时，请确保你了解每一步的安全性，并始终对敏感信息保持高度警惕。

**3.API功能如何实现？**

钱包的API实现方式高度依赖于您所使用的具体钱包和区块链。大多数的现代钱包都提供一种API或者另一个，它们允许您从自己的代码中查询余额，发送交易，通知到达的付款等。

下面我提供一个基本的流程，这将帮助您开始理解如何使用这样的API：

1.  **查看钱包文档**：您应该首先查阅您的钱包的技术文档或开发者指南。这些通常会包含关于如何使用API的说明，包括需要哪些库，如何进行身份验证，以及API的特定用法。
    
2.  **安装必要的库**：某些API可能需要特定的库或SDK来使用。根据您所使用的语言和平台，您可能需要安装这些库。
    
3.  **设置API**：大多数API需要一些形式的身份验证。这可能是一个API密钥，或者需要通过OAuth或其他协议进行身份验证。您应切记保护这些凭据，因为谁拥有这些凭据就可以访问和操作您的钱包。
    
4.  **编写代码**：根据您的需要，编写调用钱包API的代码。这可能包括创建HTTP请求，处理响应，或者调用SDK提供的函数和方法。
    

这里是一个基本的使用HTTP请求进行API交互的Python代码示例：

    import requests
    
    # 这只是一个示例URL和头部，您应该使用钱包提供商给出的实际URL和头部
    url = "http://localhost:5000/api/v1/wallet/balance"
    headers = {"Authorization": "Bearer your_api_token"}
    
    # 发起请求
    response = requests.get(url, headers=headers)
    
    # 检查响应
    if response.status_code == 200:
        balance = response.json()['balance']
        print(f"Wallet balance is {balance}")
    else:
        print(f"Error getting balance: {response.text}")
    

**4.Selenium启动特定Chrome分身**

Selenium启动特定的Chrome浏览器分身，需要指定该浏览器分身的chromedriver的路径。这个路径通常是浏览器的安装路径，而不是某个角本或者配置文件的路径。这是因为Selenium通过chromedriver来与Chrome浏览器交互。

为了告诉Selenium使用特定的chromedriver，需要创建一个`webdriver.Chrome`对象，并在创建它时指定`executable_path`参数。将路径设为分身浏览器的chromedriver。以下是一段示例代码：

    from selenium import webdriver
    
    # 指明chromedriver的路径
    driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
    
    driver.get('http://www.google.com')
    print(driver.title)
    
    # 关闭浏览器窗口并退出driver
    driver.quit()
    

**在这个例子中，将**`'/path/to/chromedriver'`替换为您的特定分身的chromedriver路径。注意，这个路径应该直接指向可执行文件`chromedriver`，而不是一个包含`chromedriver`的文件夹。

然而，请注意，如果每一个Chrome分身都有自己的用户配置（例如，不同的插件、设置等等），那么在使用`webdriver.Chrome()`创建新的浏览器实例时，这些配置可能不会被加载。这是因为Selenium启动的Chrome实例通常是全新的用户配置，而不包含任何已有的用户数据。

在使用这种方法时，请确保对个别浏览器分身的配置没有特殊要求，或者您能够通过Selenium和Chrome选项来重新创建这些配置。

**5.指定chromedriver的路径同时保存数据**

分身Chrome浏览器并不需要独立的chromedriver。Selenium中的webdriver并不直接与浏览器本体交互，而是通过浏览器的driver。例如，控制Chrome浏览器就是通过webdriver与Chrome的chromedriver进行交互。

对于Chrome的不同分身浏览器，只需要一个chromedriver就可以了，因为他们的核心浏览器引擎是相同的。重要的是chromedriver的版本需要与Chrome的核心版本匹配。

对于多个浏览器窗口、标签或者进程的操作，将由chromedriver来管理。当你通过Selenium创建新的浏览器实例时，它会自动启动一个新的浏览器窗口。

但是，若你需要操作的Chrome分身浏览器有自己的用户配置文件，可以在创建webdriver时，通过Chrome的选项来指定这个用户配置文件。比如：

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument("user-data-dir=/path/to/your/profile")
    
    driver = webdriver.Chrome(options=options)
    driver.get('http://www.google.com')
    

**在这里，将**`/path/to/your/profile` 替换为你的Chrome用户配置文件的路径。在webdriver启动的浏览器中，会加载这个用户配置文件中的所有信息，包括插件、书签、历史记录等。

---

*Originally published on [rhapsodisch](https://paragraph.com/@rhapsodisch/web3)*
