@Kapuzev

Делаю бота для записи домашней работы в Telegram. Использую библиотеку sqlite3. Где ошибка в коде и как исправить?

Здравствуйте!

Пишу бота для записи дз. Использую библиотеку sqlite3. При этом не особо понимаю синтаксис этой библиотеки.
Бот должен записывать текст отправленный пользователем в определённый кодом столбец. В другой части кода
он должен обращаться к последней заполненной ячейке нужного столбца и отправлять её текст пользователю
одним сообщением вида:

Пример ответа бота на запрос записанного дз

ЧЕТВЕРГ
#Геометрия: последняя запись Геометрии из БД
#Русский: последняя запись Русского из БД
#Физика: последняя запись Физики из БД
#Литература: последняя запись Литературы из БД
#География: последняя запись Географии из БД
#ОБЖ: последняя запись Обж из БД


Код

import telebot
import constants
import sqlite3
from telebot import apihelper

proxy = constants.ip+":"+constants.port
apihelper.proxy = {'https': proxy}
bot = telebot.TeleBot(constants.token1)

conn = sqlite3.connect("mydatabase.db")
cursorObj = conn.cursor()

cursorObj.execute("CREATE TABLE IF NOT EXISTS dz (Algebra text, Geom text, Rus text, Lit text, Him text, Fiz text, Nem text, Istor text, Obshh text, Geogt text, Inf text, AnglSA text, AnglTA text, Fizra text, OBZH text)")




@bot.message_handler(commands=['admin'])
def hendle_admin(message):
    user_markup = telebot.types.ReplyKeyboardMarkup(True, True)
    user_markup.row('Отмена')
    msg = bot.send_message(message.chat.id, "Введите пароль", reply_markup = user_markup)
    bot.register_next_step_handler(msg, handle_admin_password)




def handle_admin_password(message):

    if message.text == constants.password:

        bot.send_message(message.chat.id, "Пароль верен")

        user_markup = telebot.types.ReplyKeyboardMarkup(True, True)
        user_markup.row('Алгебра', 'Геометрия', 'Русский', 'Литература')
        user_markup.row('Химия', 'Физика', 'Немецкий', 'Биология')
        user_markup.row('История', 'Обществознание', 'География', 'Информатика')
        user_markup.row('АнглийскийСА', 'АнглийскийТА', 'Физкультура', 'Обж')
        user_markup.row('/start')
        msg = bot.send_message(message.chat.id, "Выберите предмет", reply_markup=user_markup)

        bot.register_next_step_handler(msg, handle_admin_dz)


    elif message.text == 'Отмена':
        user_markup = telebot.types.ReplyKeyboardMarkup(True, True)
        user_markup.row('/admin')
        user_markup.row('/start')
        bot.send_message(message.chat.id, "Вы уверенны?", reply_markup = user_markup)




def handle_admin_dz(message):
    if message.text == "Алгебра":
        cursorObj = conn.cursor()
        global algebra
        algebra = bot.send_message(message.chat.id, "Запишите дз")
        cursorObj.execute('INSERT INTO dz VALUES (?, )', (algebra, ))
        conn.commit()
    elif message.text == "Геометрия":
        Geom = bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Русский":
        Rus = bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Литература":
        Lit = bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Химия":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Физика":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Немецкий":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "История":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Обществознание":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "География":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Информатика":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "АнглийскийСА":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "АнглийскийТА":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Физкультура":
        bot.send_message(message.chat.id, "Запишите дз")
    elif message.text == "Обж":
        bot.send_message(message.chat.id, "Запишите дз")








@bot.message_handler(commands=['help', 'start'])
def hendle_start(message):

    user_markup = telebot.types.ReplyKeyboardMarkup(True, True)
    user_markup.row('Понедельник', 'Вторник', 'Среда')
    user_markup.row('Четверг', 'Пятница', 'Суббота')
    user_markup.row('/admin')
    bot.send_message(message.chat.id, "Выберите день недели", reply_markup = user_markup) #включен

    @bot.message_handler(content_types='text')
    def hendle_text(message):
        if message.text == "Понедельник":
            den = 'ПОНЕДЕЛЬНИК\n#Алгебра: ' + handle_admin_dz.algebra
#Физика:
#Обществознание:
#История:
#Информатика:'
            bot.send_message(message.chat.id, den)
        elif message.text == "Вторник":
            den = 'ВТОРНИК' \

            bot.send_message(message.chat.id, den)
        elif message.text == "Среда":
            den = 'СРЕДА'
            bot.send_message(message.chat.id, den)
        elif message.text == "Четверг":
            den = 'ЧЕТВЕРГ'
            bot.send_message(message.chat.id, den)
        elif message.text == "Пятница":
            den = 'ПЯТНИЦА'
            bot.send_message(message.chat.id, den)
        elif message.text == "Суббота":
            den = 'СУББОТА'
            bot.send_message(message.chat.id, den)




bot.polling(none_stop=True, interval=0)


Задачи бота

1. Запись домашней работы пользователями знающими пароль.

2. Доступ всем пользователям к составленному из последних записей в БД списку ДЗ на выбранный день недели.

3. Публикация составленных ДЗ в выбранный Telegram канал.



Код недописан, но суть видна.
Это мой первый бот и почти первый опыт в написании чего-либо вообще, поэтому пожалуйста не сильно кидайтесь
тапками ; )

Заранее спасибо!
  • Вопрос задан
  • 317 просмотров
Пригласить эксперта
Ответы на вопрос 1
@anerev
Ну я так понял что telebot создаёт потоки при вызове, я так думаю что всё заработает если создать новое подключение к БД в нужном потоке (В функции handle_admin_dz). А ещё этот блок с elif можно просто убрать так как при выборе любого предмета отправляется одно и то же ДЗ и заменить просто на If in DZlist:
DZlist = ['Геометрия', 'Русский' ......]
if message.text in DZlist:
    bot.send_message(message.chat.id, "Запишите дз")
else:
    pass
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы