Написал бота, который должен удалять все сообщения начинающиеся с '+' через определенное время,но выдает ошибку

Рейтинг: 0Ответов: 1Опубликовано: 24.01.2023

Ошибка: telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: message identifier is not specified После первого цикла он удаляет все сообщения,не записывает новые и выдает ошибку

import datetime
import telebot
import sqlite3
import schedule
import time


token='<TOKEN>'
bot=telebot.TeleBot(token,parse_mode='MARKDOWN')
timeformat="%Y-%m-%d"
now = datetime.datetime.now()
now=f'{now:{timeformat}}'
db= sqlite3.connect('server.db',check_same_thread=False)
sql = db.cursor()
sql.execute("""CREATE TABLE IF NOT EXISTS users(
   messageid BIGINT,
   date TEXT,
   message TEXT);
""")
db.commit()

@bot.message_handler(content_types=['text'])
def chatting(message):
    a=list(message.text)
    if a[0]=='+':
        sql.execute(f"INSERT INTO users 
VALUES('{message.message_id}','{now}','{message.text}');")
        db.commit()

def job():
    sql.execute("SELECT messageid FROM users")
    b = sql.fetchall()
    for i in range(len(b)):
        bot.delete_message(chat_id='-1001615667874',message_id=b[i])
        sql.execute("UPDATE users SET messageid = NULL")
        db.commit()


schedule.every(10).seconds.do(job)

bot.polling()

while True:
    schedule.run_pending()
    time.sleep(1)

Ответы

▲ 0Принят

Функция fetchall возвращает список из кортежей. Каждый кортеж хранит запрашиваемые из SELECT значения

Если у вас в users в messageid будут 4 строки с значениями 1, 2, 3, 4, то fetchall вернет [(1,), (2,), (3,), (4,)]

При получении значений из fetchall по индексам b[i] вы получите кортежи т.е. (1,) и т.п.

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

Пример:

    sql.execute("SELECT messageid FROM users")
    for row in sql.fetchall():
        bot.delete_message(chat_id='-1001615667874', message_id=row[0])

Можно сразу в цикле сделать распаковку в переменные:

    for message_id, in sql.fetchall():
        bot.delete_message(chat_id='-1001615667874', message_id=message_id)

Поместите запуск задачи в отдельный поток и до bot.polling():

from threading import Thread
...


def do_schedule():
    while True:
        schedule.run_pending()
        time.sleep(1)

Thread(target=do_schedule).start()

bot.polling()