LukinterLab
LukInterLab

LukInterLab- -LukInterLab

profile-pic

Сигнал для автопостинга в Телеграмм канале

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, поэтому сообщения не будут отправляться несколько раз.

 

 

Пока комментариев нет.

Оставьте коментарий