Как сделать бота для автоматического постинга в Telegram на PHP

Хотите упростить управление несколькими Telegram-каналами? В этом уроке вы узнаете, как создать бота на PHP, который будет автоматически публиковать посты в нужное время — без сторонних сервисов и с полным контролем за процессом.

Как сделать бота для автоматического постинга в Telegram на PHP

Зачем автоматизировать постинг в Telegram?

Представьте: у вас пять каналов, каждый день десятки постов, а еще надо успеть позавтракать и не забыть про кофе. 😅 Управление несколькими Telegram-каналами быстро превращается в головную боль, особенно если контент-план уже вырос до размеров романа. Отложенные посты в Телеграм — неплохое решение, но когда задачи умножаются, хочется чего-то большего.

В этой статье мы создадим простой бот на PHP, который будет автоматически публиковать посты в ваших каналах. Почему PHP? Потому что он стабильный, гибкий и отлично подходит для таких задач. К тому же, вы сможете контролировать процесс, не завися от сторонних сервисов. Готовы? Тогда поехали!


Подготовка к работе: инструменты и настройки

Необходимые инструменты

Для начала убедитесь, что у вас установлены:

  • PHP 7.4+ (можно проверить командой php -v),
  • MySQL/MariaDB (для хранения данных),
  • Composer (если будете использовать сторонние библиотеки, но в нашем случае он не обязателен).

Если чего-то нет — не переживайте, в интернете полно гайдов по установке. Главное — не бояться экспериментировать. 😉

Получение ID каналов

Первый шаг — собрать ID всех ваших каналов. Для этого воспользуемся ботом @getMyID_tgbot. Просто отправьте ему сообщение /start, а затем — ID канала, который хотите проверить. Бот вернет его уникальный идентификатор.

Сохраните эти данные в таблице channels с такими полями:

CREATE TABLE channels (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tg_id VARCHAR(255) NOT NULL,
    name VARCHAR(255),
    publish_at DATETIME
);

Настройка базы данных

Теперь создадим таблицу content для хранения постов:

CREATE TABLE content (
    id INT AUTO_INCREMENT PRIMARY KEY,
    channel_id INT,
    text TEXT,
    image VARCHAR(255),
    publish_cnt INT DEFAULT 0,
    FOREIGN KEY (channel_id) REFERENCES channels(id)
);

Здесь publish_cnt — счетчик публикаций. Он поможет нам отслеживать, какие посты уже вышли.


Создание Telegram-бота: от регистрации до администратора

Регистрация через BotFather

Откройте Telegram, найдите @BotFather и создайте нового бота. Команды просты:

  1. /newbot — задайте имя и юзернейм.
  2. В конце вы получите токен API — его нужно сохранить. Это ключ к вашему боту, так что не светите его напоказ! 🔒

Добавление бота в каналы

Чтобы бот мог публиковать посты, сделайте его администратором в каждом канале. Для этого:

  1. Перейдите в настройки канала.
  2. Добавьте бота через поиск по юзернейму.
  3. Установите галочку "Может публиковать сообщения".

Реализация скрипта: логика и код

Как это работает?

Скрипт будет запускаться каждую минуту через CRON и выполнять такие шаги:

  1. Искать каналы с publish_at <= NOW().
  2. Выбирать первый по очереди пост из content для этого канала.
  3. Отправлять сообщение: текст или фото.
  4. Обновлять publish_at на случайное время впереди и увеличивать publish_cnt.

Пример кода на PHP

query("SELECT * FROM channels WHERE publish_at <= NOW()");
$channels = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($channels as $channel) {
    // Выбираем первый пост для канала
    $stmt = $pdo->prepare("SELECT * FROM content WHERE channel_id = ? ORDER BY publish_cnt ASC LIMIT 1");
    $stmt->execute([$channel['id']]);
    $post = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$post) continue;

    $token = 'ВАШ_ТОКЕН';
    $chatId = $channel['tg_id'];
    $text = $post['text'];
    $imageUrl = $post['image'];

    // Отправка сообщения
    if ($imageUrl) {
        $url = "https://api.telegram.org/bot$token/sendPhoto";
        $postData = [
            'chat_id' => $chatId,
            'photo' => $imageUrl,
            'caption' => $text
        ];
    } else {
        $url = "https://api.telegram.org/bot$token/sendMessage";
        $postData = [
            'chat_id' => $chatId,
            'text' => $text
        ];
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    // Обновляем дату и счетчик
    $randomMinutes = rand(180, 240);
    $pdo->prepare("UPDATE channels SET publish_at = NOW() + INTERVAL ? MINUTE WHERE id = ?")
        ->execute([$randomMinutes, $channel['id']]);
    $pdo->prepare("UPDATE content SET publish_cnt = publish_cnt + 1 WHERE id = ?")
        ->execute([$post['id']]);
}
?>

Обработка ошибок

Telegram может вернуть ошибку, если текст слишком длинный или изображение недоступно. Добавьте проверки:

if (strlen($text) > 1024) {
    // Логируем ошибку или отправляем уведомление
    file_put_contents('error.log', "Сообщение слишком длинное: $text\n", FILE_APPEND);
    continue;
}

Настройка CRON: автоматизация без лишних усилий

Откройте терминал и введите crontab -e. Добавьте строку:

* * * * * /usr/bin/php /путь/к/вашему/скрипту.php

Это запустит скрипт каждую минуту. Проверьте, работает ли он: попробуйте вручную выполнить php script.php.


Расширяем функционал: улучшения для продвинутых

Проверка ограничений Telegram

Telegram строг к длинам текста и размерам изображений. Добавьте валидацию:

if ($imageUrl && getimagesize($imageUrl)[0] > 10 * 1024 * 1024) {
    // Изображение больше 10 МБ — пропускаем
    continue;
}

Уведомления об ошибках

Если сообщение не отправилось, отправьте уведомление администратору:

if (!$response) {
    $adminChatId = 'ВАШ_ID';
    $url = "https://api.telegram.org/bot$token/sendMessage";
    $postData = ['chat_id' => $adminChatId, 'text' => "Ошибка публикации в канале $chatId"];
    // Вызов curl, как выше
}

Гибкость расписания

Вместо случайного времени можно задать для каждого канала свой интервал:

ALTER TABLE channels ADD COLUMN interval_minutes INT DEFAULT 180;

И обновляйте publish_at так:

$stmt = $pdo->prepare("UPDATE channels SET publish_at = NOW() + INTERVAL interval_minutes MINUTE WHERE id = ?");

Заключение: дальше — больше!

Мы создали базовый, но рабочий бот для автоматического постинга. Это только начало! Вот что можно добавить:

  • Веб-интерфейс для управления постами.
  • Интеграцию с CMS, чтобы тянуть контент напрямую.
  • Логирование в файл или Telegram-чат для мониторинга.

Если у вас остались вопросы — задавайте в комментариях или в нашем чате @botphp_ru. А если статья была полезной — поделитесь ею с друзьями.

Комментарии