Удаления (очистки) сообщений Telegram
Можно ли к функционалу добавить (переделать) функцию удаления (очистки) предыдущих (полученных) сообщений от бота, чтобы эти сообщения (ответы) не накапливались (не засоряли чат).
Пример функционала
@bot.message_handler(content_types=['text'])
def main_menu(message):
.............
elif message.text == KEYBOARD['FOR_A_DATAR']:
msg = 'Для поиска ведите <b>фамилия </b> от 3 (трех) символов.'
sent = bot.send_message(message.chat.id, msg, reply_markup=kb, parse_mode='HTML')
bot.register_next_step_handler(sent, select_last_name)
def select_last_name(message):
conn = sqlite3.connect(settings.DATABASE)
cursor = conn.cursor()
sql = "SELECT last_name, first_name, third_name, phone_v, phone_g, phone_m1, phone_m2 FROM dovidnyk WHERE last_name = ?"
query = message.text
query = query.title()
cursor.execute(sql, (query,))
result = cursor.fetchall()
if not result:
msg = 'Не нашол такую <b>{}</b> фамилию.'.format(message.text)
bot.send_message(message.from_user.id, msg, reply_markup=keyboard, parse_mode='HTML')
return
else:
for ln in result:
msg = "<i>? <u>ФИО</u></i>: <b>{} {} {}</b>\n" \
"<i>? <u>Тел. внутр.</u></i>: {}\n" \
"<i>☎️ <u>Тел. город.</u></i>: {}\n" \
"<i>? <u>Тел. моб. 1</u></i>: {}\n" \
"<i>? <u>Тел. моб. 2</u></i>: {}\n".format(ln[0], ln[1], ln[2], ln[3], ln[4], ln[5], ln[6])
bot.send_message(message.from_user.id, msg, reply_markup=keyboard, parse_mode='HTML')
Ответы (2 шт):
bot.delete_message(message.chat.id,message.message_id)
Полезная команда, которая позволяет удалять сообщение которым не больше чем 24
часа. Основной функционал удаление сообщений. В вашем случае пишите в начале
bot.delete_message(message.chat.id,message.message_id - 1) и это удалит предыдущее сообщение. Способ применение очень прост, подробнее в документации
Если нужно удаление предыдущего сообщения,то можно воспользоваться :
bot.delete_message(chatid,messageid-1)
Если нужно удалить ВСЕ сообщения ,то можно попробовать записывать id сообщений ,отправляемых ботом и/или получаемых от пользователей,в массив/файл/БД. Чтобы удалять сообщения можно воспользоваться циклом:
bot = tb.TeleBot('TOKEN') #ТОКЕН
with open(file,'r') as f: #ЧТЕНИЕ ФАЙЛА И ЕГО ПРЕОБРАЗОВАНИЕ (Зависит от того,как
ids = f.read().splitlines() #записывать в файл)
for i in ids: #ПОПЫТКА УДАЛИТЬ СООБЩЕНИЕ
try:
bot.delete_message(userid,i)
except Exception as e:
print(f'Сообщение не найдено! \n{e}')
У этого способа есть минус - он спамит запросами слишком быстро,поэтому иногда(если сообщений очень много) выкидывает ошибку и просит повторить запрос через n-ное кол-во времени. Добавление time.sleep(sec) существенно замедляет работу.
Источник : api