tenequm

Untitled

Jan 24th, 2025
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import puppeteer from 'puppeteer-core';
  2. import { URLSearchParams } from 'url';
  3. import 'dotenv/config';
  4.  
  5. class DexScreenerParser {
  6.     private readonly baseUri: string = 'wss://io.dexscreener.com/dex/screener/v4/pairs/h24/1';
  7.     private readonly params: URLSearchParams = new URLSearchParams({
  8.         'rankBy[key]': 'trendingScoreH6',
  9.         'rankBy[order]': 'desc',
  10.         'filters[chainIds][0]': 'solana',
  11.     });
  12.  
  13.     async startMainLoop(): Promise<void> {
  14.         console.log('Starting DexScreener parser...');
  15.         const connectionURL = `wss://browser.zenrows.com?apikey=${process.env.ZENROWS_API_KEY}`;
  16.         const targetWsUrl = `${this.baseUri}?${this.params.toString()}`;
  17.  
  18.         const browser = await puppeteer.connect({
  19.             browserWSEndpoint: connectionURL,
  20.             defaultViewport: null
  21.         });
  22.  
  23.         try {
  24.             const page = await browser.newPage();
  25.             console.log('Browser page created');
  26.  
  27.             // Expose functions for WebSocket communication
  28.             await page.exposeFunction('onWebSocketData', (data: any, isBinary: boolean) => {
  29.                 if (isBinary) {
  30.                     const binaryData = Buffer.from(data, 'base64');
  31.                     console.log('Binary WebSocket data received:', binaryData);
  32.                    
  33.                     if (binaryData[0] === 0x00) {
  34.                         console.log('Received binary message type 0');
  35.                     }
  36.                 } else {
  37.                     console.log('Text WebSocket data received:', data);
  38.                 }
  39.             });
  40.  
  41.             await page.exposeFunction('onWebSocketOpen', () => {
  42.                 console.log('WebSocket connection opened');
  43.             });
  44.  
  45.             await page.exposeFunction('onWebSocketError', (error: any) => {
  46.                 console.error('WebSocket error:', error);
  47.             });
  48.  
  49.             // Navigate to DexScreener first
  50.             await page.goto('https://dexscreener.com', {
  51.                 waitUntil: 'networkidle0',
  52.                 timeout: 60000
  53.             });
  54.             console.log('Navigation complete');
  55.  
  56.             // Create WebSocket connection using page's context
  57.             const wsResult = await page.evaluate(async (wsUrl) => {
  58.                 try {
  59.                     const ws = new WebSocket(wsUrl);
  60.                    
  61.                     ws.onopen = () => {
  62.                         console.log('WebSocket opened in browser');
  63.                         (window as any).onWebSocketOpen();
  64.                     };
  65.  
  66.                     ws.onmessage = (event) => {
  67.                         console.log('WebSocket message received in browser');
  68.                         if (event.data instanceof Blob) {
  69.                             const reader = new FileReader();
  70.                             reader.onload = () => {
  71.                                 const base64 = (reader.result as string).split(',')[1];
  72.                                 (window as any).onWebSocketData(base64, true);
  73.                             };
  74.                             reader.readAsDataURL(event.data);
  75.                         } else {
  76.                             (window as any).onWebSocketData(event.data, false);
  77.                         }
  78.                     };
  79.  
  80.                     ws.onerror = (error) => {
  81.                         console.error('WebSocket error in browser:', error);
  82.                         (window as any).onWebSocketError(error);
  83.                     };
  84.  
  85.                     ws.onclose = (event) => {
  86.                         console.log('WebSocket closed in browser:', event.code, event.reason);
  87.                     };
  88.  
  89.                     (window as any).ws = ws;
  90.                     return 'WebSocket initialized';
  91.                 } catch (error: unknown) {
  92.                     if (error instanceof Error) {
  93.                         return `Error: ${error.message}`;
  94.                     }
  95.                     return `Error: ${String(error)}`;
  96.                 }
  97.             }, targetWsUrl);
  98.  
  99.             console.log('WebSocket setup result:', wsResult);
  100.  
  101.             return new Promise<void>((resolve) => {
  102.                 process.on('SIGINT', async () => {
  103.                     await browser.close();
  104.                     resolve();
  105.                 });
  106.             });
  107.  
  108.         } catch (error) {
  109.             console.error('Error:', error);
  110.             await browser.close();
  111.             throw error;
  112.         }
  113.     }
  114. }
  115.  
  116. console.log('Initializing parser...');
  117. const parser = new DexScreenerParser();
  118. parser.startMainLoop().catch(console.error);
Add Comment
Please, Sign In to add comment