{{indexmenu_n>30}} ====== Зашифрованная информация об игре ====== ===== Зачем?===== Если необходимо передать некую информацию об игре во время игры сторонним сервисам (телеграм ботам, сторонним скриптам и т.п.) - то рекомендуется пользоваться генерацией зашифрованной строки. В этом случае даже технически подкованные игроки не смогут увидеть, какая именно информация передаётся, и подменить её самостоятельно (особенно актуально на Лонг форматах). ===== Как?===== ==== Генерация ключа ==== В игре надо создать ключ. Для этого в редакторе игры в разделе 'API для внешних сайтов/телеграм ботов' ткнуть кнопку 'Сгенерировать'. ==== Использование в задании ==== В заданиях и описании игры можно использовать конструкцию !api:**данные**! **данные** - нужные стороннему серверу - указываются через запятую: * user_id - id юзера. В данных поле 'u'. * user_name - Логин юзера. В данных поле 'un' * team_id - Id команды. В данных поле 'tm' * team_name - Названия команды. В данных поле 'tmn' * task_n - Номер уровня. В данных поле 't' * task_id - Id уровня. В данных поле 'tid' * game_id - Id игры. В данных поле 'gid' ==== Пример ==== Чтобы получить зашифрованную строку в игре: ''!api:user_id,task_id!'' Сгенерирует зашифрованную строку ''0394334e96a2f0fa738470e9a9778c684ba214990d200eab'', которую можно расшифровать на вашем сервере в {'u': 162862, 'tid': 42719} с помощью ключа игры ''XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx''. [[https://qeng.org/game.php?jump_to&gid=3493&task_id=42719|Пример задания в игре]] ==== Расшифровка ==== Пример расшифровки на PHP: $data='0394334e96a2f0fa738470e9a9778c684ba214990d200eab'; $key='XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx'; $decoded = json_decode( trim( openssl_decrypt( hex2bin($data), 'BF-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING ) ), true ); // Расшифровуется в {'u': 162862, 'tid': 42719} Пример расшифровки на Python: import binascii import json import typing # Чтобы установить blowfish, выполните `pip install blowfish` в cmd import blowfish def decrypt_qeng_data( data: str, key: str, ) -> typing.Dict[str, typing.Union[str, int]]: data = binascii.unhexlify(data) cipher = blowfish.Cipher(key.encode()) data_decrypted = b"".join(cipher.decrypt_ecb(data)) data_decrypted = data_decrypted.rstrip(b'\x00') data_json = json.loads(data_decrypted) return data_json def main(): data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab' key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx' decrypted = decrypt_qeng_data(data, key) print(decrypted) # Выводит {'u': 162862, 'tid': 42719} return None if __name__ == '__main__': main() Пример расшифровки на Ruby: require 'json' require 'openssl' module Blowfish def self.decrypt(data, key) crypto = OpenSSL::Cipher::Cipher.new('bf-ecb').send(:decrypt) crypto.key_len = key.length crypto.key = key crypto.padding = 0 crypto.update([data].pack("H*")) << crypto.final end end def qeng_data_decrypt(data, key) decrypted_text = Blowfish.decrypt(data, key) JSON.parse(decrypted_text, symbolize_names: true) end # Usage example # data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab' key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx' qeng_data_decrypt(data, key) # => {:u=>162862, :tid=>42719}