authors_main:author_advanced: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()

Пример расшифровки на 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}
  • authors_main/author_advanced/api_main.txt
  • Последние изменения: 2021/11/01 20:36
  • admin