Как использовать кукольник для сброса данных WebSocket

Я хочу получить данные websocket на этой странице https://upbit.com/exchange?code=CRIX.UPBIT.KRW-BTC, его URL-адрес веб-раскладки является динамическим и действителен только во время первого подключения, второй время, когда вы подключаетесь к нему, оно больше не будет отправлять данные.

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

Итак, я удивляюсь, что, возможно, безголовый хром может помочь мне контролировать данные websocket.

Любые идеи? Спасибо!

Ответ 1

На самом деле вам не нужно ничего делать сложным. URL-адрес кажется динамичным, но отлично работает и с кодом. Причина, по которой он не работает, заключается в том, что вам нужно понять, что происходит в фоновом режиме.

Сначала рассмотрим вкладку "Сеть".

URL-адрес веб-узла

Файлы cookie и Origin могут иметь значение для подключения. Поэтому мы отмечаем их.

Теперь посмотрим на обмен данными в сокете

Запуск фреймов

Средние рамки

Если вы посмотрите на фреймы, исходный кадр получает o в качестве данных, что может указывать на открытие соединения. Затем веб-сайт отправляет некоторые данные в сокет, что может быть связано с тем, что мы хотим запросить. Когда соединение будет остановлено в течение некоторого времени, сокет получает h в качестве данных. Это может указывать на удержание или что-то (как показано на втором изображении)

Чтобы получить точные данные, мы помещаем точку останова в код

Точка останова

И затем напечатайте значение в консоли

отправленные данные

Теперь у нас достаточно информации, чтобы попасть в часть кодирования. Я нашел ниже, чтобы быть хорошей библиотекой websocket для этого

https://github.com/websockets/ws

Итак, мы делаем

yarn add ws || npm install ws --save

Теперь напишем наш код

const WebSocket = require("ws")
const ws = new WebSocket("wss://example.com/sockjs/299/enavklnl/websocket",null,{
    headers: {
        "Cookie":"<cookie data noted earlier>",
        "User-Agent": "<Your browser agent>"
    },
    origin: "https://example.com",
})
const opening_message = '["[{\\"ticket\\":\\"ram macbook\\"},{\\"type\\":\\"recentCrix\\",\\"codes\\":[\\"CRIX.UPBIT.KRW-BTC\\",\\"CRIX.BITFINEX.USD-BTC\\",\\"CRIX.BITFLYER.JPY-BTC\\",\\"CRIX.OKCOIN.CNY-BTC\\",\\"CRIX.KRAKEN.EUR-BTC\\",\\"CRIX.UPBIT.KRW-DASH\\",\\"CRIX.UPBIT.KRW-ETH\\",\\"CRIX.UPBIT.KRW-NEO\\",\\"CRIX.UPBIT.KRW-BCC\\",\\"CRIX.UPBIT.KRW-MTL\\",\\"CRIX.UPBIT.KRW-LTC\\",\\"CRIX.UPBIT.KRW-STRAT\\",\\"CRIX.UPBIT.KRW-XRP\\",\\"CRIX.UPBIT.KRW-ETC\\",\\"CRIX.UPBIT.KRW-OMG\\",\\"CRIX.UPBIT.KRW-SNT\\",\\"CRIX.UPBIT.KRW-WAVES\\",\\"CRIX.UPBIT.KRW-PIVX\\",\\"CRIX.UPBIT.KRW-XEM\\",\\"CRIX.UPBIT.KRW-ZEC\\",\\"CRIX.UPBIT.KRW-XMR\\",\\"CRIX.UPBIT.KRW-QTUM\\",\\"CRIX.UPBIT.KRW-LSK\\",\\"CRIX.UPBIT.KRW-STEEM\\",\\"CRIX.UPBIT.KRW-XLM\\",\\"CRIX.UPBIT.KRW-ARDR\\",\\"CRIX.UPBIT.KRW-KMD\\",\\"CRIX.UPBIT.KRW-ARK\\",\\"CRIX.UPBIT.KRW-STORJ\\",\\"CRIX.UPBIT.KRW-GRS\\",\\"CRIX.UPBIT.KRW-VTC\\",\\"CRIX.UPBIT.KRW-REP\\",\\"CRIX.UPBIT.KRW-EMC2\\",\\"CRIX.UPBIT.KRW-ADA\\",\\"CRIX.UPBIT.KRW-SBD\\",\\"CRIX.UPBIT.KRW-TIX\\",\\"CRIX.UPBIT.KRW-POWR\\",\\"CRIX.UPBIT.KRW-MER\\",\\"CRIX.UPBIT.KRW-BTG\\",\\"CRIX.COINMARKETCAP.KRW-USDT\\"]},{\\"type\\":\\"crixTrade\\",\\"codes\\":[\\"CRIX.UPBIT.KRW-BTC\\"]},{\\"type\\":\\"crixOrderbook\\",\\"codes\\":[\\"CRIX.UPBIT.KRW-BTC\\"]}]"]'
ws.on('open', function open() {
    console.log("opened");
});

ws.on('message', function incoming(data) {
    if (data == "o" || data == "h") {
        console.log("sending opening message")
        ws.send(opening_message)
    }
    else {
        console.log("Received", data)

    }
});

И запустив код, мы получим

Рабочий код

Теперь, если я заменил

const ws = new WebSocket("wss://example.com/sockjs/299/enavklnl/websocket",null,{
    headers: {
        "Cookie":"<cookie data noted earlier>",
        "User-Agent": "<Your browser agent>"
    },
    origin: "https://example.com",
})

к

const ws = new WebSocket("wss://example.com/sockjs/299/enavklnl/websocket")

Это означает, что cookies и origin никогда не нуждались в этом. Но я бы порекомендовал вам их использовать.

Ответ 2

Я не думаю, что у кукловода есть поддержка этого еще, но протокол нижнего уровня здесь: https://chromedevtools.github.io/devtools-protocol/tot/Network/#event-webSocketFrameSent и https://chromedevtools.github.io/devtools-protocol/tot/Network#type-WebSocketResponse. Это означает, что вы можете реализовать это самостоятельно в библиотеке, если хотите.

Ответ 3

  const client = page._client

  client.on('Network.webSocketCreated', ({requestId, url}) => {
    console.log('Network.webSocketCreated', requestId, url)
  })

  client.on('Network.webSocketClosed', ({requestId, timestamp}) => {
    console.log('Network.webSocketClosed', requestId, timestamp)
  })

  client.on('Network.webSocketFrameSent', ({requestId, timestamp, response}) => {
    console.log('Network.webSocketFrameSent', requestId, timestamp, response.payloadData)
  })
  client.on('Network.webSocketFrameReceived', ({requestId, timestamp, response}) => {
    console.log('Network.webSocketFrameReceived', requestId, timestamp, response.payloadData)
  })

Это с помощью протокола DevTools напрямую - https://chromedevtools.github.io/devtools-protocol/tot/Network#event-webSocketClosed