@nelli_karp

Бот отправляет 2 раза сообщение, которое не нужно отправлять в данный момент + не хочет отправлять результаты в группу, Как решить эти 2 проблемы?

Суть бота в прохождении теста (ссылаа на форму, кторая определяется рандомом из массива). Человек выберает нужный тест, после прохождения нажимает кнопку "готово", после нажатия пользователю идёт текст, а в группу нужно отправить какие варианты теста были решены. бот имеет админку с фулл правами в группе, но сообщение ему не отправляются, а также после сообщении об отправке теста бот присылает пользователю 2 раза: "кто ты?" с инлайн кнопками и сообщение с точкой Вот собственно код:

import telebot
from telebot import types
import random
bot = telebot.TeleBot('токен')
@bot.message_handler(commands=['get_test'])
def test(message):
    tests_g = ['...']
    test_g = random.choice(tests_g)
    tests_k = ['...']
    test_k = random.choice(tests_k)
    markup = types.InlineKeyboardMarkup()
    markup.row(types.InlineKeyboardButton('Г', url=f'https://forms.gle/{test_g}'))
    markup.row(types.InlineKeyboardButton('К', url=f'https://forms.gle/{test_k}'))
    markup2 = types.ReplyKeyboardMarkup()
    markup2.row(types.KeyboardButton('Готово'))
    bot.send_message(message.chat.id, 'Кто ты?', reply_markup=markup)
    bot.send_message(message.chat.id, '.', reply_markup=markup2)
    bot.register_next_step_handler(message, well)
    return (test_g, test_k)
def well(message):
    bot.send_message(message.chat.id, 'Тест успешно пройден! Результаты будут известны как только мы проверим тест. Ожидайте сообщения от этого бота')
    bot.send_message(айди группы, f'@{message.from_user.username} / {message.from_user.id} отправил тест на проверку\nЕго варианты были\nhttps://forms.gle/{test(message)[0]}\nhttps://forms.gle/{test(message)[1]}')
bot.polling(none_stop=True)
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
return (test_g, test_k)
bot.send_message(айди группы, f'@{message.from_user.username} / {message.from_user.id} отправил тест на проверку\nЕго варианты были\nhttps://forms.gle/{test(message)[0]}\nhttps://forms.gle/{test(message)[1]}')


Полнейшая чушь.

Во-первых, запомни, что обработчики событий (всё, что декорировано message_handler() или подобным) не следует вызывать самостоятельно. Вот просто не следует. Их вызывает бот по мере надобности. Как следствие, возвращать из них тоже ничего не следует - бот это проигнорирует, а ты эти значения не получишь.

Во-вторых, выучи концепцию побочных эффектов при вызове функции и держи её в голове. Ты на ровном месте делаешь два вызова test(), которая имеет побочные эффекты в виде отправки сообщения, а потом удивляешься, что два раза отправляются сообщения! Причем именно что на ровном месте. Вот тебе что, грозят болтающееся отрезать за сохранение результата test() в ещё одну локальную переменную перед использованием этого результа? Конечно, это непринципиально, потому что test() вызывать нельзя (см. пункт 1), но всё равно показательно.

А что касается передачи инфы о действиях пользователя - заведи хранилище вида "id пользователя - пара ссылок". Подойдёт даже словарь, если тебе не нужно, чтобы инфа переживала перезапуск бота. И вот оттуда уже в well() вытаскивай инфу о том, что проходил текущий пользователь.

Учись программировать, потом пиши ботов. Не наоборот.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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