❮  Интеграции

Entrixy → curl / bash тест-скрипт

Готовый пример подключения к Entrixy. Формат вебхука — entrixy.com/webhook.

Отправляет правильно подписанный запрос вебхука на ваш приёмник. Полезен до подключения приложения: проверить, что приёмник (Flask-пример, собственный код, мост перед Home Assistant) проверяет подпись и принимает команду.

Скрипт

Сохраните текст ниже в файл test-webhook.sh:

#!/usr/bin/env bash
#
# Тестовая отправка вебхука Entrixy на ваш приёмник.
# Подписывает запрос HMAC-SHA256 так же, как это делает приложение.
#
# Использование:
#   ./test-webhook.sh https://your-host/webhook YOUR_SECRET
#   ./test-webhook.sh https://your-host/webhook YOUR_SECRET 42 close
#
# Аргументы:
#   $1  адрес приёмника (обязательный)
#   $2  секрет (обязательный)
#   $3  object_id — целое число (необязательный, по умолчанию 1)
#   $4  action — open или close (необязательный, по умолчанию open)
#
# Зависимости: bash, curl, openssl.

set -e

URL="${1:?Не указан адрес. Пример: $0 https://host/webhook SECRET}"
SECRET="${2:?Не указан секрет}"
OBJECT_ID="${3:-1}"
ACTION="${4:-open}"

case "$OBJECT_ID" in ''|*[!0-9]*) echo "object_id должен быть целым числом" >&2; exit 1;; esac

TIMESTAMP=$(date +%s)
# nonce: 16 шестнадцатеричных символов (8 случайных байт), как у приложения
NONCE=$(openssl rand -hex 8)

BASE="${TIMESTAMP}.${NONCE}.${ACTION}.${OBJECT_ID}"
SIGNATURE=$(printf '%s' "$BASE" | openssl dgst -sha256 -hmac "$SECRET" | sed 's/^.* //')

PAYLOAD=$(printf '{"action":"%s","object_id":%s,"timestamp":%s,"nonce":"%s","signature":"%s"}' \
    "$ACTION" "$OBJECT_ID" "$TIMESTAMP" "$NONCE" "$SIGNATURE")

echo "→ POST $URL"
echo "→ $PAYLOAD"
echo

curl -sS -w '\nHTTP %{http_code}\n' \
    -H 'Content-Type: application/json' \
    -d "$PAYLOAD" \
    "$URL"

Запуск

chmod +x test-webhook.sh
./test-webhook.sh https://your-host/webhook YOUR_SECRET

С указанием object_id и action:

./test-webhook.sh https://your-host/webhook YOUR_SECRET 42 close

object_id — целое число, как в запросах приложения. action — open или close.

Что делает скрипт

  1. Берёт текущее время в секундах (unix-timestamp).
  2. Создаёт nonce: 16 шестнадцатеричных символов (8 случайных байт) через openssl rand.
  3. Считает HMAC-SHA256 секретом от строки {timestamp}.{nonce}.{action}.{object_id}.
  4. Отправляет POST с JSON {action, object_id, timestamp, nonce, signature} на ваш адрес.
  5. Печатает ответ и HTTP-код.

Зависимости

Только bash, curl и openssl. Работает в Linux и macOS без установки дополнительных пакетов.

Что должно получиться

Приёмник принял подпись — HTTP 200. Пример на Flask отвечает {"level":"success"}: так же ответ увидит приложение. Подпись отвергнута — HTTP 401 или 403.

Формат запроса и ответа — entrixy.com/webhook.

Защита от повтора

Скрипт всегда ставит текущее время и новый nonce. Приёмник отвергает запрос старше 5 минут, а пример на Flask ещё и запоминает nonce на эти 5 минут: тот же самый запрос второй раз не пройдёт.