Python телеграмм удалить сообщения

Блог

Удалить исходящее сообщение, отправленное telegram-ботом (Telegram, python)

#python-telegram-bot #messageid

#python-telegram-bot #messageid

Вопрос:

я застрял в своем коде, поскольку не знаю, как ввести / получить message_id исходящего сообщения, пересылаемого моим ботом.

Справочная информация: это всего лишь часть моего кода, которую я впоследствии интегрирую в основной код. Здесь я тестирую функциональность пересылки сообщений их удаления. Я могу успешно переслать их, но я застрял при их удалении. я могу ввести идентификатор chat_id, но не могу сделать это для удаления message_id. Есть ли способ сделать это, особенно когда я собираюсь интегрироваться в свой основной скрипт, который может иметь несколько групп для управления. Пожалуйста, помогите новичку во мне. Спасибо!

 import logging from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove, Update from telegram.ext import ( Updater, CommandHandler, MessageHandler, Filters, ConversationHandler, CallbackContext, ) TOKEN = "PUT TOKEN HERE" #INPUT HERE # Enable logging logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) MSG, DELETE_MSG = range(2) def start(update: Update, context: CallbackContext) -> int: update.message.reply_text( 'Hi! Please post the message you would like to share:') return MSG def send(update: Update, context: CallbackContext) -> int: user = update.message.from_user logger.info("Message of %s: %s", user.first_name, update.message.text) print(update.message.message_id) send = update.message.forward(chat_id= 'PUT CHAT ID OF OUTGOING GROUP HERE') #INPUT HERE update.message.reply_text("Please delete") return DELETE_MSG def delete_msg(update: Update, context: CallbackContext) -> int: user = update.message.from_user logger.info("edit of %s: %s", user.first_name, update.message.text) update.message.delete(chat_id='PUT CHAT ID OF OUTGOING GROUP HERE', message_id='IM STUCK HERE') #INPUT HERE return ConversationHandler.END def cancel(update: Update, context: CallbackContext) -> int: user = update.message.from_user logger.info("User %s canceled the conversation.", user.first_name) update.message.reply_text('Bye! I hope we can talk again some day.', reply_markup=ReplyKeyboardRemove()) return ConversationHandler.END def main() -> None: updater = Updater(TOKEN, use_context=True) dispatcher = updater.dispatcher conv_handler = ConversationHandler( entry_points=[CommandHandler('start', start)], states=< MSG: [MessageHandler(~Filters.command, send)], DELETE_MSG: [MessageHandler(~Filters.command, delete_msg)] >, fallbacks=[CommandHandler('cancel', cancel)], ) dispatcher.add_handler(conv_handler) updater.start_polling() updater.idle() if __name__ == '__main__': main() 

Ответ №1:

update.message.reply_text(«Please delete») должна быть переменная, и тогда вы сможете context.bot.deleteMessage message_id использовать ее. Вот так:

 must_delete = update.message.reply_text("Please delete") context.bot.deleteMessage (message_id = must_delete.message_id, chat_id = update.message.chat_id) 

Попробуйте и дайте мне знать, сработало ли это для вас!!

Читайте также:  Java kafka producer acks

Комментарии:

1. Это работает как по волшебству! Это помогло мне идентифицировать исходящий message_id как запрошенный! Кроме того, я понимаю, что продолжал пытаться с помощью update.message. удалить, которое не будет работать. мне нужно использовать context.bot.deleteMessage в соответствии с вашим синтаксисом. Большое спасибо! 🙂

2. Я рад, что смог помочь!

Источник

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.

Источник

Не могу разобраться, пишу бота на 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.

Источник

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