api_main

Различия

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

Ссылка на это сравнение

Следующая версия
Предыдущая версия
api_main [2021/07/13 17:08]
admin создано
api_main [2021/10/19 13:05]
phaust удалено
Строка 1: Строка 1:
-В игре ​надо создать ключ +====== Зашифрованная информация об игре ​====== 
-В разделе 'API для внешних сайтов/​телеграм ботов'​ ткнуть кнопку '​Сгенерировать'​+ 
 +===== Зачем?​===== 
 + 
 +Если необходимо передать некую информацию об игре во время игры ​сторонним сервисам (телеграм ботам, сторонним скриптам и т.п.) - то рекомендуется пользоваться генерацией зашифрованной строки. В этом случае ​даже технически подкованные игроки не смогут увидеть, какая именно информация передаётся,​ и подменить её самостоятельно (особенно актуально на Лонг форматах). 
 + 
 +===== Как?​===== 
 + 
 +==== Генерация ​ключа ==== 
 + 
 +В игре надо создать ключ. Для этого в редакторе игры в разделе 'API для внешних сайтов/​телеграм ботов'​ ткнуть кнопку '​Сгенерировать'​
 + 
 +==== Использование в задании ====
  
 В заданиях и описании игры можно использовать конструкцию !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! +**данные** - нужные стороннему серверу - указываются через запятую:​ 
-Сгенерирует зашифрованную строку {'​u':​15, 'tid:32432}+ 
 +  * 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'',​ которую можно расшифровать в <​code>​ 
 +{'​u': ​162862, 'tid'42719} 
 +</​code>​ 
 +с помощью ключа игры ''​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
  
-[[https://​qeng.org/​game.php?​gid=3493&​tid=42719|Пример задания]] 
  
 +if __name__ == '​__main__':​
 +    main()
 +</​code>​