api_main

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
api_main [2021/07/13 17:20]
admin
api_main [2021/10/19 13:05]
phaust удалено
Строка 1: Строка 1:
 +====== Зашифрованная информация об игре ======
 +
 +===== Зачем?​=====
 +
 +Если необходимо передать некую информацию об игре во время игры сторонним сервисам (телеграм ботам, сторонним скриптам и т.п.) - то рекомендуется пользоваться генерацией зашифрованной строки. В этом случае даже технически подкованные игроки не смогут увидеть,​ какая именно информация передаётся,​ и подменить её самостоятельно (особенно актуально на Лонг форматах).
 +
 +===== Как?​=====
 +
 +==== Генерация ключа ====
 +
 В игре надо создать ключ. Для этого в редакторе игры в разделе 'API для внешних сайтов/​телеграм ботов'​ ткнуть кнопку '​Сгенерировать'​. В игре надо создать ключ. Для этого в редакторе игры в разделе 'API для внешних сайтов/​телеграм ботов'​ ткнуть кнопку '​Сгенерировать'​.
 +
 +==== Использование в задании ====
  
 В заданиях и описании игры можно использовать конструкцию !api:​**данные**! В заданиях и описании игры можно использовать конструкцию !api:​**данные**!
  
-**данные** - данные ​нужные стороннему серверу - указываются через запятую:​+**данные** - нужные стороннему серверу - указываются через запятую:​
  
   * user_id - id юзера. В данных поле '​u'​.   * user_id - id юзера. В данных поле '​u'​.
Строка 13: Строка 25:
   * game_id - Id игры. В данных поле '​gid'​   * game_id - Id игры. В данных поле '​gid'​
  
-Например:​ !api:​user_id,​task_id! 
  
-Сгенерирует зашифрованную строку ​bc1443bbb42bafc0501bc821c2fb55a987fda029d4ea6657 ​которую можно расшифровать в {'​u':​15, 'tid:32432} с помощью ключа игры.+==== Пример ==== 
 + 
 +Например:​ ''​!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: Пример расшифровки на 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
  
-json_decode(trim(openssl_decrypt(hex2bin($data),​ '​BF-ECB',​ $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)),​ true); 
  
 +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>​