WebSocket и GZIP - страница 4

 
Получилось у кого-то сделать распаковщик GZIP, если да - поделитесь пожалуйста. Можно даже через кодобазу.
А может MQ и статью захотят.
 
Forester #:
Получилось у кого-то сделать распаковщик GZIP, если да - поделитесь пожалуйста. Можно даже через кодобазу.
А может MQ и статью захотят.

Спасение утопающих - дело рук самих утопающих, а на статью тут вряд ли материал наберется, т.к. чисто технически все уже заложено внутри CryptDecode, но с нами не поделились сакральными знаниями, как согласовать режим сжатия между сервером и клиентом, чтобы получился совместимый формат "deflate".

Предлагаю 2 пункта для метода тыка:

  • поиграться значением server_max_window_bits=? (8..15, якобы по умолчанию 10) в отправляемом с клиента заголовке Sec-WebSocket-Extensions: permessage-deflate (подразумевается также, что там будут и server_no_context_takeover; client_no_context_takeover);
  • перед разжатием данных с помощью CryptDecode пристыковать в конец 4 байта: [0x00, 0x00, 0xff, 0xff] - если делать через книжные исходники, то это файл wsmessage.mqh, метод extract.
 
Stanislav Korotky #:

Спасение утопающих - дело рук самих утопающих, а на статью тут вряд ли материал наберется, т.к. чисто технически все уже заложено внутри CryptDecode, но с нами не поделились сакральными знаниями, как согласовать режим сжатия между сервером и клиентом, чтобы получился совместимый формат "deflate".

Предлагаю 2 пункта для метода тыка:

  • поиграться значением server_max_window_bits=? (8..15, якобы по умолчанию 10) в отправляемом с клиента заголовке Sec-WebSocket-Extensions: permessage-deflate (подразумевается также, что там будут и server_no_context_takeover; client_no_context_takeover);
  • перед разжатием данных с помощью CryptDecode пристыковать в конец 4 байта: [0x00, 0x00, 0xff, 0xff] - если делать через книжные исходники, то это файл wsmessage.mqh, метод extract.

У меня сейчас задача распаковывать архивы с файлом. И уже решил ее вчера. Распаковывает и созданные мной файлы gz и с сервера с которого буду брать нужные файлы.

Кстати - тут писали про то, что архив внутри содержит чанки (блоки) раздленные через последовательность 0x1f 0x8b 0x08.
Написал такой поиск, но ни в моих файлах, ни в файле поставщика (100+мб архива и 500мб данных) таких блоков так и не встретилось. 0x1f 0x8b 0x08 встречается только в начале файла. Упростил функцию, сделал без поиска стало на 10-20% быстрее, чем с поиском.

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

Accept-Encoding: gzip, deflate, br

Если есть gzip, то может вернуть данные в архиве.
Но может и в текстовом виде:
- если сервер не умеет сжимать или оно отключено админом
- если сочтет что затраты на сжатие выше, чем экономия от трафика. Данные меньше 1000 байт может и не сжать, а отправить как есть. Проверять, что пришло можно как раз по первым 3м символам: если 0x1f 0x8b 0x08 - то это GZIP.

Чуть позже (когда у себя доделаю этот модуль и протестирую получше) выложу в кодобазу то, что получилось. Не все варианты возможно будет обрабатывать, но код открытый и любой сможет доработать, если что-то не учтено.

 
есть ссылка на данные передаваемые в GZ? Протестирую. А то у меня только файлы.
 
Forester #:
есть ссылка на данные передаваемые в GZ? Протестирую. А то у меня только файлы.

Уже не нужно.

Проверил с архивом сгенерированным таким PHP кодом:
<?
$t='{"retCode":0,"retMsg":"OK","result":{"category":"linear","list":[... Юя';
echo gzencode($t, 9);
?>

Распаковал успешно. Даже кириллицу понял.

 
Добавил распаковщик GZIP в кодобазу https://www.mql5.com/ru/code/59309
GZIP - Decode
GZIP - Decode
  • www.mql5.com
Распаковка GZIP архивов из *.gz файлов или ответов с сайтов сжатых этим форматом.
 

В контексте работы с WebSocket-ами все-таки важнее работа с фреймами/сообщениями непосредственно в формате deflate, а не файлами GZIP, которые, как видим, не составляет проблемы распознать и обработать средствами MQL5.

Провел эксперимент. Отправляю из MQL5 на эхо-сервер node.js сообщение: "My outbound message".

Из функции CryptEncode уходит бинарный массив:

F3 AD 54 C8 2F 2D 49 CA 2F CD 4B 51 C8 4D 2D 2E 4E 4C 4F 05 00

Он нормально распознается сервером как исходная строка, но от сервера бинарный массив возвращается как:

F2 AD 54 C8 2F 2D 49 CA 2F CD 4B 51 C8 4D 2D 2E 4E 4C 4F 05 00

Видим изменение в первом байте заголовка. И вот эти данные CryptDecode уже не может разжать.

 
Stanislav Korotky #:

В контексте работы с WebSocket-ами все-таки важнее работа с фреймами/сообщениями непосредственно в формате deflate, а не файлами GZIP, которые, как видим, не составляет проблемы распознать и обработать средствами MQL5.

Провел эксперимент. Отправляю из MQL5 на эхо-сервер node.js сообщение: "My outbound message".

Из функции CryptEncode уходит бинарный массив:

Он нормально распознается сервером как исходная строка, но от сервера бинарный массив возвращается как:

Видим изменение в первом байте заголовка. И вот эти данные CryptDecode уже не может разжать.

На PHP у функции сжатия  https://www.php.net/manual/ru/function.gzencode.php по умолчанию стоит

encoding

Режим сжатия, может быть FORCE_GZIP (по умолчанию) или FORCE_DEFLATE.

Вот  FORCE_GZIP https://datatracker.ietf.org/doc/html/rfc1952.html моя функция распознала, а FORCE_DEFLATE - нет, т.к. там другая спецификация https://datatracker.ietf.org/doc/html/rfc1951.html

Есть вероятность, что вебсерверы чаще будут использовать то, что по умолчанию.

PHP: Hypertext Preprocessor
PHP: Hypertext Preprocessor
  • www.php.net
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.
 

Через Python как-то проще выполнить нужную задачу оч много времени уходит что другими путями выстроить код

Как проще получать данные с помощью Python?

Если ваша цель — получать данные (например, котировки, тики, исторические данные) и обрабатывать их, Python действительно может быть проще, особенно если вы уже знакомы с языком. Вот несколько способов организовать получение данных:


Способ 1: Использование библиотеки MetaTrader5

Библиотека MetaTrader5 (доступна через pip install MetaTrader5) позволяет напрямую подключаться к MetaTrader 5, получать котировки, тики, ордера и управлять торговлей.


Пример: Получение котировок и сохранение в ZIP


import MetaTrader5 as mt5
import pandas as pd
from zipfile import ZipFile
from datetime import datetime

# Инициализация MetaTrader 5
if not mt5.initialize():
    print("Ошибка инициализации MT5")
    quit()

# Получение котировок для символа (например, EURUSD)
symbol = "EURUSD"
timeframe = mt5.TIMEFRAME_M1
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, 100)

# Конвертация в DataFrame
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')

# Сохранение в CSV
csv_file = "quotes.csv"
df.to_csv(csv_file, index=False)

# Создание ZIP-архива
zip_file = "quotes.zip"
with ZipFile(zip_file, 'w') as zipf:
    zipf.write(csv_file)

# Завершение работы
mt5.shutdown()
print(f"Данные сохранены в {zip_file}")
 
Yuriy Vasilyev #:

Через Python как-то проще выполнить нужную задачу оч много времени уходит что другими путями выстроить код

Как проще получать данные с помощью Python?

Если ваша цель — получать данные (например, котировки, тики, исторические данные) и обрабатывать их, Python действительно может быть проще, особенно если вы уже знакомы с языком. Вот несколько способов организовать получение данных:


Как это относится к теме топика - WebSocket-ы и GZIP(deflate)?

Задача получать данные извне, а не по известной связке MT5 и его же питонского модуля.