Можно ли сделать рассылку из админки(DJANGO) в телеграм бот(на python)?

Мне нужно сделать рассылку для тех кто оформил подписку на бот, через админ панель django или другие.Бот на пайтон.Как сделать вывод текста из админ панели в телеграм бот по id чата или какую лучше админку использовать использовать?


Ответы (2 шт):

Автор решения: Андрей Дмитриевич

Надеюсь, мой способ решения этой проблемы еще актуален Допустим у нас есть функция get_mailing_user_id(), которая возвращает id тех пользователей, которым нужно сделать рассылку. Я реализовал рассылку через actionsadmin.py).

    def publish(self, request, queryset):
    """Опубликовать"""
    row_update = queryset.update(draft=True)
    bot_mailing(ids=get_mailing_user_id(queryset.filter(draft=True)[0].id),
                m_message=queryset.filter(draft=True)[0].text, image=queryset.filter(draft=True)[0].media)
    if row_update == 1:
        message_bit = "1 рассылка была опубликована"
    else:
        message_bit = f"{row_update} рассылок были опубликованы"
    self.message_user(request, f"{message_bit}")

publish.short_description = "Разослать"
publish.allowed_permissions = ('change',)

здесь bot_mailing это функция, которая принимает в себя различного рода аргументы (id пользователей, текст и фотографию)

Реализация bot_mailing:

def bot_mailing(ids, m_message, image):
bot = Bot(token = constants.TOKEN)
for i in ids:

    try:
        if image != '':
            bot.sendPhoto(i, photo=open('Path' + image.name, 'rb'),
                          caption=m_message)
        else:
            bot.sendMessage(i, m_message)
    except:
        pass

При этом у меня есть обычный хэндлер, обычные функции(start и тд) То есть код выглядит так:

from django.utils import timezone
import pytz
from django.core.management import BaseCommand
from telegram import ReplyKeyboardMarkup, Update, Bot
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
import logging

from . import constants
import ugc.models

from ...models import Users

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    level=logging.INFO)


def start(update, context):
    ...


def answer_questions(update, context: CallbackContext):
    ...


def bot_mailing(ids, m_message, image):
    bot = Bot(token = constants.TOKEN)
    for i in ids:

        try:
            if image != '':
                bot.sendPhoto(i, photo=open('Path' + image.name, 'rb'),
                              caption=m_message)
            else:
                bot.sendMessage(i, m_message)
        except:
            pass


class Command(BaseCommand):
    help = 'Телеграм бот'

    def handle(self, *args, **options):
        updater = Updater(token=constants.TOKEN, use_context=True)
        dispatcher = updater.dispatcher

        job_queue = updater.job_queue

        start_handler = CommandHandler('start', start)
        answer_handler = MessageHandler(Filters.all, answer_questions)
        dispatcher.add_handler(start_handler)
        dispatcher.add_handler(answer_handler)
        updater.start_polling(timeout=5, clean=True)
→ Ссылка
Автор решения: HOCOK COCTAB

models.py:

from aiogram import Bot
import requests
def make_compaign(text, photo, sticker):
    tgbot = Settings.objects.get(id = '1')

    for user in User.objects.all():
        #if text:
            #response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/SendMessage?chat_id={user.tg_user_id}&text={text}&parse_mode=HTML')
        if photo:
                if photo and text and sticker:
                    response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/sendPhoto?chat_id={user.tg_user_id}&caption={text}&photo={photo}')
                    response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/SendSticker?chat_id={user.tg_user_id}&sticker={sticker}')
                elif photo and text:
                    response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/sendPhoto?chat_id={user.tg_user_id}&caption={text}&={photo}')
                else:
                    response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/Sendphoto?chat_id={user.tg_user_id}&photo={photo}')
        elif not photo:
            if sticker and text:
                response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/SendSticker?chat_id={user.tg_user_id}&sticker={sticker}')
                response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/SendMessage?chat_id={user.tg_user_id}&text={text}&parse_mode=HTML')
            elif text:
                response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/SendMessage?chat_id={user.tg_user_id}&text={text}&parse_mode=HTML')
            elif sticker:
                response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/SendSticker?chat_id={user.tg_user_id}&sticker={sticker}')
       # if sticker:
            #response = requests.post(f'https://api.telegram.org/bot{tgbot.api_token}/SendSticker?chat_id={user.tg_user_id}&sticker={sticker}')

class Mailing(models.Model):
    text = models.TextField(null=True, blank=True, 
        help_text="<xmp><b>Текст</b> - полужирный\n"
                  "<i>Текст</i> - курсив\n<a href='http://example.com/url'>текст ссылки</a>\n"
                  "<del>Текст</del> - перечеркнутый\n"
                  "<u>Текст</u> - подчеркнутый\n"
                  "<code>Текст</code> - машинный текст (как будто вы пишите кодом) У текста появится выделение цветом на заднем фоне</xmp>")
    sticker = models.ImageField(verbose_name='photo de profile', upload_to='media/avatars')
    photo = models.CharField(max_length=500, verbose_name='Сылка', null=True, blank=True)
    def __str__(self):
        return self.text

    class Meta:
        verbose_name = 'Рассылка'
        verbose_name_plural = 'Рассылка'

    def save(self, *args, **kwargs):
        #if not self.pk:
            #make_compaign.apply_async((self.text,),)
        make_compaign(self.text, self.photo, self.sticker)
        super().save(*args, **kwargs)
→ Ссылка