Можно ли сделать рассылку из админки(DJANGO) в телеграм бот(на python)?
Мне нужно сделать рассылку для тех кто оформил подписку на бот, через админ панель django или другие.Бот на пайтон.Как сделать вывод текста из админ панели в телеграм бот по id чата или какую лучше админку использовать использовать?
Ответы (2 шт):
Надеюсь, мой способ решения этой проблемы еще актуален
Допустим у нас есть функция get_mailing_user_id(), которая возвращает id тех пользователей, которым нужно сделать рассылку.
Я реализовал рассылку через actions (в admin.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)
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)