# 使用python监控套利机会1

By [想住大房子的java程序员](https://paragraph.com/@java-3) · 2022-11-29

---

近期使用JS来写监控套利，发现越写越坑。不得已把目光转向python。

再进行三分钟入门，一小时精通的技能后，下载PyCharm Community直接开搞。

在克服了定义函数没有大括号这种强迫症之后，错误才慢慢减少。

对了，还有for循环。。。

废话说完，现在开始开搞。

首先确保已经有了能够正常运行python的环境下。

安装web3

如果你不想安装在系统环境里面，记得需要创建并激活虚拟环境，然后再安装web3.

打开PyCharm Community 新建项目。

新建一个类EthMarketPair.py，用于保存市场地址和token信息。代码如下：

    class EthMarketPair:
        def __init__(self, marketAddress, token0, token1):
            self.marketAddress = marketAddress
            self.tokens = [token0, token1]
            self.token0 = token0
            self.token1 = token1
    
    
        marketAddress = ""
        tokens = [","]
        token0 = ""
        token1 = ""
    

再新建另一个py文件EthMarkets.py，以后的操作将会在这里面进行。

由于现在只进行简单操作。只进行一个市场的信息查询。所以，预先定义一些常量值

    WETH_ADDRESS = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'
    
    #uniswap的查询地址
    UNISWAP_LOOKUP_CONTRACT_ADDRESS = '0x5EF1009b9FCD4fec3094a5564047e190D72Bd511'
    
    #crypto的合约地址
    CRO_FACTORY_ADDRESS = "0x9DEB29c9a4c7A88a3C0257393b7f3335338D9A9D"
    

定义连接web3的RPC

    #记得顶部需要import
    #还要记得需要启动ganache-cli
    w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
    uniswapQuery = w3.eth.contract(address=UNISWAP_LOOKUP_CONTRACT_ADDRESS, abi=UNISWAP_QUERY_ABI)
    

定义查询函数

    def queryPairs():
        factoryAddress = CRO_FACTORY_ADDRESS 
        result = uniswapQuery.functions.getPairsByIndexRange(factoryAddress, 0, 1000).call()
        pairList = []
        for pair in result:
            # 如果需要进行token黑名单的校验，则需要获取下列的token地址，再进行类似!blacklistTokens.includes(tokenAddress)校验
            # if pair[0] == WETH_ADDRESS:
            #     tokenAddress = pair[1]
            # elif pair[1] == WETH_ADDRESS:
            #     tokenAddress = pair[0]
            # else:
            #     continue
            pairList.append(EthMarketPair(pair[2], pair[0], pair[1]))
        return pairList
    

编写main函数，打印返回长度

    if __name__ == '__main__':
        pairList = queryPairs()
        print("长度:%d" % len(pairList))
    

记得千万别写print("长度：" + len(pairList))，会报错的。别问我怎么知道。。。。

OK，运行程序！程序返回ETH交易对的结果集。

    长度:99
    

好了。走完这一个之后，下面再根据地址去查询储备信息。之后改进一下，可以进行批量查询。

---

*Originally published on [想住大房子的java程序员](https://paragraph.com/@java-3/python-1)*
