Inn-Book Socket API (TSP подключение)
Inn-Book предоставляет Socket API по адресу: - host: sockota.inn-book.com - port: 44558
⚠️ JSON После каждого JSON-объекта используйте перенос строки.
API предназначен только для получения обновлений от системы Inn-Book. Используется для уведомлений о любых изменениях (например, бронированиях, отменах, изменениях статуса и т.д.). Все данные приходят в виде строк JSON (одна строка — один JSON-объект). Формат всех уведомлений полностью соответствует методам из раздела REST API OTA. REST API продолжает использоваться для получения детальной информации и управления.
Поведение и обработкаСразу после подключения клиент обязан аутентифицироваться:
{
"act": "auth",
"key": "<ваш ключ авторизации>"
}
Поддержка соединения:
Периодически Inn-Book будет отправлять ping-запрос: { "type": "ping" }
В ответ клиент должен вернуть: { "act": "pong" }
⚠️ Важно знать Socket API является уведомительным каналом, не заменяет REST API. Если соединение по TSP обрывается, система автоматически переключается на вебхук (если настроен URL для уведомлений в OTA). На этапе тестирования уведомления могут приходить одновременно и в сокет, и в вебхук — это нормальное поведение.
const net = require('net');
const HOST = 'sockota.inn-book.com';
const PORT = 44558;
const AUTH_KEY = 'your_api_key_here'; // ← Замените на ваш ключ авторизации
const client = net.createConnection({ host: HOST, port: PORT }, () => {
console.log('✅ Connected to Inn-Book Socket API');
});
client.setEncoding('utf8');
// Буфер для обработки поступающих данных
let buffer = '';
client.on('data', (chunk) => {
buffer += chunk;
// Разделим по строкам (каждое сообщение должно приходить как строка JSON)
let lines = buffer.split('\n');
buffer = lines.pop(); // Оставим последний неполный кусок (если есть) в буфере
for (let line of lines) {
if (!line.trim()) continue;
try {
const msg = JSON.parse(line);
// Обработка сообщений
if (msg.type === 'auth') {
console.log('Auth request received');
const authResponse = JSON.stringify({ act: 'auth', key: AUTH_KEY }) + '\n';
client.write(authResponse);
console.log('Sent auth response');
} else if (msg.type === 'ping') {
console.log('Ping received');
const pongResponse = JSON.stringify({ act: 'pong' }) + '\n';
client.write(pongResponse);
console.log('Sent pong');
} else {
console.log('Received data:', msg);
// здесь можно обрабатывать другие действия по act
}
} catch (e) {
console.error('Failed to parse message:', line);
}
}
});
client.on('end', () => {
console.log('Disconnected from server');
});
client.on('error', (err) => {
console.error('Connection error:', err);
});
Пример клиента на php
$host = 'sockota.inn-book.com';
$port = 44558;
$authKey = 'your_api_key_here'; // ← Замените на ваш ключ
$fp = stream_socket_client("tcp://$host:$port", $errno, $errstr, 30);
if (!$fp) {
echo "Ошибка подключения: $errstr ($errno)\n";
exit;
}
stream_set_blocking($fp, true); // Блокирующий режим
echo "Подключено к $host:$port\n";
while (!feof($fp)) {
$line = fgets($fp);
if ($line === false) {
echo "Соединение прервано.\n";
break;
}
$data = trim($line);
if (!$data) continue;
echo "Получено: $data\n";
$json = json_decode($data, true);
if (!$json) {
echo "Неверный JSON\n";
continue;
}
if (isset($json['type']) && $json['type'] === 'auth') {
echo "Авторизация...\n";
$response = json_encode(['act' => 'auth', 'key' => $authKey]) . "\n";
fwrite($fp, $response);
echo "Отправлен ключ авторизации\n";
} elseif (isset($json['type']) && $json['type'] === 'ping') {
echo "Ping получен — отправляем pong\n";
$pong = json_encode(['act' => 'pong']) . "\n";
fwrite($fp, $pong);
} else {
echo "Другое сообщение:\n";
print_r($json);
}
}
fclose($fp);
echo "Соединение закрыто.\n";
Пример TSP-клиента на Python (с использованием модуля socket)
import socket
import json
HOST = 'sockota.inn-book.com'
PORT = 44558
AUTH_KEY = 'your_api_key_here' # 🔑 Замените на ваш API-ключ
def send_json(sock, data):
message = json.dumps(data) + '\n'
sock.sendall(message.encode('utf-8'))
def main():
try:
with socket.create_connection((HOST, PORT)) as sock:
print(f'Подключено к {HOST}:{PORT}')
buffer = ''
while True:
data = sock.recv(4096)
if not data:
print("Соединение закрыто сервером")
break
buffer += data.decode('utf-8')
while '\n' in buffer:
line, buffer = buffer.split('\n', 1)
if not line.strip():
continue
print(f'Получено: {line}')
try:
message = json.loads(line)
except json.JSONDecodeError:
print('Неверный JSON')
continue
# Обработка типа сообщения
if message.get('type') == 'auth':
print('Авторизация...')
send_json(sock, {"act": "auth", "key": AUTH_KEY})
print('Отправлен ключ авторизации')
elif message.get('type') == 'ping':
print('Ping получен — отправляем pong')
send_json(sock, {"act": "pong"})
else:
print('Другое сообщение:')
print(message)
except Exception as e:
print(f'Ошибка подключения: {e}')
if __name__ == '__main__':
main()