Предисловие
На некоторых сайтах, данные о ценах предметов приходят по веб-сокету. В данной статье, мы научимся подключаться к веб-сокету на сайте quicksell.store, используя библиотеку websocket-client.
Что такое веб-сокет.
Веб-сокет — это протокол обмена сообщениями между клиентом и сервером.
На русском это значит что это, что-то вроде чата (наподобии ВК), где, например ты:
- отпраляешь серверу текст «скинь цены предметов»
- и он отвечает «держи 1 ключ = 1 реф, продавать будешь?»
Сообщения по веб-сокету можно отследить в браузере Mozilla Firefox, используя инструменты разработчика. Теперь. перейдем к делу.
Читаем переписки.
Зайдите на сайт quicksell.store. Откройте инструменты разработчика (F12), зайдите во вкладку Сеть, включите фильтр по веб-сокетам (WS), и обновите страницу.
Выберите любой из вебсокетов, и нажмите на кладку Ответ
Как вы видите, здесь отображены:
- принятые сообщения (красная стрелка вниз)
- и переданные сообщения (зеленая стрекла вверх)
Сообщения получены, осталось отправить их через Python скрипт.
Пишем код.
Перед началом, установите библиотеку websocket-client, введя следующую комманду, в коммандной строке.
pip install websocket-client
Далее, cкопируйте себе данный скрипт:
import websocket
header = {
'user-agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0'
}
def on_message(ws, message):
try:
print("Got msg: ", message)
pass
except:
print('error occured - ignorring')
def on_error(ws, error):
print("received error as {}".format(error))
def on_close(ws):
print("Connection closed")
def on_open(ws):
print("Open connection")
ws.send('{"event":"load_stock","args":[{"type":"function","id":"qbotk"}]}')
def start():
websocket.enableTrace(True)
ws = websocket.WebSocketApp("wss://quicksell.store/",
on_message = on_message,
on_error = on_error,
on_close = on_close,
header=header)
ws.on_open = on_open
ws.run_forever()
start()
Разберем его.
import websocket
Импортируем нужную библиотеку. Опустимся в функцию start.
websocket.enableTrace(True)
Включаем отладку.
ws = websocket.WebSocketApp("wss://quicksell.store/",
on_message = on_message,
on_error = on_error,
on_close = on_close,
header=header)
Здесь, я использую обьект websocket.WebSocketApp который принимает принимает обработчики события. Первым аргументом указал, к какому серверу нужно подключаться wss://quicksell.store.
Передал 3 callBack функции (функции которые вызываются другими функциями).
- on_message — будет вызываться в момент получения сообщения.
- on_error — вызывается, при получении ошибки.
- on_close — запускается перед закрытием веб-сокета.
И передал заголовок (header) с user-agent, на всякий случай.
После чего, передал callBack функцию on_open. Которая, запускается после открытия веб-сокета.
ws.on_open = on_open
И, в конце, открыл веб сокет.
ws.run_forever()
Далее, в функции on_open, я отправил сообщение с помощью функции ws.send, взятое ранее во время отладки, сообщение замените на свое.
ws.send('{"event":"load_stock","args":[{"type":"function","id":"qbotk"}]}')
Запустите скрипт.
На выходе получили json данные.
Закрыть веб-сокет, можно коммандой ws.close()
Другой вариант написания кода.
Есть еще один способ написания кода. В нем используется обьект WebSocket вместо WebSocketApp. Чуть ниже, привел предыдущий код, адаптированный под обьект WebSocket.
ws = websocket.WebSocket()
ws.connect("wss://quicksell.store/")
ws.send('{"event":"load_stock","args":[{"type":"function","id":"qbotk"}]}')
while True:
data = ws.recv()
print(data)
Разберем его.
ws = websocket.WebSocket()
Создаем обьект WebSocket
ws.connect("wss://quicksell.store/")
Подключаемся к серверу
ws.send('{"event":"load_stock","args":[{"type":"function","id":"qbotk"}]}')
Отправляем сообщение серверу
while True:
data = ws.recv()
print(data)
В бесконечном цикле while, получаем данные по веб-сокету (ws.recv), и выводим их в консоль.