Зачем автоматизировать постинг в 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 и создайте нового бота. Команды просты:
/newbot
— задайте имя и юзернейм.- В конце вы получите токен API — его нужно сохранить. Это ключ к вашему боту, так что не светите его напоказ! 🔒
Добавление бота в каналы
Чтобы бот мог публиковать посты, сделайте его администратором в каждом канале. Для этого:
- Перейдите в настройки канала.
- Добавьте бота через поиск по юзернейму.
- Установите галочку "Может публиковать сообщения".
Реализация скрипта: логика и код
Как это работает?
Скрипт будет запускаться каждую минуту через CRON и выполнять такие шаги:
- Искать каналы с
publish_at <= NOW()
. - Выбирать первый по очереди пост из
content
для этого канала. - Отправлять сообщение: текст или фото.
- Обновлять
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. А если статья была полезной — поделитесь ею с друзьями.