@RaymanPy

Как делать цепочки диалогов в Telegram Bot?

Использую pyTelegramBot и не мне нужно сделать цекпочки диалогов.
Я нашел один способ , но при его использовании выходит ошибка :

2019-01-13 19:29:22,752 (util.py:64 WorkerThread2) ERROR - TeleBot: "TypeError occurred, args=("'NoneType' object is not callable",)
Traceback (most recent call last):
  File "C:\Users\Rizvan\Desktop\Telegram Bot\venvbot\lib\site-packages\telebot\util.py", line 58, in run
    task(*args, **kwargs)
TypeError: 'NoneType' object is not callable
"
Traceback (most recent call last):
  File "C:\Users\Rizvan\Desktop\Telegram Bot\bot.py", line 93, in <module>
    bot.polling(none_stop=True)
  File "C:\Users\Rizvan\Desktop\Telegram Bot\venvbot\lib\site-packages\telebot\__init__.py", line 264, in polling
    self.__threaded_polling(none_stop, interval, timeout)
  File "C:\Users\Rizvan\Desktop\Telegram Bot\venvbot\lib\site-packages\telebot\__init__.py", line 288, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\Rizvan\Desktop\Telegram Bot\venvbot\lib\site-packages\telebot\util.py", line 107, in raise_exceptions
    six.reraise(self.exc_info[0], self.exc_info[1], self.exc_info[2])
  File "C:\Users\Rizvan\Desktop\Telegram Bot\venvbot\lib\site-packages\six.py", line 693, in reraise
    raise value
  File "C:\Users\Rizvan\Desktop\Telegram Bot\venvbot\lib\site-packages\telebot\util.py", line 58, in run
    task(*args, **kwargs)
TypeError: 'NoneType' object is not callable
[Finished in 11.6s]


Так же ошибка выходит при использовании условий .
Которые я использую для валидации.

Вот мой (говно-) код

Ошибка указывет на строку bot.polling(none_stop=True)
bot.py
import telebot
from telebot import types
import json
from models import *

token = 'мой токен'
bot = telebot.TeleBot(token)


@bot.message_handler(commands=['start'])
def start(message):
	 
	markup = types.ReplyKeyboardMarkup(one_time_keyboard=True)
	markup.row('Сформировать заказ')
	
	
	msg = bot.send_message(message.chat.id,'Выберите вариант',reply_markup=markup)
	bot.register_next_step_handler(msg, user_enter)

@bot.message_handler(regexp='сформировать заказ')
def user_enter(message):
	if message.text.lower() == 'сформировать заказ':
		catalog = session.query(Catalog).all()
		markup = types.ReplyKeyboardMarkup()
		for product in catalog:
			markup.row(product.name)
		msg = bot.send_message(message.chat.id,'Выберите товар', reply_markup=markup)
		bot.register_next_step_handler(msg, user_choice)



def user_choice(message):
	catalog = session.query(Catalog).all()
	markup = types.ReplyKeyboardMarkup()

	for product in catalog:
		if product.name == message.text :
	
			msg = bot.send_message(message.chat.id, 'Введите количество')
			
			bot.register_next_step_handler(msg,product_count(message=message,product=product))


def product_count(message, product):
	
	count = message.text

	msg = bot.send_message(message.chat.id, 'Товар добавлен в корзину , вы можете продолжить покупки или сделать заказ')
	bot.register_next_step_handler(msg, add_to_basket(message,product,count))



def add_to_basket(message,product,count):
	prod = Basket(message.from_user.id)
	prod.prods.append(product)
	session.add(prod)
	session.commit()
	user_enter(message)

if __name__ == '__main__':
	bot.polling(none_stop=True)

После ввода количества товара выходит та же ошибка
  • Вопрос задан
  • 309 просмотров
Решения вопроса 1
@Stormx480
Сразу скину ссылку на свою заготовку для моих ботов, там ответ есть но я поясню еще ниже Github

Если ты внимательно следил за событиями прошлого года, то наверное знаешь что Роскомнадзор заблокировал телегу на территории РФ, поэтому для того что бы использовать соединение Long Polling (прим. - это соединение ты вызываешь при обращении к функции bot.polling()) тебе надо импортировать модуль apihelper и сделать соединение через прокси сервер (я использовал метод с SOCKS проксями, их бесплатно можно найти в самой телеге, там есть боты которые выдают, погугли.) и тогда все будет работать. Сейчас бот просто не может подключится к серверу телеграмм из за чего и выскакивает ошибка.
Сам код для apihelper:
spoiler
from telebot import apihelper

apihelper.proxy = {'http':'http://10.10.1.10:3128'}
#или вариант с socks5
apihelper.proxy = {'https':'socks5://userproxy:password@proxy_address:port'}


И рекомендую выносить клавиатуры и повторяющиеся блоки кода в отдельные файлы и импортировать их куда надо, это сделает сам код читабельнее и чище, а разработку удобнее.
А вообще глянь мой гитхаб там вроде бы неплохой пример бота, тебе чуть времени сэкономит.
Удачи в разработке)

Пы.Сы. - Офф. гитхаб библиотеки там был ответ на твой вопрос в разделе Proxy. Почитай документацию перед разработкой, це полезно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы