api_main

Это старая версия документа!


Зашифрованная информация об игре

Если необходимо передать некую информацию об игре во время игры сторонним сервисам (телеграм ботам, сторонним скриптам и т.п.) - то рекомендуется пользоваться генерацией зашифрованной строки. В этом случае даже технически подкованные игроки не смогут увидеть, какая именно информация передаётся, и подменить её самостоятельно (особенно актуально на Лонг форматах).

В игре надо создать ключ. Для этого в редакторе игры в разделе '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.

Пример задания в игре

Пример расшифровки на 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()
  • api_main.1634648751.txt.gz
  • Последние изменения: 2021/10/19 13:05
  • phaust