extension.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. if self.proxy:
  32. try:
  33. self.websocket = await self.session.ws_connect(uri, proxy_headers=headers, proxy=self.proxy)
  34. except Exception as e:
  35. if 'status' in dir(e) and e.status == 403:
  36. raise ProxyForbiddenException(f"Low proxy score. Can't connect. Error: {e}")
  37. raise e
  38. else:
  39. try:
  40. self.websocket = await self.session.ws_connect(uri, proxy_headers=headers)
  41. except Exception as e:
  42. if 'status' in dir(e) and e.status == 403:
  43. raise ProxyForbiddenException(f"Low proxy score. Can't connect. Error: {e}")
  44. raise e
  45. async def send_message(self, message):
  46. # logger.info(f"Sending: {message}")
  47. await self.websocket.send_str(message)
  48. async def receive_message(self):
  49. msg = await self.websocket.receive()
  50. # logger.info(f"Received: {msg}")
  51. if msg.type == WSMsgType.CLOSED:
  52. raise WebsocketClosedException(f"Websocket closed: {msg}")
  53. return msg.data
  54. async def get_connection_id(self):
  55. msg = await self.receive_message()
  56. return json.loads(msg)['id']
  57. async def auth_to_extension(self, browser_id: str, user_id: str):
  58. connection_id = await self.get_connection_id()
  59. message = json.dumps(
  60. {
  61. "id": connection_id,
  62. "origin_action": "AUTH",
  63. "result": {
  64. "browser_id": browser_id,
  65. "user_id": user_id,
  66. "user_agent": self.user_agent,
  67. "timestamp": int(time.time()),
  68. "device_type": "extension",
  69. "version": "3.3.2"
  70. }
  71. }
  72. )
  73. await self.send_message(message)
  74. async def send_ping(self):
  75. message = json.dumps(
  76. {"id": str(uuid.uuid4()), "version": "1.0.0", "action": "PING", "data": {}}
  77. )
  78. await self.send_message(message)
  79. async def send_pong(self):
  80. connection_id = await self.get_connection_id()
  81. message = json.dumps(
  82. {"id": connection_id, "origin_action": "PONG"}
  83. )
  84. await self.send_message(message)