ua:authors_main:task_editor:advanced:api_main

Зашифрована інформація про гру (Task API)

Якщо вам необхідно безпечно передати дані про поточного гравця або команду під час гри стороннім зовнішнім сервісам (наприклад, Telegram-боту, скрипту авторизації або кастомному сайту з флеш-грою), використовуйте генерацію зашифрованого рядка.

У цьому випадку навіть технічно підковані гравці не зможуть побачити, які саме дані передаються в URL або параметрах скрипта, і не зможуть підмінити їх самостійно. Це особливо критично на іграх довгого формату (Long).

  • Перейдіть до редактора вашої гри.
  • Знайдіть розділ API для зовнішніх сайтів / телеграм ботів”.
  • Натисніть кнопку “Згенерувати”. Движок створить унікальний ключ (наприклад, XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx).

У тексті завдання, підказки або в параметрах посилання на зовнішній сервіс пропишіть конструкцію виду:

!api:поле1,поле2!

Доступні поля для шифрування (вказуються через кому):

  • user_id — ID гравця. У розшифрованому JSON перетворюється на ключ u.
  • user_name — логін гравця. У JSON — un.
  • team_id — ID команди. У JSON — tm.
  • team_name — назва команди. У JSON — tmn.
  • task_n — порядковий номер поточного рівня. У JSON — t.
  • task_id — ID поточного рівня. У JSON — tid.
  • game_id — ID гри. У JSON — gid.

Якщо ви пропишете в завданні:

!api:user_id,task_id!

Движок згенерує зашифрований hex-рядок виду:

0394334e96a2f0fa738470e9a9778c684ba214990d200eab

Його можна розшифрувати на вашому сервері за допомогою ключа гри та алгоритму Blowfish (ECB). В результаті ви отримаєте JSON:

{"u": 162862, "tid": 42719}

Приклад завдання в грі

$data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab';
$key  = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx';
$decoded = json_decode(
  trim(
    openssl_decrypt(
      hex2bin($data),
      'BF-ECB',
      $key,
      OPENSSL_RAW_DATA | OPENSSL_NO_PADDING
    )
  ),
  true
);
// $decoded => array('u' => 162862, 'tid' => 42719)

*(Потрібна бібліотека blowfish: pip install blowfish)*

import binascii
import json
import typing
import blowfish
 
def decrypt_qeng_data(data: str, key: str) -> typing.Dict[str, typing.Union[str, int]]:
    data_bytes = binascii.unhexlify(data)
    cipher = blowfish.Cipher(key.encode())
    data_decrypted = b"".join(cipher.decrypt_ecb(data_bytes))
    data_decrypted = data_decrypted.rstrip(b'\x00')
    return json.loads(data_decrypted)
 
# Використання
data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab'
key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx'
print(decrypt_qeng_data(data, key)) # => {'u': 162862, 'tid': 42719}
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
 
# Використання
data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab'
key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx'
puts qeng_data_decrypt(data, key) # => {:u=>162862, :tid=>42719}
  • ua/authors_main/task_editor/advanced/api_main.txt
  • Last modified: 2026/06/15 21:05
  • (external edit)