【前言】
在中心化交易所执行高频交易相关策略时,通常需要经历以下几个步骤:
- 准备用于接收验证码的邮箱或手机号,并注册交易所账号。注册完成后,绑定谷歌身份验证器Google Authenticator,并设置资金密码。有些交易所可能还要求完成KYC实名认证。
- 向交易所钱包地址充值USDT,并将其划转至指定的资金账户。
- 根据策略下发的交易指令执行下单、撤单等请求。请求可以通过交易所官方API接口、模拟Web/App接口、或使用浏览器自动化点击等方式完成。
- 当仓位达到止盈或止损条件时,策略将发起平仓请求,并准备执行下一笔交易,或者将剩余余额提取至指定的钱包地址。
如果上述流程完全依赖人工手动操作,不仅会浪费大量的人力资源,还可能导致错失宝贵的交易机会,严重影响交易的效率和效果。因此,为了提升工作效率、避免人为失误,我们亟需设计一套智能化的RPA机器人程序,来自动化完成这些重复且枯燥的操作。通过引入自动化技术,我们能够确保每一环节都高效且精确地执行,从而最大化交易策略的效益。接下来,我将从“账号准备”这一环节详细展开。
【正文】
当我们在许多中小型交易所执行高频交易策略时,往往会受到交易所自身风控协议的制约,一旦违反相关规定,账户可能会被风控处理。为了有效分摊风险,我们通常需要准备大量的交易账户,而这一步骤的关键就是先准备好大量邮箱或手机号。考虑到邮箱的购买成本远低于手机号,在这里我们以邮箱为例进行说明。
由于大多数交易所的总部都位于国外,为了避免潜在的限制和风控问题,不建议使用国内邮箱,而是推荐购买国际邮箱,如Gmail、Outlook等。
在使用邮箱注册账号时,交易所会向我们的邮箱发送一封注册确认邮件。在RPA流程中,我们需要自动读取这封邮件中的验证码,并将其自动填充到注册页面,以完成验证过程。
为了实现自动读取邮件,通常需要通过POP3或IMAP协议连接到相应的邮箱服务器。一个常见的解决方案是:维护一个邮箱-应用密码的数据表,在注册程序启动时开启一个线程,利用邮箱和应用密码通过POP3/IMAP协议连接服务器,然后循环读取最近的邮件,直到找到注册邮件。
然而,这种方案也有明显的缺点。首先,每个邮箱都需要手动开启应用密码,而部分邮箱的开启流程极为繁琐,此外,还需要额外维护一个数据表来保存邮箱与应用密码。其次,每次进行注册时都需开启一个新的线程,这会增加系统的开销,影响效率。
因此,推荐采用另一种更为高效的方案:利用邮箱自带的转发功能,将所有邮箱的邮件统一转发到一个邮箱集中处理。这样,程序只需循环读取这个邮箱中的邮件即可,大大简化了流程。
在解析邮件时,可以通过转发邮件的发件人域名来判断邮件来源的交易所,通过收件人地址来获取需要完成注册的邮箱,利用邮件标题或内容判断邮件类型(如register、login、withdraw等),然后通过正则表达式提取出验证码,完成邮件的自动读取流程。
在准备好邮箱后,我们将正式开始交易所账号的注册流程,注册流程将使用Python实现。
交易所账号的自动注册通常有两种实现方式:
- 模拟接口方式:这种方式要求整个注册流程通过模拟Web/App接口请求完成。在此过程中,可能会遇到Web端的JS加密或App端的SO加密,我们需要通过逆向分析加密流程,才能成功模拟请求并完成注册。
- 浏览器自动化方式:另一种方法是使用浏览器自动化工具,如Selenium、Playwright等框架,模拟人工操作来完成注册过程。这种方式的优点是操作更加直观,注册环境更接近真实浏览器环境。
为了尽可能还原真实的注册环境,我们将采用浏览器自动化的方式,同时结合部分模拟接口的手段进行优化。
首先,为了有效隔离不同账号的Cookie和IP环境,我们需要准备一个指纹浏览器软件。在程序后台接收到注册指令后,利用指纹浏览器API操控浏览器启动,接着通过自动化框架打开指定交易所的注册页面,自动填写邮箱和设置的密码,并点击注册按钮。
在点击注册按钮后,通常会遇到验证码的验证步骤。大多数交易所会使用Geetest平台提供的验证码,常见的验证码类型包括滑块、图标点选和九宫格等。
对于滑块验证码,可以通过OpenCV中的边缘检测算法来精确识别缺口位置,从而完成验证。
对于点选或九宫格类型的验证码,则可以借助深度学习模型进行识别,例如使用YOLO目标检测算法来定位图标的位置。除了深度学习方案外,另一种低成本且快捷的选择是使用第三方打码平台来绕过验证码。这种方案适用于每日注册账号数量不大的情况,能够有效降低技术难度并节省开发成本。
绕过验证码后,接下来是输入邮件验证码的环节。我们可以采用前文提到的方法,通过循环读取集中邮箱中的邮件,根据发件人、收件人、邮件标题、内容、发件时间等多个维度,来判断出我们需要的注册邮件。然后,利用正则表达式提取出邮件中的验证码,自动填充至注册页面,完成注册过程。
注册完成后,流程并未结束,接下来的步骤将通过模拟接口的方式进行。
注册完成后的第一步通常是绑定Google Authenticator。在此过程中,交易所通常会发送一封邮件验证码,我们可以使用前文提到的自动读取方法来获取验证码。在绑定过程中,交易所会提供一个secret,如果是人工操作,我们需要将这个secret输入Google Authenticator APP,然后将APP中生成的6位数字口令填写到网页上。而在RPA流程中,我们可以通过代码直接根据secret生成口令,省去手动输入的步骤。以下是示例代码,运行代码前,请确保本地时间准确无误:
#! /usr/bin/python3
#-*- coding: utf-8 -*-
import hmac
import time
import struct
import base64
import hashlib
class GoogleAuthenticator(object):
@staticmethod
def getHotpToken(secret: str, intervals: int):
key = base64.b32decode(secret, True)
msg = struct.pack(">Q", intervals)
h = hmac.new(key, msg, hashlib.sha1).digest()
o = ord(chr(h[19])) & 15
h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
return str(h).zfill(6)
@staticmethod
def getTotpToken(secret: str):
return GoogleAuthenticator.getHotpToken(secret, intervals=int(time.time())//30)
if __name__ == "__main__":
code = GoogleAuthenticator.getTotpToken("XXXXXXXXXXXXXXXX")
print(code)`
除了Google Authenticator,一些交易所还要求设置资金密码。根据模拟接口抓取的流程,逐个请求即可完成设置,具体细节此处不再展开。
接下来,简要总结一下RPA自动注册账号的整个流程:
- 启动自动化框架,填写邮箱和密码
- 绕过Geetest验证码
- 自动读取并填写邮件验证码
- 绑定Google Authenticator
- 设置资金密码
本期的分享就到这里,感谢大家的阅读,我们下期再见!
本文章内容由云梦量化科技Python工程师小明创作投稿。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。