Inn-Book Socket API (TSP подключение)

Основное:

Inn-Book предоставляет Socket API по адресу:
- host: sockota.inn-book.com
- port: 44558

⚠️ JSON
После каждого JSON-объекта используйте перенос строки.


Подключение осуществляется через любой TSP клиент (например, на Node.js — tls.connect или net.connect)
Все данные приходят в виде строк JSON (одна строка — один JSON-объект).
Формат всех уведомлений полностью соответствует методам из раздела REST API OTA.
cancelIntegration
availability
updatePrice
updateHotel
updateBooking


Назначение API:

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).
На этапе тестирования уведомления могут приходить одновременно и в сокет, и в вебхук — это нормальное поведение.


Пример клиента на node js

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()