Прослуживание WebSocket чужого сайта на Node.js

Хотел бы узнать, если ты способ "слушать" соккет чужого сайта? Мне казалось, что это должно быть довольно просто, но потратив на этот вопрос около 4 часов, я так ни к чему и не пришел.

В данный момент сервер не возвращает никаких ошибок, но подключится я не могу.


const io = require("socket.io-client")('wss://socket.csgo500.com/socket.io/?EIO=3&transport=websocket', { 
    transports: ['websocket'],
    agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
});

console.log(io);

io.on('connect', function () {
    io.on('message', function (data) {
        console.log(data);
    });
});

io.on('connect_error', function (err) {
  console.log('connect_error');
});


io.on('reconnect_error', function (err) {
  console.log('reconnect_error');
});

Ответы (1 шт):

Автор решения: nörbörnën

Откроем сайт и посмотрим какие параметры передаются в заголовка при подключении к websocket

введите сюда описание изображения

Сookie и Origin могут иметь важное значение для подключения.

Попробуем передать их при подключении:

Устанавливаем библиотеку ws

yarn add ws || npm install ws --save

Пишем программу, обратите внимание, что Сookie я подставил не в том виде, что передаётся в заголовках, а предварительно раскодировав decodeURIComponent:

const WebSocket = require('ws');

const ws = new WebSocket(
  'wss://socket.csgo500.com/socket.io/?EIO=3&transport=websocket',
  {
    perMessageDeflate: false,
    headers: {
      'Cookie': 'express.sid=s:-mcAHEsnhCqJJ9rsCBxCQpFURquWbbaE.flM+FPjDs/4MDuremyq8Y9QJIPHoul/8y0C62BhELTw; __ssid=e2f5d8b81c4d8b50eb11810999db063',
      'Origin': 'https://csgo500.com',
    }
  }
);

ws.on('open', () => console.log('open'));
ws.on('close', (err) => console.log('close', err));
ws.on('error', (err) => console.log('error', err));
ws.on('upgrade', () => console.log('upgrade'));
ws.on('ping', () => console.log('ping'));
ws.on('message', (data) => {
  const chank = data.toString().replace(/^\d+/, '');
  if (chank !== '') {
    console.log(JSON.parse(chank));
  }
});

Данные, которые получает программа:

{
  sid: 'eP3rCib1OovI7WZdATdk',
  upgrades: [],
  pingInterval: 25000,
  pingTimeout: 60000
}
[ 'init', {} ]
[
  'past queue',
  [
    {
      roundId: 'b355e745-bca6-4dd9-b626-0ce93af0e9a1',
      nonce: 4394614,
      startDate: '2021-05-29T17:49:12.207Z',
      random: 15,
      choice: 1
    },
...
[ 'number players', 2832 ]
[
  'classic-round-start',
  {
    round: {
      roundId: '7b12f4e4-de6e-4f22-9943-b075cfa1f258',
      nonce: 651258,
      startDate: '2021-05-29T20:03:33.275Z',
      time: 24999,
      reservations: [],
      myReservations: []
    },
    winner: {
      roundId: '6d9292c5-4900-4c9b-9850-b416fd92fb8d',
      nonce: 651257,
      startDate: '2021-05-29T20:03:01.241Z',
      random: 8,
      choice: 1
    }
  }
]

→ Ссылка