
Сигнал для автопостинга в Телеграмм канале
14 июня 2025 г. 11:35
Я вижу, что у вас есть проект на Django с системой ведения блога. Я заметил, что в модели Post уже есть поле description, специально выделенное для сообщений в Telegram, и поле telegram_posted_at, позволяющее отслеживать, когда сообщения были опубликованы в Telegram. Давайте реализуем интеграцию с Telegram. Сначала нам нужно создать служебную функцию для обработки сообщений в Telegram. Для этого я создам новый файл:
Я вижу, что у вас есть проект на Django с системой ведения блога. Я заметил, что в модели Post уже есть поле description, специально выделенное для сообщений в Telegram, и поле telegram_posted_at, позволяющее отслеживать, когда сообщения были опубликованы в Telegram. Давайте реализуем интеграцию с Telegram.
Сначала нам нужно создать служебную функцию для обработки сообщений в Telegram. Для этого я создам новый файл:
import requests
from django.conf import settings
from datetime import datetime
def send_to_telegram(post):
"""
Send a post to Telegram channel
"""
if not settings.TELEGRAM_BOT_TOKEN or not settings.TELEGRAM_CHANNEL_ID:
return False
bot_token = settings.TELEGRAM_BOT_TOKEN
channel_id = settings.TELEGRAM_CHANNEL_ID
# Prepare message text
message = f"*{post.title}*\n\n"
if post.description:
message += f"{post.description}\n\n"
message += f"Читать далее: {post.get_absolute_url()}"
# Prepare API URL
api_url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
# Prepare data
data = {
"chat_id": channel_id,
"text": message,
"parse_mode": "Markdown"
}
try:
# Send message
response = requests.post(api_url, data=data)
response.raise_for_status()
# Update post's telegram_posted_at field
post.telegram_posted_at = datetime.now()
post.save(update_fields=['telegram_posted_at'])
return True
except Exception as e:
print(f"Error sending to Telegram: {e}")
return False
Теперь давайте изменим модель публикации, чтобы она автоматически отправляла сообщения в Telegram при их публикации:
from django.db import models
from django.contrib.auth import get_user_model
from django.urls import reverse
from taggit.managers import TaggableManager
from ckeditor.fields import RichTextField
from ckeditor_uploader.fields import RichTextUploadingField
from mptt.models import MPTTModel, TreeForeignKey
from django.db.models.signals import post_save
from django.dispatch import receiver
from .telegram_utils import send_to_telegram
// ... existing code ...
@receiver(post_save, sender=Post)
def publish_to_telegram(sender, instance, created, **kwargs):
"""
Signal handler to publish posts to Telegram when they are published
"""
if instance.status == 'published' and not instance.telegram_posted_at:
send_to_telegram(instance)
Наконец, нам нужно добавить настройки конфигурации Telegram в ваш файл настроек Django. Позвольте мне проверить ваш файл настроек:
// ... existing code ...
# Telegram settings
TELEGRAM_BOT_TOKEN = '' # Your bot token from @BotFather
TELEGRAM_CHANNEL_ID = '' # Your channel ID (e.g., @channelname or -1001234567890)
// ... existing code ...
Отлично! Я настроил интеграцию с Telegram для вашего блога. Вот что я сделал:
Создал новый файл Blog/telegram_utils.py с функцией для обработки отправки сообщений в Telegram
Добавил обработчик сигналов в Blog/models.py, который автоматически отправляет сообщения в Telegram при их публикации
Добавлены настройки конфигурации Telegram в ваш файл настроек Django
Чтобы это заработало, вам необходимо:
Создать Telegram-бота с помощью @BotFather и получить токен бота
Создайте канал Telegram и добавьте своего бота в качестве администратора
Получить идентификатор канала (это может быть либо канал пользователя с @ приставку или цифровой код)
Добавить эти значения в файл settings.py :
TELEGRAM_BOT_TOKEN = 'your_bot_token_here'
TELEGRAM_CHANNEL_ID = 'your_channel_id_here'
Теперь всякий раз, когда вы публикуете сообщение (меняете его статус на "опубликовано"), оно будет автоматически отправляться на ваш Telegram-канал. Сообщение будет содержать:
Заголовок сообщения
Описание (которое специально помечено для Telegram)
Ссылку на полное прочтение сообщения на вашем веб-сайте
Система также будет отслеживать, когда сообщения были опубликованы в Telegram, используя поле telegram_posted_at, поэтому сообщения не будут отправляться несколько раз.
Пока комментариев нет.