{{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}