Answer the question
In order to leave comments, you need to log in
How to implement different Telegram bot scripts in several files?
I welcome everyone!
I have files Main.py, Cicle_a.py, Cicle_b.py, in fact this is one script, but I would like to split it into several files for convenience.
Main.py has the usual Reply keyboard and click handlers:
import Config
import Cycle_a
import Cycle_b
bot = telebot.TeleBot(Config.Token_Bot)
def menu_step(message):
markup = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
markup.add('Анкета 1', 'Анкета 2')
markup.add('Обратная связь')
bot.send_message(message.chat.id, 'Выбери ниже', reply_markup=markup)
@bot.message_handler(content_types=['text'])
def menu_two_step(message):
if message.text.lower() == 'анкета 1':
null_anketa_step(message)
if message.text.lower() == 'анкета 2':
null_anketass_step(message)
if __name__=='__main__':
bot.polling(none_stop=True)
import telebot
from telebot import types
import sqlite3
#import Main.py
#from Main.py import bot #Пробовал так для обращения к боту, но циклический импорт
from Config import Group_id
bot = telebot.TeleBot(Config.Token_Bot)
user_data = {}
class User:
def __init__(self, datas):
self.datas = datas
self.datass = ''
conn = sqlite3.connect('DataBase.db', check_same_thread=False)
cursor = conn.cursor()
def db_table_val(user_id: int, dataone: str, datatwo: str):
cursor.execute('INSERT INTO datatable (user_id, dataone, datatwo) VALUES (?, ?, ?)', (user_id, dataone, datatwo))
conn.commit()
@bot.message_handler(commands=['anketaone'])
def null_anketa_step(message):
msg = bot.send_message(message.chat.id, "Введите данные №1")
bot.register_next_step_handler(msg, process_one_step)
def process_one_step(message):
try:
user_id = message.from_user.id
user_data[user_id] = User(message.text)
msg = bot.send_message(message.chat.id, 'Введите данные №2')
bot.register_next_step_handler(msg, process_two_step)
except Exception as e:
bot.send_message(message.chat.id, 'Ошибка')
def process_two_step(message):
try:
user_id = message.from_user.id
user = user_data[user_id]
user_data[user_id] = User(message.text)
db_table_val(user_id=user_id, dataone=user.datas, datatwo=user.datass)
bot.send_message(message.chat.id, 'Вы успешно ввели все данные')
except Exception as e:
bot.send_message(message.chat.id, 'Ошибка')
bot.send_message(Group_id, 'У вас новая анкета!')
if __name__=='__main__':
bot.polling(none_stop=True)
if __name__=='__main__':
bot.polling(none_stop=True)
if __name__=='__main__':
bot.polling(none_stop=True)
Answer the question
In order to leave comments, you need to log in
The problem is that you need to decorate the functions with @bot.whatever, but the other files don't know anything about the bot since it's described in the main file. So?
You need to consider how the decorator works. code like
@bot.message_handler(commands=['anketaone'])
def null_anketa_step(message):
pass
temp_wrapper = bot.message_handler(commands=['anketaone'])
def null_anketa_step(message):
pass
null_anketa_step = temp_wrapper(null_anketa_step)
def null_anketa_step(message):
pass
#какой-то другой обработчик
def some_other_handler(message):
pass
def init_bot(bot):
#а в этой функции мы регистрируем обработчики
bot.message_handler(commands=['anketaone']) (null_anketa_step)
#обрати внимание на две пары скобок. Вызов bot.message_handler() возвращает функцию (wrapper),
#и мы эту функцию тут же вызываем, передавая в неё обработчик
bot.message_handler(commands=['somethingelse']) (some_other_handler)
bot = ........ #создаём бота
from second_file import init_bot as init_second #импортируем второй файл
#функцию импортируем под другим именем, чтобы не было коллизий между файлами
init_second(bot) #вызываем функцию регистрации init_bot()
if __name__=='__main__':
bot.polling(none_stop=True)
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question