import telebot
from telebot import types
from docxtpl import DocxTemplate
from docx import Document
import tempfile
import os
from datetime import datetime
Token = '6916931629:AAG0EB9xsAgJ5RLS_S3BErGwIhGQnr3pWJQ'
bot = telebot.TeleBot(Token)
previous_messages = {}
messages = []
user_data = {}
question_stack = {} # Стек вопросов и ответов
# Вопросы для каждой переменной
questions = {
'Name_student': 'ФИО с инициалами',
'student_gender': 'Вы студент или студентка?',
'student_group': 'Ваша группа:',
'student_gender_type': 'отсутствовал' if 'студент' in 'Вы студент или студентка?' else 'отсутствовала',
'date_lesson': 'Дата занятия',
'prichina': 'Причина отсутствия(желательно)',
'Date_create': datetime.now().strftime('%d %B %Y')
}
def fill_document(template_path, data):
doc = Document(template_path)
for key, value in data.items():
# Replace placeholders in the document with data
for paragraph in doc.paragraphs:
if f'{{{key}}}' in paragraph.text:
paragraph.text = paragraph.text.replace(f'{{{key}}}', str(value))
print(paragraph.text)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
if f'{{{key}}}' in cell.text:
cell.text = cell.text.replace(f'{{{key}}}', str(value))
return doc
def send_document(chat_id, doc):
with tempfile.NamedTemporaryFile(delete=False, suffix=".docx") as temp_file:
temp_file_name = temp_file.name
doc.save(temp_file_name)
temp_file.close()
with open(temp_file_name, 'rb') as file:
# Assume 'bot' is defined elsewhere in your code
bot.send_document(chat_id, file)
os.unlink(temp_file_name) # Delete the temporary file after sending
def ask_next_question(message, user_id):
variables = list(questions.keys())
if user_id not in user_data:
user_data[user_id] = {}
current_index = len(user_data[user_id])
variables_excluded = [var for var in variables if var not in ['student_gender_type', 'Date_create']]
if current_index < len(variables_excluded):
next_variable = variables_excluded[current_index]
question_text = questions[next_variable]
bot.send_message(message.chat.id, question_text)
# Save the question and answer in the stack
question_stack[user_id] = {'variable': next_variable, 'question_text': question_text}
previous_messages[message.chat.id] = [message.message_id]
bot.register_next_step_handler(message, process_answer)
else:
generate_and_send_document(message, user_id)
def process_answer(message):
user_id = message.from_user.id
variable = question_stack[user_id]['variable']
answer = message.text
# If the variable is 'Date_create', format the date with digits only
if variable == 'Date_create':
answer = datetime.now().strftime('%d%m%Y')
user_data[user_id][variable] = answer
# Remove the question from the stack
question_stack.pop(user_id, None)
ask_next_question(message, user_id)
def generate_and_send_document(message, user_id):
template_path = 'PHOTOS/College/Обьяснительная.docx'
if user_id in user_data:
document_data = user_data[user_id]
filled_document = fill_document(template_path, document_data)
send_document(message.chat.id, filled_document)
del user_data[user_id]
def send_start_message(message):
markup = types.InlineKeyboardMarkup(row_width=2)
item1 = types.InlineKeyboardButton("Гос.услуги", callback_data='goverments')
item2 = types.InlineKeyboardButton("Колледж", callback_data='college')
item3 = types.InlineKeyboardButton("Судебное", callback_data='courts')
item4 = types.InlineKeyboardButton("Нотариус", callback_data='notarius')
markup.add(item1, item2, item3, item4)
sent_message = bot.send_message(message.chat.id, "Выберите образец который хотите получить", reply_markup=markup)
# Сохраняем только текущее сообщение пользователя в списке
previous_messages[message.chat.id] = [sent_message.message_id]
@bot.message_handler(commands=['start'])
def start_message(message):
# Отправляем информацию о студенте
student_info = "Данный бот является курсовым проектом студента группы
bot.send_message(message.chat.id, student_info)
# Отправляем ссылки на инстаграм и вк
instagram_link = "https://www.instagram.com/"
vk_link = "https://vk.com"
social_media_info = f"Инстаграм: {instagram_link}\nВКонтакте: {vk_link}"
bot.send_message(message.chat.id, social_media_info)
# Просим пользователя написать слово "Документы" для начала работы
bot.send_message(message.chat.id, "Для начала работы бота напишите слово 'Документы'")
@bot.message_handler(func=lambda message: message.text.lower() == 'документы' or message.text.lower() == '/start')
def handle_start_message(message):
send_start_message(message)
@bot.callback_query_handler(func=lambda call: True)
def handle_callback_query(call):
user_id = call.from_user.id
if call.message.chat.id in previous_messages:
for msg_id in previous_messages[call.message.chat.id]:
bot.delete_message(call.message.chat.id, msg_id)
previous_messages[call.message.chat.id] = [] # Очищаем список
if call.data == 'college_button1':
bot.send_message(call.message.chat.id, "Начнем опрос. Ответьте на следующие вопросы:")
user_data[user_id] = {}
ask_next_question(call.message, user_id)
elif call.data == 'college_back_button':
send_start_message(call.message)
# ... (остальной ваш код)
if call.data == 'goverments':
markup1 = types.InlineKeyboardMarkup(row_width=2)
item1_1 = types.InlineKeyboardButton("Гос.услуги 1", callback_data='goverments_buttion1')
item1_2 = types.InlineKeyboardButton("Гос.услуги 2", callback_data='goverments_buttion2')
item1_3 = types.InlineKeyboardButton("Гос.услуги 3", callback_data='goverments_buttion3')
item1_4 = types.InlineKeyboardButton("Назад", callback_data='goverments_back_button')
markup1.add(item1_1, item1_2, item1_3, item1_4)
sent_message = bot.send_message(chat_id=call.message.chat.id, text="Выберите документ", reply_markup=markup1)
# Сохраняем только текущее сообщение пользователя в списке
previous_messages[call.message.chat.id] = [sent_message.message_id]
elif call.data == 'goverments_back_button':
send_start_message(call.message)
if call.data == 'college':
markup1 = types.InlineKeyboardMarkup(row_width=2)
item2_1 = types.InlineKeyboardButton("Обьяснительная", callback_data='college_button1')
item2_2 = types.InlineKeyboardButton("Заявления", callback_data='college_button2')
item2_3 = types.InlineKeyboardButton("Просьба", callback_data='college_button3')
item2_4 = types.InlineKeyboardButton("Назад", callback_data='college_back_button')
markup1.add(item2_1, item2_2, item2_3, item2_4)
sent_message = bot.send_message(chat_id=call.message.chat.id, text="Выберите документ", reply_markup=markup1)
previous_messages[call.message.chat.id] = [sent_message.message_id]
elif call.data == 'college_back_button':
send_start_message(call.message)
if call.data == 'courts':
markup1 = types.InlineKeyboardMarkup(row_width=2)
item3_1 = types.InlineKeyboardButton("Признание гражданина недееспособным", callback_data='courts_button1')
item3_2 = types.InlineKeyboardButton("О возмещение ущерба дтп", callback_data='courts_button2')
item3_3 = types.InlineKeyboardButton("Об установление факта смерти", callback_data='courts_button3')
item3_4 = types.InlineKeyboardButton("Назад", callback_data='courts_back_button')
markup1.add(item3_1, item3_2, item3_3, item3_4)
sent_message = bot.send_message(chat_id=call.message.chat.id, text="Выберите документ", reply_markup=markup1)
# Сохраняем только текущее сообщение пользователя в списке
previous_messages[call.message.chat.id] = [sent_message.message_id]
elif call.data == 'courts_back_button ':
send_start_message(call.message)
if call.data == 'notarius':
markup1 = types.InlineKeyboardMarkup(row_width=2)
item4_1 = types.InlineKeyboardButton("Нотариальные документы 1", callback_data='notarius_button1')
item4_2 = types.InlineKeyboardButton("Нотариальные документы 2", callback_data='notarius_button2')
item4_3 = types.InlineKeyboardButton("Нотариальные документы 3", callback_data='notarius_button3')
item4_4 = types.InlineKeyboardButton("Назад", callback_data='notarius_back_button')
markup1.add(item4_1, item4_2, item4_3, item4_4)
sent_message = bot.send_message(chat_id=call.message.chat.id, text="Выберите документ", reply_markup=markup1)
# Сохраняем только текущее сообщение пользователя в списке
previous_messages[call.message.chat.id] = [sent_message.message_id]
# Эта строка запускает бота и начинает прослушивание сообщений
bot.polling(none_stop=True, timeout=123)
Document:
Я { student_gender } группы { student_group } { Name_student } , { student_gender_type } на занятие { date_lesson } , { prichina }.
{Date_create}
__________________
How can I fix them? Values doesn't insert in document. Now the ask a variables for insert, saving them values, but doesn't insert them in document sample. The created document remains the same as the template without changes.