extension.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. """
  2. @ Author: Mr.Hat
  3. @ Date: 2024/3/30 14:05
  4. @ Description: 小草WS扩展程序
  5. @ History:
  6. """
  7. import json
  8. import time
  9. from aiohttp import WSMsgType
  10. import uuid
  11. from core.utils.exception import WebsocketClosedException, ProxyForbiddenException
  12. class GrassWs:
  13. def __init__(self, user_agent: str = None, proxy: str = None):
  14. self.user_agent = user_agent
  15. self.proxy = proxy
  16. self.session = None
  17. self.websocket = None
  18. async def connect(self):
  19. uri = "wss://proxy.wynd.network:4444/"
  20. headers = {
  21. 'Pragma': 'no-cache',
  22. 'Origin': 'chrome-extension://ilehaonighjijnmpnagapkhpcdbhclfg',
  23. 'Accept-Language': 'uk-UA,uk;q=0.9,en-US;q=0.8,en;q=0.7',
  24. 'User-Agent': self.user_agent,
  25. 'Upgrade': 'websocket',
  26. 'Cache-Control': 'no-cache',
  27. 'Connection': 'Upgrade',
  28. 'Sec-WebSocket-Version': '13',
  29. 'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
  30. }
  31. try:
  32. self.websocket = await self.session.ws_connect(uri, proxy_headers=headers, proxy=self.proxy)
  33. except Exception as e:
  34. if 'status' in dir(e) and e.status == 403:
  35. raise ProxyForbiddenException(f"Low proxy score. Can't connect. Error: {e}")
  36. raise e
  37. async def send_message(self, message):
  38. # logger.info(f"Sending: {message}")
  39. await self.websocket.send_str(message)
  40. async def receive_message(self):
  41. msg = await self.websocket.receive()
  42. # logger.info(f"Received: {msg}")
  43. if msg.type == WSMsgType.CLOSED:
  44. raise WebsocketClosedException(f"Websocket closed: {msg}")
  45. return msg.data
  46. async def get_connection_id(self):
  47. msg = await self.receive_message()
  48. return json.loads(msg)['id']
  49. async def auth_to_extension(self, browser_id: str, user_id: str):
  50. connection_id = await self.get_connection_id()
  51. message = json.dumps(
  52. {
  53. "id": connection_id,
  54. "origin_action": "AUTH",
  55. "result": {
  56. "browser_id": browser_id,
  57. "user_id": user_id,
  58. "user_agent": self.user_agent,
  59. "timestamp": int(time.time()),
  60. "device_type": "extension",
  61. "version": "3.3.2"
  62. }
  63. }
  64. )
  65. await self.send_message(message)
  66. async def send_ping(self):
  67. message = json.dumps(
  68. {"id": str(uuid.uuid4()), "version": "1.0.0", "action": "PING", "data": {}}
  69. )
  70. await self.send_message(message)
  71. async def send_pong(self):
  72. connection_id = await self.get_connection_id()
  73. message = json.dumps(
  74. {"id": connection_id, "origin_action": "PONG"}
  75. )
  76. await self.send_message(message)