Вебхук вже запущено, бот відповідає, і надходять запити. Але раз на тиждень потрібно підняти новий сервер, перейти на інший домен, перевірити, що бот взагалі живий, і видалити журнал оновлень, який виріс на десятки мегабайт. Go to the browser к api.telegram.org заради кожної дрібниці — шляху до помилок. Простіше зібрати одну консольну команду Yii2 і закрити ці завдання з терміналу.
Що повинна вміти сервісна команда
Мінімальний набір для виробництва:
- webhook:set — встановити вебхук з
secret_tokenі список оновлень. - webhook:delete — зніміть вебхук (наприклад, перед розгортанням або перенесенням).
- Me — перевірка стану здоров 'я через
getMe: повернути ім 'я користувача, can_join_groups, is_bot. - журнали:обертання — ротація файлу з вихідними оновленнями за розміром/датою.
Створіть одну команду з підкомандами за допомогою Консоль::parseArg зручніше чотирьох окремих контролерів: одна точка входу, загальний помічник для запитів API ботів.
Підготовка команди та помічника для запитів
Команда успадковується від yii\console\controller. Беремо токен з параметра params.php від кулі getenv('TG_BOT_TOKEN') — його не повинно бути в кодексі. Всі запити до Telegram — через cURL, з перевіркою HTTP-коду, json_last_error та поля Гаразд.
Помічник bot() Повертає: result і аварійно завершує сам процес з ненульовим кодом для будь-якої мережі або логічної проблеми. Для сценаріїв технічного обслуговування це правильна поведінка: сповіщення cron будуть спрацьовувати за допомогою вихідного коду.
Встановлення та зняття вебхука
При setWebhook обов 'язково передайте secret_token (випадковий рядок 16–64 символи bin2hex(random_bytes(16))) — Telegram надішле його в шапці X-Telegram-Bot-Api-Secret-Token, і ваш контролер зможе відкинути сміттєвий ДОПИС. Список allowed_updates обмежує типи оновлень: менше шуму — менше навантаження та коротший журнал.
Типовий рейк: URL-адреса повинна відповідати 200 на ДОПИС ІЗ порожній тіла ще до того, як контролер Yii2 зробить що-небудь. В іншому випадку Telegram на першому setWebhook записуватиме last_error_message: HTTPClientError і забиватиметься. Переконайтеся, що у вас немає фільтра CSRF перед маршрутизацією, і запит не аналізує JSON як форму.
Перевірка здоров 'я через getMe
Найпростіший життєвий пінг: якщо getMe не відповіли протягом 2 секунд — бот недоступний. Ви можете витягувати з cron кожні 5 хвилин і надсилати сповіщення на окремий канал, якщо вихідний код не дорівнює нулю.
Поле can_join_groups важливо відразу перевірити: якщо ви плануєте додати бота в групові чати для підтримки, а він вимкнений, оновлення з груп просто не прийдуть. Бот за замовчуванням створюється приватним.
Ротація журналів оновлень
Корисно складати необроблені оновлення JSON у файл на час налагодження та інцидентів, але без обертання він з 'їсть диск. Проста стратегія: при перевищенні розміру (наприклад, 20 МБ) перейменувати на updates-YYYY-MM-DD.jsonl і запустіть новий, збережіть останні 7 файлів.
Запис у tg-updates.jsonl робить ваш контролер веб-перехоплювача одним рядком: file_put_contents($file, json_encode($update) . "\n", FILE_APPEND | lock_EX)На SSD розміром 20 МБ є тисячі оновлень — для виробництва достатньо 2–3 годин активного листування.
Підключення та запуск
В console.php контролер автоматично забиратиме з app\commandsПеревіряємо.
У cron є два завдання: перевірка здоров 'я кожні 5 хвилин, ротація кожну годину. Перед розгортанням на новому сервері — tg/webhook-delete по старому і tg/webhook-set на нову, інакше Telegram дасть last_error_message: У з 'єднанні відмовлено і збережіть Pending_Updates.
Важливо пам'ятати...
- Токен — лише в
env/"params": {, а не в сховищі. - Завжди перевіряйте HTTP-код і
ok:false— Telegram повертає 200, навіть якщо є логічна помилка. setWebhookз новимsecret_tokenвимагає оновлення та перевірки в контролері, інакше Telegram не зможе звернутися після першого невідповідного підпису.- Перед розгортанням нового коду —
deleteWebhookабоsetWebhookзdrop_pending_updates:trueщоб не згребати хвіст після простою.
Команда займає близько 80 рядків, але закриває всі рутинні операції, для яких розробник зазвичай сканує браузер або пише спеціальні скрипти. Після цього бот обслуговується з терміналу так само, як база даних або черга.
Якщо у вас є кілька ботів на одному сервері, витягніть маркер та URL-адресу до масивуparams['telegram']['bots']і прийняти назву бота з аргументомactionIndex($bot = 'main'), тоді одна команда охопить весь зоопарк.
Ви можете заощадити час на типових операціях з API Telegram Bot — webhook, getMe, log rotation — без власного коду: у BotCreator ці сценарії вже зібрані в готові модулі.