{{indexmenu_n>40}}
====== Зашифрована інформація про гру (Task API) ======
===== Навіщо це потрібно? =====
Якщо вам необхідно безпечно передати дані про поточного гравця або команду під час гри стороннім зовнішнім сервісам (наприклад, Telegram-боту, скрипту авторизації або кастомному сайту з флеш-грою), використовуйте генерацію зашифрованого рядка.
У цьому випадку навіть технічно підковані гравці не зможуть побачити, які саме дані передаються в URL або параметрах скрипта, і не зможуть підмінити їх самостійно. Це особливо критично на іграх довгого формату (Long).
===== Як це налаштувати? =====
==== 1. Генерація секретного ключа ====
* Перейдіть до редактора вашої гри.
* Знайдіть розділ **"API для зовнішніх сайтів / телеграм ботів"**.
* Натисніть кнопку **"Згенерувати"**. Движок створить унікальний ключ (наприклад, ''XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx'').
==== 2. Використання плейсхолдера в завданні ====
У тексті завдання, підказки або в параметрах посилання на зовнішній сервіс пропишіть конструкцію виду:
!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}
[[https://qeng.org/game.php?jump_to&gid=3493&task_id=42719|Приклад завдання в грі]]
===== Приклади розшифрування на сервері =====
==== PHP ====
$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)
==== Python ====
*(Потрібна бібліотека 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}
==== 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
# Використання
data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab'
key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx'
puts qeng_data_decrypt(data, key) # => {:u=>162862, :tid=>42719}