Как удалить сообщение python

Как сделать так, чтобы бот удалял свое предпоследнее сообщение? (Aiogram, Python)?

Допустим, бот отправил в канал одно сообщение, всего в канале сейчас одно сообщение, потом бот отправляет второе сообщение, спустя время и, чтобы не засорять канал, он должен удалить предыдущее сообщение и оставить свежее!

Простой 3 комментария

from aiogram import Bot, Dispatcher, executor, types
import time

Token = «5962272909:AAEXM4bM-JmDlL0hhjUl75HMU8FQYqDssA8»
bot = Bot(token=Token)
dp = Dispatcher(bot=bot)
isDelieved = True

@dp.message_handler(commands=’test’)
async def test(message: types.message):
user_id = message.from_user.id
n = 1
a = 1
b = 0
if n == a:
await MSG2.delete()
await bot.send_message(MSG)
n = b
time.sleep(5)
if n == b:
await MSG.delete()
await bot.send_message(MSG2)

if __name__ == ‘__main__’:
executor.start_polling(dp)

from aiogram import Bot, Dispatcher, executor, types import time Token = "5962272909:AAEXM4bM-JmDlL0hhjUl75HMU8FQYqDssA8" bot = Bot(token=Token) dp = Dispatcher(bot=bot) isDelieved = True MSG = "Привет" MSG2 = "hi" @dp.message_handler(commands='test') async def test(message: types.message): user_id = message.from_user.id n = 1 a = 1 b = 0 if n == a: await MSG2.delete() await bot.send_message(MSG) n = b time.sleep(5) if n == b: await MSG.delete() await bot.send_message(MSG2) if __name__ == '__main__': executor.start_polling(dp)
from telegram.ext import Updater, CommandHandler import logging # Enable logging logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) # Your bot's token TOKEN = 'YOUR_BOT_TOKEN' # The chat id of the channel CHAT_ID = 'YOUR_CHAT_ID' # Create a TelegramBot object bot = TelegramBot(TOKEN) # Define a function that sends a message to the channel and deletes the previous message def send_message(bot, update, message): # Send the message sent_message = bot.send_message(chat_id=CHAT_ID, text=message) # Delete the previous message bot.delete_message(chat_id=CHAT_ID, message_id=sent_message.message_id - 1) # Create an Updater object updater = Updater(TOKEN) # Create a CommandHandler to handle the '/send' command send_handler = CommandHandler('send', send_message) # Add the send_handler to the dispatcher updater.dispatcher.add_handler(send_handler) # Start the bot updater.start_polling()

Войдите, чтобы написать ответ

Сложно ли создать тг бота на c++?

Источник

Читайте также:  Debugging code in java

Не могу разобраться, пишу бота на Python. Как используя метод delete_message удалить сообщение из канала?

помогите разобраться, пишу бота на Python. как используя метод delete_message удалить сообщение из канала, ранее направленное ботом. бот имеет права администратора. использую библиотеку pyTelegramBotAPI

А в чем именно проблема? Метод же простой сам по себе. Ему нужно знать id сообщения, которое собираемся удалить. Какое именно сообщение планируется удалять?

bot.delete_message(message.chat.id, my_message.message_id)

Здесь my_message — сообщение, которое хотим удалить.

Спасибо за ответ, я понимаю, что ему нужно знать id сообщения, которое было отправлено в канал, но не пойму как это отобразить в коде.
используя метод bot.delete_message(message.chat.id, my_message.message_id) выдает ошибку
NameError: name ‘my_message’ is not defined

мой код:
# удаление сообщения из канала
@bot.message_handler(commands=[‘delete_message’])
def delete_handler(message):
bot.delete_message(chat.id, my_message.message_id)

#пересылка сообщения в канал
@bot.message_handler(content_types=[‘text’])
def message_handler(message):
bot.send_message(chat.id, message.text)

AlexBel88, Ну конечно будет ошибку выдавать, в моем примере в качестве my_message нужно подставить собственно то сообщение, которое планируется удалять. Опять же повторю вопрос: какое сообщение планируется удалять?
Здесь
def delete_handler(message):
message — это сообщение, содержащее команду удаления, т.е. /delete_message
А какое собственно сообщение удалять планируете? Вы с этим определитесь сначала.

Если просто удалить предыдущее, можно подставить -1 к id в Вашем коде:

def delete_handler(message): bot.delete_message(message.chat.id, message.message_id - 1)

замысел бота такой: пользователь отправляет боту сообщение, которое перенаправляется в канал, после выполнения условий указанных в сообщении, пользователю необходимо удалить сообщение из канала через бота. Вопрос состоит в том, как написать код для удаления определенного сообщения в канале, ранее отправленного ботом, если каждое направленное сообщение от бота будет иметь свой id.
например:
@bot.message_handler(commands=[‘delete_message’])
def delete_handler(message):
bot.delete_message(-1001452590296, 315)
где: -1001452590296- id канала, а 315 — id сообщения, которое будет меняться постоянно, как мне узнавать какой будет id сообщения . как я понял в коде bot.delete_message(-1001452590296, 315), значение 315 надо как то менять, если нужно будет удалить другое сообщение.

код для удаления определенного сообщения в канале, ранее отправленного ботом, если каждое направленное сообщение от бота будет иметь свой id.

Соответственно надо хранить отправленные сообщения в БД или в более простых текстовых структурах, чтобы потом иметь возможность вытащить id.

Источник

Как удалять сообщения конкретного пользователя?

Она работает, но с минусом: чтобы бот удалил сообщения, при условии, что в истории есть сообщения от других пользователей — нужно учитывать в количестве еще и их. Как можно игнорировать сообщения от других пользователей?

SoreMix

async def remove_messages(ctx, author, count): total_messages = 0 author_messages = 0 async for message in channel.history(limit=None): total_messages += 1 if message.author == author: author_messages += 1 if author_messages == count: break await ctx.channel.purge(limit = total_messages, check = lambda message: message.author == member)

Нужно, чтобы функция чистила сообщения от указанного пользователя, а если убрать параметр — она будет чистить все.

SoreMix

SoreMix

SoreMix

soremix, Вы не понимаете, это другое))
Нужно, чтобы при вызове, функция удалила указанное количество сообщений от указанного пользователя, а не все что есть.

SoreMix

Mem1388, тогда можно перебирать все сообщения, считая общее кол-во и кол-во сообщений конкретного пользователя.

async def remove_messages(ctx, author, count): total_messages = 0 author_messages = 0 async for message in channel.history(limit=None): total_messages += 1 if message.author == author: author_messages += 1 if author_messages == count: break await ctx.channel.purge(limit = total_messages, check = lambda message: message.author == member)

Источник

Bot API v3. Автоматизируем работу в группах

⁠⁠ С момента публикации предыдущего урока и по состоянию на момент написания этого, Telegram выпустил одно крупное обновление Bot API (3.0), а также несколько мелких (3.1-3.3). Сразу отмечу, ни отправка видеосообщений, ни платежи (по ним есть отличный пример в репозитории pyTelegramBotAPI), ни работа со стикерами рассмотрены не будут.

Удаляем сообщения

Начнём с того, что научим нашего бота в группе удалять сообщения, в которых есть ссылки. Добавим бота в группу и назначим его администратором с правом удаления и блокировки (пригодится позже).

Дабы избежать неприятных ситуаций, нам необходимо определить две вещи: в какой именно группе он будет удалять сообщения и как отличить сообщения с ссылками от всех остальных? Для начала узнаем и запишем куда-нибудь ID нашей группы. А что делать с ссылками? Неужели нам придётся использовать регулярные выражения, создавая себе ещё одну проблему? Конечно, нет! Все «особые» элементы, будь то ссылки, @юзернеймы, команды ботов и т.д. складываются в массив entities в объекте Message , нам остаётся лишь проверить тип объекта и решить, удалять конкретное сообщение или нет. За последнее отвечает метод delete_message , принимающий на вход два аргумента: ID чата и ID сообщения.

Перейдём непосредственно к коду. Дабы упростить себе жизнь, зададим нужные условия срабатывания (нужный ID чата и непустой массив entities) сразу в хэндлер, это сэкономит нам несколько лишних проверок.

GROUP_ID = -10012345 # Ваш ID группы @bot.message_handler(func=lambda message: message.entities is not None and message.chat.id == GROUP_ID) def delete_links(message): for entity in message.entities: # Пройдёмся по всем entities в поисках ссылок # url - обычная ссылка, text_link - ссылка, скрытая под текстом if entity.type in ["url", "text_link"]: # Мы можем не проверять chat.id, он проверяется ещё в хэндлере bot.delete_message(message.chat.id, message.message_id) else: return 

Запустим бота и попробуем отправить сообщение с ссылкой. Если вы всё сделали правильно, оно мгновенно исчезнет и в разделе «Недавние действия» (Recent Actions) появится запись об удалённом сообщении.

Точно так же можно сделать удаление чего угодно: стикеров, репостов из неугодных каналов, матерных сообщений и т.д. Возможности (почти) безграничны!

Read-Only и прочие «мягкие» наказания

Представьте, что у вас есть группа, например, “Международный клуб любителей мяса”, в котором люди на разных языках делятся своими впечатлениями от поедания свинины, говядины, баранины и т.д.
Конечно, время от времени в чатик будут приходить вегетарианцы и высказывать недовольство, но так как мы терпеливые люди, не будем банить веганов, а просто запретим им писать сообщения некоторое время, дабы они успокоились и вели дискуссию в рамках тематики чата. Усложним себе задачу и будем оповещать пользователей о временном ограничении прав, исходя из их языковой принадлежности.

Начиная с Telegram 4.1, у администраторов групп появилась возможность точечно настраивать права и ограничения пользователей. В Bot API за операцию ограничения ответственен метод restrict_chat_member , принимающий на вход ID чата, ID юзера, список ограничений, а также параметр until_date со значением времени (Unix Time), до которого эти ограничения действуют, причём если указать время с разницей меньше 30 секунд или больше 366 дней от текущего, Telegram воспринимает это, как «навсегда». В нашем случае Read-Only режим будет выдаваться на 10 минут, т.е. 600 секунд.

Давайте теперь разберёмся, на каком языке отвечать пользователю. В объекте User есть поле language_code , содержащее языковую метку пользователя. Не всё так просто, ведь в зависимости от настроек системы и местоположения пользователя, его языковая метка может быть ru , en-GB , en-US или вообще какой-нибудь nan-Hant-TW . Подробно о строении таких меток можно прочесть здесь. В нашем случае задача немного упрощается, т.к. нам нужен только первый элемент (сам язык), независимо от региона (будем считать, к примеру, что «английский» английский и американский английский для нас одинаковы). Напишем наипростейшую определялку языка, которая будет возвращать ru для русского языка и en для всех остальных. В реальной жизни, конечно, стоит сделать поддержку большего числа языков.

def get_language(lang_code): # Иногда language_code может быть None if not lang_code: return "en" if "-" in lang_code: lang_code = lang_code.split("-")[0] if lang_code == "ru": return "ru" else: return "en" 

И подготовим небольшой JSON со строками:

strings = < "ru": < "ro_msg": "Вам запрещено отправлять сюда сообщения в течение 10 минут." >, "en": < "ro_msg": "You're not allowed to send messages here for 10 minutes." > 

Теперь напишем обработчик, который будет реагировать на набор фраз, выдавать режим Read-Only пользователю на 10 минут и уведомлять его на родном языке. Не забудьте импортировать метод time из одноимённого модуля!

restricted_messages = ["я веган", "i am vegan"] # Выдаём Read-only за определённые фразы @bot.message_handler(func=lambda message: message.text and message.text.lower() in restricted_messages and message.chat.id == GROUP_ID) def set_ro(message): bot.restrict_chat_member(message.chat.id, message.from_user.id, until_date=time()+600) bot.send_message(message.chat.id, strings.get(get_language(message.from_user.language_code)).get("ro_msg"), reply_to_message_id=message.message_id) 

Запустим бота и попросим людей с разными language_code выступить в роли противников мяса:

Заключение

В этом уроке мы кратко ознакомились с новыми фишками третьей версии Telegram Bot API, научились удалять сообщения, если они соответствуют одному из заданных критериев и научились «мягко» ограничивать пользователей, не удаляя их из группы. Помимо restrict_chat_member существует метод promote_chat_member для наделения пользователя определёнными администраторскими правами, он остаётся для самостоятельного изучения.

Исходный код бота этого урока, как обычно, расположен на Github.

Источник

Оцените статью