-1

I am writing my first bot. The problem occurs right after send_to_club() function sends "hello". I tried to instead use a message handler with a lambda function but it didn't help either. Can you please help me find the mistake?

import telebot
from telebot import types
from scraper import get_clubs_from_search
import state


bot = telebot.TeleBot('###')


@bot.message_handler(commands=['start'])
def start(message):
    msg = f"""Hello, <b>{message.from_user.first_name}</b> \n/help for commands list \n/search for search options"""

    bot.send_message(message.chat.id, msg, parse_mode='html')


@bot.message_handler(commands=['help'])
def help(message):
    msg = f"""You can use the following commands: \n/search to search for a team or a player"""

    bot.send_message(message.chat.id, msg, parse_mode='html')

@bot.message_handler(commands=['search'])
def search(message):
    markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
    player_search = types.KeyboardButton("Search for a player")
    team_search = types.KeyboardButton("Search for a team")

    markup.add(player_search, team_search)

    bot.send_message(message.chat.id, 'Choose an option:', reply_markup=markup)


@bot.message_handler(func = lambda message: message.text in ['Search for a player','Search for a team'])
def team_search(message):
    if message.text == 'Search for a team':
        msg = bot.send_message(message.chat.id, "Type the name of the team", reply_markup=types.ForceReply(selective=False))
        bot.register_next_step_handler(msg, get_search_url)


def get_search_url(message):
    """Taking user request and forming a search url. then calling get_clubs_from_search """
    search_request = message.text.split()
    final_query = ""
    for i in range(len(search_request)):
        if i != (len(search_request)-1):
            final_query += f"{search_request[i]}+"
        else:
            final_query += f"{search_request[i]}"
    
    url = f"https://www.transfermarkt.com/schnellsuche/ergebnis/schnellsuche?query={final_query}"

    data = get_clubs_from_search(url)

    bot.register_next_step_handler(message, return_search(message, data))
    


def return_search(message, data):
    """Presenting dataframe to user and asking to choose a team"""

    msg = "Please choose the team:\n\n"
    markup = types.ReplyKeyboardMarkup(True)

    for i in range(len(data)):
        msg += f"""{i+1}. {data.loc[i]['club_names']} from {data.loc[i]['country_names']}\n"""
        markup.add(types.KeyboardButton(i+1))

    final_message = bot.send_message(message.chat.id, msg, reply_markup=markup)
    bot.register_next_step_handler(final_message, send_to_club_page, data)

This is where the problem occurs. Both this method and using a message_handler lead to the same error and break the bot. It seems no different to the way I registered message handlers above, and those work just fine

def send_to_club_page(message, data):
  
    msg = "hello"
    bot.send_message(message.chat.id, msg, parse_mode='html')


while True:
    bot.polling(none_stop=True, timeout=5)
  • Please show in which line your code exits with the full error. – Confused Learner Sep 06 '22 at 18:25
  • 2
    The final line of `get_search_url` is wrong. You are not passing the function object, you are CALLING the function and passing its return value, which is `None`. You need `bot.register_next_step_handler(message, return_search, data)`. – Tim Roberts Sep 06 '22 at 18:28
  • always put FULL error message (starting at word "Traceback") in question (not in comments) as text (not screenshot, not link to external portal). There are other useful information in the full error/traceback. – furas Sep 06 '22 at 23:31

1 Answers1

0

Ok. So the correct answer was given to me by Tim Roberts in the comments. The problem was with me not passing the function object and instead calling it. The NoneType object is the return of the function return_search. I was supposed to pass the function object like this: bot.register_next_step_handler(message, return_search, data)

Thank you very much for your criticism about the error message too. I will make sure to post more well-thought questions in the future