test_grass_connect.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import asyncio
  2. import random
  3. from fake_useragent import UserAgent
  4. import aiohttp
  5. import logging
  6. class ProxyForbiddenException(Exception):
  7. pass
  8. class GrassConnect:
  9. def __init__(self, proxy: str = None):
  10. self.user_agent = UserAgent().random
  11. self.proxy = proxy
  12. self.session = None
  13. self.websocket = None
  14. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  15. self.logger = logging.getLogger(__name__)
  16. async def __aenter__(self):
  17. self.session = aiohttp.ClientSession()
  18. return self
  19. async def __aexit__(self, exc_type, exc_val, exc_tb):
  20. await self.close()
  21. async def connect(self):
  22. uri = f"wss://proxy.wynd.network"
  23. headers = {
  24. 'Pragma': 'no-cache',
  25. 'Origin': 'chrome-extension://ilehaonighjijnmpnagapkhpcdbhclfg',
  26. 'Accept-Language': 'uk-UA,uk;q=0.9,en-US;q=0.8,en;q=0.7',
  27. 'User-Agent': self.user_agent,
  28. 'Upgrade': 'websocket',
  29. 'Cache-Control': 'no-cache',
  30. 'Connection': 'Upgrade',
  31. 'Sec-WebSocket-Version': '13',
  32. 'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits'
  33. }
  34. while True:
  35. self.logger.info(f"Attempting to connect to {uri} using proxy {self.proxy}")
  36. try:
  37. self.websocket = await self.session.ws_connect(
  38. uri,
  39. headers=headers,
  40. proxy=self.proxy,
  41. proxy_headers=headers
  42. )
  43. self.logger.info(f"Successfully connected to {uri}")
  44. return self.websocket
  45. except aiohttp.ClientResponseError as e:
  46. self.logger.error(f"HTTP error occurred: {e}")
  47. if e.status == 403:
  48. raise ProxyForbiddenException(f"Low proxy score. Can't connect. Error: {e}")
  49. except Exception as e:
  50. self.logger.error(f"Unexpected error occurred: {e}")
  51. self.logger.info("Connection failed. Retrying in 3 seconds...")
  52. await asyncio.sleep(3)
  53. async def close(self):
  54. if self.websocket:
  55. await self.websocket.close()
  56. self.logger.info("Websocket connection closed.")
  57. if self.session:
  58. await self.session.close()
  59. self.logger.info("Client session closed.")
  60. # Example usage
  61. async def main():
  62. proxy = "socks5://192.168.31.201:53012"
  63. async with GrassConnect(proxy=proxy) as connector:
  64. websocket = await connector.connect()
  65. # 继续处理websocket连接
  66. if __name__ == "__main__":
  67. asyncio.run(main())