Мастер Claude · Блок 5. Hooks

Урок 46 из 93 · ~10 мин чтения

HTTP hooks — вебхук как реакция

Урок пока закрыт

Курс проходится последовательно.

К текущему уроку

Почему это важно именно вам

Вы работаете с десятками инструментов одновременно: Telegram для оперативной связи, Google Sheets для данных, make.com или n8n для автоматизации бизнес-процессов. Claude Code тоже часть этой экосистемы — но до сих пор он работал в изоляции. Он создавал файлы, писал отчёты, анализировал данные — и всё это оставалось внутри терминала. Вы узнавали о результате только когда смотрели на экран.

HTTP hooks меняют это. Когда Claude завершает задачу, создаёт файл или вызывает инструмент — система сама посылает сигнал во внешний мир. В Telegram прилетает сообщение «отчёт готов, вот ссылка». В Google Sheets появляется новая строка с временной меткой. В make.com запускается сценарий обработки. Всё это происходит автоматически, без вашего участия, в тот момент когда нужно, а не когда вы случайно заглянули в терминал.

Для директора, который ведёт несколько проектов параллельно, это принципиальный сдвиг. Вы не должны постоянно следить за процессом — процесс сам вас найдёт в нужный момент. Это та самая разница между «я управляю задачами» и «задачи уведомляют меня».

Что это такое

Вебхук — слово, которое в IT произносят часто и объясняют редко. Давайте через простую аналогию.

Представьте курьерскую службу. Есть два варианта отслеживания посылки. Первый: вы каждый час заходите на сайт и смотрите статус. Второй: вы оставляете телефон, и вам звонят когда посылка прибыла. Вебхук — это второй вариант. Вместо того чтобы вы постоянно опрашивали систему («есть что-то новое?»), система сама вас уведомляет когда что-то произошло.

В техническом смысле: вебхук — это HTTP POST-запрос, который одна система посылает другой при наступлении события. Вы говорите Claude Code: «при таком-то событии — отправь POST-запрос на такой-то URL». Claude Code при наступлении события формирует JSON с данными и отправляет его на ваш URL. Что там находится на том конце URL — Telegram-бот, Google Apps Script, make.com сценарий — Claude не знает и не должен знать.

HTTP hook — это не новая технология

Вебхуки используются повсюду: Stripe посылает вебхук когда проходит оплата, GitHub — когда кто-то пушит код, Marquiz — когда заполняется квиз. Вы, скорее всего, уже получали вебхуки на стороне приёма. HTTP hooks в Claude Code позволяют его самому быть источником таких событий.

Тип http — один из пяти типов реакций: command (шелл-команда), http (POST на URL), mcp_tool (вызов инструмента подключённого MCP-сервера), prompt (одноходовая оценка моделью, возвращает вердикт) и экспериментальный agent (проверяющий субагент с инструментами). Тип http специально создан для интеграций: когда нужно не что-то выполнить локально, а уведомить внешний сервис.

Как работает на практике

Начнём с минимальной рабочей конфигурации. HTTP hook описывается в файле ~/.claude/settings.json или в .claude/settings.json вашего проекта. Вот структура:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "http",
            "url": "https://your-endpoint.com/webhook",
            "headers": {
              "Content-Type": "application/json",
              "Authorization": "Bearer your-token"
            },
            "timeout": 10
          }
        ]
      }
    ]
  }
}

Разберём каждый параметр:

url — адрес куда летит запрос. Это может быть ваш Telegram-бот через API, Google Apps Script, make.com webhook URL, n8n endpoint или любой другой сервис, который умеет принимать POST-запросы.

headers — HTTP-заголовки. Обычно там Content-Type: application/json (всегда нужен) и авторизация. Большинство сервисов используют Authorization: Bearer <токен> или свой собственный заголовок — например, make.com просто использует URL с секретом без отдельного заголовка.

timeout — сколько секунд ждать ответа от сервиса. По умолчанию 600 секунд, что для вебхука заведомо много: ставьте 10–15 явно. Если сервис не ответил — hook завершается с ошибкой, но Claude продолжает работу. Уменьшайте до 3-5 для Telegram (быстрый), оставляйте 10-15 для make.com (может думать дольше).

Что приходит на другой конец

Когда Claude Code отправляет вебхук, тело запроса — это JSON с данными события. Для события PostToolUse с инструментом Write это выглядит примерно так:

{
  "session_id": "abc123",
  "tool_name": "Write",
  "tool_input": {
    "file_path": "/Users/pavel/reports/analysis-2026-06-03.md",
    "content": "..."
  },
  "tool_response": {
    "success": true
  }
}

Из этого JSON вы можете вытащить tool_input.file_path чтобы знать какой файл создан, проверить tool_response.success чтобы убедиться что всё прошло успешно, и сформировать понятное уведомление.

Пример 1: Уведомление в Telegram при создании отчёта

Самый частый запрос. Claude создаёт файл отчёта — вам прилетает сообщение в Telegram.

Шаг 1. Создайте Telegram-бота через @BotFather, получите токен вида 1234567890:AAF....

Шаг 2. Узнайте ваш Telegram chat_id. Напишите боту любое сообщение, затем откройте в браузере:

https://api.telegram.org/bot<ваш_токен>/getUpdates

В ответе найдите "chat": {"id": 252679756} — это ваш chat_id.

Шаг 3. Создайте скрипт-прослойку. Дело в том, что HTTP hook посылает один запрос, но Telegram API требует конкретного формата. Проще всего использовать Google Apps Script как мост — он бесплатный и не требует сервера.

Создайте новый Apps Script (script.google.com), вставьте:

function doPost(e) {
  const data = JSON.parse(e.postData.contents);
  const filePath = data.tool_input?.file_path || "неизвестный файл";
  const fileName = filePath.split("/").pop();

  const token = "ВАШ_TELEGRAM_TOKEN";
  const chatId = "ВАШ_CHAT_ID";
  const text = `Claude создал файл: ${fileName}`;

  UrlFetchApp.fetch(
    `https://api.telegram.org/bot${token}/sendMessage`,
    {
      method: "post",
      contentType: "application/json",
      payload: JSON.stringify({ chat_id: chatId, text: text })
    }
  );

  return ContentService.createTextOutput("ok");
}

Опубликуйте как веб-приложение (Deploy → New deployment → Web app, доступ для всех). Получите URL вида https://script.google.com/macros/s/ABC.../exec.

Шаг 4. Добавьте hook в .claude/settings.json вашего рабочего проекта:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "http",
            "url": "https://script.google.com/macros/s/ABC.../exec",
            "headers": {
              "Content-Type": "application/json"
            },
            "timeout": 15
          }
        ]
      }
    ]
  }
}

Теперь каждый раз когда Claude создаёт файл — вам в Telegram прилетает уведомление с именем файла.

Пример 2: Запись в Google Sheets при завершении задачи

Событие Stop срабатывает когда Claude заканчивает работу. Полезно для ведения лога задач.

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "http",
            "url": "https://script.google.com/macros/s/XYZ.../exec",
            "headers": {
              "Content-Type": "application/json"
            },
            "timeout": 10
          }
        ]
      }
    ]
  }
}

В Apps Script для записи в Sheets:

function doPost(e) {
  const data = JSON.parse(e.postData.contents);
  const sheet = SpreadsheetApp.openById("ВАШ_ID_ТАБЛИЦЫ").getActiveSheet();

  sheet.appendRow([
    new Date(),
    data.session_id || "",
    "завершено"
  ]);

  return ContentService.createTextOutput("ok");
}

Событие Stop — без matcher

Для события Stop поле matcher не нужно — это конечное событие сессии, оно не привязано к конкретному инструменту. То же касается PreToolUse и PostToolUse без matcher — тогда hook срабатывает на любой инструмент.

Пример 3: Триггер make.com workflow

make.com (бывший Integromat) умеет принимать вебхуки нативно. В сценарии добавьте модуль «Webhooks → Custom webhook», скопируйте URL.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "http",
            "url": "https://hook.eu1.make.com/abc123def456",
            "headers": {
              "Content-Type": "application/json"
            },
            "timeout": 10
          }
        ]
      }
    ]
  }
}

Теперь каждый раз когда Claude выполняет команду в терминале — make.com сценарий запускается и может делать что угодно: создавать задачи в Jira, обновлять записи в CRM, отправлять email.

Частые ошибки

Ошибка 1: Настройка allowedHttpHookUrls

Тело запроса и заголовок Content-Type: application/json Claude Code проставляет сам — указывать их не нужно. А вот что действительно ломает HTTP-хуки — настройка allowedHttpHookUrls: если она задана на любом уровне настроек, хук пойдёт только на адреса из этого списка.

Ошибка 2: Слишком маленький timeout

Поставили "timeout": 2 и думаете что экономите время. На практике: Apps Script иногда «холодный» и первый запрос занимает 4-6 секунд. make.com при сложном сценарии — 8-12 секунд. При timeout: 2 hook будет постоянно падать с ошибкой, но Claude об этом почти не сигнализирует — просто продолжит работу. Ставьте минимум 10 секунд для внешних сервисов.

Ошибка 3: Matcher написан с ошибкой

"matcher": "write" вместо "matcher": "Write" — с маленькой буквы. Имена инструментов в Claude Code регистрозависимы: Write, Read, Bash, Edit. Если matcher не совпадает — hook просто не срабатывает, никакой ошибки вы не увидите. Проверяйте точное написание инструментов.

Ошибки в HTTP hooks молчаливы

Если вебхук не дошёл — Claude не остановится и не предупредит. Он продолжит работу как будто ничего не произошло. Это правильное поведение: задача важнее уведомления. Но это значит что вы должны сами проверять работу hooks при первоначальной настройке — отправьте тестовый запрос вручную через curl или Postman прежде чем полагаться на hook в работе.

Ошибка 4: Токены прямо в settings.json который лежит в проекте

Если ваш .claude/settings.json лежит в рабочей папке, которая синхронизируется с Яндекс.Диском или хранится в git-репозитории — любые токены в headers окажутся в облаке. Токен можно подставить прямо в заголовок из переменной окружения — для этого её имя перечисляют в allowedEnvVars:

{ "type": "http", "url": "...", "timeout": 15,
  "headers": { "Authorization": "Bearer $MY_TOKEN" },
  "allowedEnvVars": ["MY_TOKEN"] }

Без allowedEnvVars подстановка не сработает и в заголовок уйдёт пустая строка. Для личных глобальных настроек ~/.claude/settings.json риск меньше — этот файл не синхронизируется.

Когда нужно / когда нет

HTTP hook нужен, когда:

HTTP hook не нужен, когда:

HTTP hook и command hook часто работают в паре

Типичный сценарий: command hook проверяет условие и решает, нужно ли уведомлять, затем HTTP hook отправляет уведомление. Или наоборот: HTTP hook запускает внешний процесс, а command hook фиксирует результат локально. Их можно комбинировать в одном событии — несколько hooks выполняются последовательно.

Связь с другими уроками

День 41 — «Что такое hooks и как они работают»: там разобрана общая модель — события, matchers, порядок выполнения. HTTP hook — один из типов реакции внутри этой модели. Если события и matchers кажутся непонятными, стоит вернуться к дню 41.

День 45 — «command hooks»: тип command и тип http — два разных инструмента для разных задач. Command выполняет локальные скрипты, HTTP уведомляет внешние сервисы. Они не конкурируют — вы можете использовать оба для одного события. День 45 объясняет, как написать скрипт, который Claude запускает через command hook.

Дни 48–49 — «аудит и нотификации»: там собрана практика построения системы мониторинга на основе hooks — когда уведомлять, о чём, как организовать очередь уведомлений чтобы не утонуть в сообщениях. HTTP hooks из сегодняшнего урока — строительный материал для той системы.

Задание на сегодня

Настройте один рабочий HTTP hook — уведомление в Telegram когда Claude создаёт файл.

Конкретные шаги:
1. Создайте бота через @BotFather, запишите токен.
2. Узнайте ваш chat_id через getUpdates.
3. Создайте Google Apps Script с функцией doPost из примера выше, опубликуйте, скопируйте URL.
4. Добавьте hook в .claude/settings.json вашего рабочего проекта.
5. Попросите Claude: создай файл test-hook.md с текстом "проверка".

Критерий выполнено: в Telegram пришло сообщение «Claude создал файл: test-hook.md» — hook работает.

Если что-то пошло не так — проверьте Apps Script в разделе Executions, там видны все входящие запросы и ошибки.

Резюме

Следующий урок откроется после отметки.