Различия
Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
api_main [2021/10/19 11:28] phaust [Пример] |
— (текущий) | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== Зашифрованная информация об игре ====== | ||
| - | ===== Зачем?===== | ||
| - | |||
| - | Если необходимо передать некую информацию об игре во время игры сторонним сервисам (телеграм ботам, сторонним скриптам и т.п.) - то рекомендуется пользоваться генерацией зашифрованной строки. В этом случае даже технически подкованные игроки не смогут увидеть, какая именно информация передаётся, и подменить её самостоятельно (особенно актуально на Лонг форматах). | ||
| - | |||
| - | ===== Как?===== | ||
| - | |||
| - | ==== Генерация ключа ==== | ||
| - | |||
| - | В игре надо создать ключ. Для этого в редакторе игры в разделе '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: | ||
| - | <code 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} | ||
| - | </code> | ||
| - | |||
| - | Пример расшифровки на Python: | ||
| - | <code 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() | ||
| - | </code> | ||