目标站点
https://dexscreener.com
目标数据
列表页数据
问题
- 看到网上有不少推荐使用该库的
aiowebsocket,测试下来该库无法实现,也是耽误了我一天的时间,各种调试,一开始只是以为是我没有过风控的问题,其实并不是,问题在库上;该项目已经4年没有更新了,废掉了,不建议使用
# from aiowebsocket.converses import AioWebSocket #https://github.com/asyncins/aiowebsocket - Sec-WebSocket-Key 加密参数;该参数是根据一定规则随机生成的,只要按照规则生成即可,不按规则就无法连接成功; 代码示例
function generateWebSocketKey() { // 生成一个16字节的随机值 const buffer = new Uint8Array(16); window.crypto.getRandomValues(buffer); // 将随机值进行Base64编码 const key = btoa(String.fromCharCode.apply(null, buffer)); return key; } import os import base64 def generate_websocket_key(): # 生成一个16字节的随机值 buffer = os.urandom(16) # 将随机值进行Base64编码 key = base64.b64encode(buffer).decode('utf-8') return key print(generate_websocket_key()) - headers 是需要对UA进行校验的
解决代码示例
class ListPage: def __init__(self): self.base_url = 'wss://io.dexscreener.com/dex/screener/pairs/h24/{}?rankBy[key]=txns&rankBy[order]=desc&filters[liquidity][min]=100000&filters[marketCap][min]=200000&filters[txns][h24][min]=100' def generate_websocket_key(self): # 生成一个16字节的随机值 buffer = os.urandom(16) # 将随机值进行Base64编码 key = base64.b64encode(buffer).decode('utf-8') return key def open_connection(self,num): """ 建立连接 """ header = { # 用户唯一性校验+风控识别校验,可以理解为mac地址的作用,该值有一定的规范,是随机生成的,但是得符合一定的标准,在标准之外的随机数是不被认可的,无法建立连接 "Sec-WebSocket-Key": self.generate_websocket_key(), # 和http请求的用途一样,用于校验客户端角色;主要风控 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36" } ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE}) # remote = 'wss://io.dexscreener.com/dex/screener/pairs/h24/4??rankBy[key]=txns&rankBy[order]=desc&filters[liquidity][min]=100000&filters[marketCap][min]=200000&filters[txns][h24][min]=100' url = self.base_url.format(num) logger.info(f'request {num}: {url}') # 必须得携带头部信息,Python代码实现的wss通信自动生成的Sec-WebSocket-Key 很多服务器会不支持 ws.connect(url, header=header) return ws def get_data(self, num): """ 发起请求获取数据 """ retry_num = 0 while True: retry_num += 1 if retry_num > 3: logger.error('重试超过次数!') return try: ws = self.open_connection(num) # message = input("Enter message: ") # 测了下好像不会过期(约20个小时) 该行代码有可能报错 ws.send('pong') break except: logger.warning('wss通信失败,重试...') time.sleep(1) response = ws.recv() logger.info(f'response: {num}') data = json.loads(response)
Top comments (0)