Написал бота, который должен удалять все сообщения начинающиеся с '+' через определенное время,но выдает ошибку
Ошибка: 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)
Ответы (1 шт):
Функция 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()