Python Telegram-бот ConversationHandler не работает с webhook
- Post author: admin
- Запись опубликована: 10 января, 2022
- Post category: Вопросы по программированию
#telegram-bot #python-telegram-bot #telegram-webhook
Вопрос:
Я хочу создать обработчик разговоров в своем боте, который использует веб-крючок, обработчик разговоров запускает функцию только в точке входа, после этого он не запускает функцию состояния и не запускает резервную функцию. Этот обработчик команд работает нормально, когда бот запускается путем опроса.
conv_handler = ConversationHandler( entry_points=[CommandHandler(«start», start)], states=< NEW_PROJECT: [CallbackQueryHandler(project_name)], PROJECT_NAME: [MessageHandler(Filters.regex(«.*»), store_name_maybe_project_type)], PROJECT_TYPE: [CallbackQueryHandler(store_type_maybe_admin)] >, fallbacks=[CommandHandler(‘cancel’, cancel)], )
Все необходимые функции:
def start(update, context): # Gives button of add project # We can use for loop to display buttons keyboard = [ [InlineKeyboardButton(«Add Project», callback_data=»add_project»)], ] reply_markup = InlineKeyboardMarkup(keyboard) update.message.reply_text(«You have no projects right now.», reply_markup=reply_markup) # if existing project then PROJECT or else NEW_PROJECT return NEW_PROJECT def project_name(update, context): # asks for project name query = update.callback_query update.message.reply_text(text=»Okay, Please enter your project name:») return PROJECT_NAME def store_name_maybe_project_type(update, context): # stores project name and conditionally asks for project type print(update.message.text) keyboard = [ [InlineKeyboardButton(«Telegram Group», callback_data=»group»)], [InlineKeyboardButton(«Telegram Channel», callback_data=»channel»)] ] reply_markup = InlineKeyboardMarkup(keyboard) update.message.reply_text(«What do you want to make?», reply_markup=reply_markup) return PROJECT_TYPE def store_type_maybe_admin(update, context): # stores project type and conditonally asks for making admin print(update.message.text) keyboard = [[InlineKeyboardButton(«Done», callback_data=»done»)]] reply_markup = InlineKeyboardMarkup(keyboard) update.message.reply_text(f»Make a private and make this bot the admin», reply_markup=reply_markup) return ConversationHandler.END def cancel(update, context): update.message.reply_text(«Awww, that’s too bad») return ConversationHandler.END
Вот как я настроил веб-крючок(я думаю, что проблема где-то здесь):
Telegram Bot — Part 5 — Set Webhook
def setup(bot, update): # Create bot, update queue and dispatcher instances dispatcher = Dispatcher(bot, None, workers=0) ##### Register handlers here ##### bot_handlers = initialize_bot(update) for handler in bot_handlers: dispatcher.add_handler(handler) return dispatcher
А затем я вручную настроил веб-крючок, используя этот маршрут:
Telegram bot with webhooks | PyTelegramBotAPI(Telebot) + PythonAnywhere
Ответ №1:
ConversationHandler сохраняет текущее состояние в памяти, поэтому оно теряется conv_handler по истечении срока службы (т. Е. переменная удаляется или процесс завершается). Теперь ваши фрагменты не показывают , где вы инициализируете ConversationHandler , но у меня такое чувство, что вы создаете его заново для каждого входящего обновления — и каждый новый экземпляр не знает о предыдущем.
У меня такое чувство, потому что вы также создаете новое Dispatcher для каждого обновления. В этом нет необходимости, и на самом деле я бы настоятельно не советовал этого делать. Мало того , что требуется время для инициализации Dispatcher , которую вы могли бы сохранить , но также, если вы используете chat/user/bot_data , данные теряются каждый раз, когда вы создаете новый экземпляр.
Вызывается initialize_bot функция , в setup которой вы создаете новое Dispatcher , поэтому я предполагаю, что вы создаете новое ConversationHandler для каждого обновления. Также мне кажется странным, что возвращаемое значение этой функции, по — видимому, зависит от update … обработчики, используемые вашим диспетчером, должны быть исправлены …
Отказ от ответственности: В настоящее время я являюсь сопровождающим python-telegram-bot
1. Ваша догадка абсолютно верна! Ах, это имеет смысл, поэтому я должен хранить диспетчер в какой-то глобальной/сессионной переменной, чтобы он не вызывался каждый раз, когда телеграмма достигает запроса.
Вам также может понравиться
создайте пользовательского официанта в boto3, чтобы efs ждал, пока цель монтирования не будет удалена
8 января, 2022
Как я могу использовать одностраничное приложение с экспресс-рулями?
22 января, 2022
Как я могу сопоставить свойства тела JSON как динамические параметры метода действия .NET Core web API с проверкой?
28 июня, 2022
- О нас
- Онлайн игры
- Конвертеры
- Base64 конвертер онлайн
- Оформление кода JavaScript CSS HTML Онлайн
- URL Encoder (кодировщик) / Decoder (декодировщик) онлайн
- Конвертер регистров
- Рассчитать количество дней между датами
- Генератор ключей и паролей
- Генератор QR кодов
- Преобразование времени
- Преобразование микросекунд в секунды
- Преобразование микросекунд в миллисекунды
- Преобразование миллисекунд в микросекунды
- Преобразование миллисекунд в секунды
- Преобразование миллисекунд в минуты
- Преобразование миллисекунд в часы
- Преобразователь миллисекунд в дату
- Преобразование секунд в миллисекунды
- Преобразование секунд в минуты
- Преобразование секунд в часы
- Преобразование секунд в дни
- Преобразование минут во время
- Преобразование минут в миллисекунды
- Преобразование минут в секунды
- Преобразование минут в часы
- Преобразование часов в миллисекунды
- Преобразование часов в секунды
- Преобразование часов в минуты
- Преобразование часов в дни
- Преобразование дней в часы
- Преобразование из часы в недели
- Конвертация из недели в часы
- Через несколько часов калькулятор
- Преобразование времени AM/PM в 24-часовое
- Преобразование Военного Времени
- Время до десятичного калькулятора
- Безопасность
- Финансы
- Энциклопедия
Источник: programbox.ru
Telegram webhook php бот не отвечает
Я пытаюсь настроить телеграмму ботом с помощью webhook. Я могу заставить его работать с getUpdates, но я хочу, чтобы он работал с webhook. Мой сайт (на котором размещен скрипт bot php) работает SSL-сертификат (я получаю зеленую блокировку в адресной строке): Я создал webhook с
https://api.telegram.org/bot/setwebhook?url=https://www.example.com/bot/bot.php
И я получил: <«ok»: true, «result»: true, «description»: «Webhook был установлен»>(Я не знаю, имеет ли это значение, но я дал права rwx как для папки, так и для скрипта) Php bot: (https://www.example.com/bot/bot.php)
; $website = «https://api.telegram.org/bot».$botToken; #$update = url_get_contents(‘php://input’); $update = file_get_contents(‘php://input’); $update = json_decode($update, TRUE); $chatId = $update[«message»][«chat»][«id»]; $message = $update[«message»][«text»]; switch($message) < case «/test»: sendMessage($chatId, «test»); break; case «/hi»: sendMessage($chatId, «hi there!»); break; default: sendMessage($chatId, «default»); >function sendMessage ($chatId, $message) < $url = $GLOBALS[website].»/sendMessage?chat_id=».$chatId.»> firefreeman 28 март 2016, в 17:08 Поделиться Источник Поделиться: Теги: php telegram telegram-bot webhooks
1 ответ
2 Лучший ответ
В вашем вопросе не видно места сценария. Увидев ваш код, кажется, вы пытаетесь загрузить запрос через url_get_contents чтобы получить ответ сервера телеграммы. Это правильный метод, если ваш бот работает без webhook. В противном случае после установки веб-хопа вам необходимо обработать входящие запросы.
Т.е., если вы установили webhook на https://example.com/mywebhook.php, в вашем скрипте https://example.com/mywebhook.php вы должны написать что-то вроде этого:
elseif( !isset($request[‘update_id’]) || !isset($request[‘message’]) ) < // Some Error output (request has not message) >else < $chatId = $request[‘message’][‘chat’][‘id’]; $message = $request[‘message’][‘text’]; switch( $message ) < // Process your message here >>
fusion3k 28 март 2016, в 16:17
Поделиться
Спасибо за помощь. Я настроил webhook точно так же, как ваш пример, и сделал изменения, которые вы предложили, но бот по-прежнему молчит, как и раньше.
firefreeman 28 март 2016, в 15:02
Если вы знаете свой собственный chatID, проведите несколько тестов, отправив вам сообщение. Вы уверены, что webhook настроен правильно?
fusion3k 28 март 2016, в 15:07
получил идентификатор чата, пытаясь это сейчас
firefreeman 28 март 2016, в 15:16
Хорошо, я могу отправлять себе сообщения, зная chat_id. Я думаю, что мои webhooks настроены правильно (я сделал именно то, что написал в вопросе), но что-то должно быть сломано, потому что это, кажется, не работает.
firefreeman 28 март 2016, в 15:23
Поместите код для отправки вам сообщения типа «хорошо» в верхней части вашего скрипта. Затем напишите что-нибудь в телеграмме: если вы получили «ОК», ваш веб-крючок в порядке, в противном случае это не так.
fusion3k 28 март 2016, в 15:27
Пробовал, и это не работает, прежде чем я отправлял себе сообщения, вручную обновляя скрипт php
firefreeman 28 март 2016, в 15:35
Это странно. Вы уверены, что веб-крючок установлен, и что ваш сценарий находится именно в этом месте?
Источник: overcoder.net
Python-сообщество
- Начало
- » Python для новичков
- » Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
#1 Сен. 17, 2021 19:43:29
Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
День добрый.
Написал бота для Телеграма на Python, оттестировал с локального компа на GetUpdates, а дальше при выкладывании на Heroku заткнулся с переключением на Webhook. Сложность в том, что не выдает конкретной ошибки, а просто без детализации его прекращает (см лог ниже).
Впечатление, что ошибка где-то в этом блоке, по крайней мере к нему подходит без ошибок, но вроде все сделал по инструкциям из Интернета:
if __name__ == ‘__main__’: if Run_On_Heroku: print(‘. 004’) def main(): print(‘. 005’) executor.start_webhook(dispatcher=dp, webhook_path=WEBHOOK_PATH, on_startup=on_startup, skip_updates=True, host=WEBAPP_HOST, port=WEBAPP_PORT) else: executor.start_polling(dp, on_shutdown=shutdown)
Можете посоветовать, что не так, и куда копать?
Лог:
2021-09-17T16:35:57.046541+00:00 heroku: Starting process with command `python Bot_forKadry.py`
2021-09-17T16:35:58.603655+00:00 app: ..====== начали =====
2021-09-17T16:35:58.610152+00:00 app: ….вводную часть завершили
2021-09-17T16:35:58.768911+00:00 app: ….007
2021-09-17T16:35:58.768934+00:00 app: ….004
2021-09-17T16:35:59.019267+00:00 heroku: Process exited with status 0
2021-09-17T16:35:59.179898+00:00 heroku: State changed from starting to crashed
#2 Сен. 18, 2021 01:07:57
Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
На Heroku переменные среды установил?
#3 Сен. 18, 2021 02:10:34
Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
py.user.next
На Heroku переменные среды установил?
Да, конечно.
На всякий случай специально в основной код (стр.18) вывел перечень фактически установленных переменных окружения
Отредактировано GeorgeSU (Сен. 18, 2021 02:24:40)
#4 Сен. 18, 2021 03:05:48
Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
Сделай просто Webhook без всего. Убедись, что ты его можешь сделать вообще. Имеется в виду на Heroku. Ты ему должен посылать сообщение, на которое он должен отвечать.
В коде в этом копаться вряд ли есть смысл, так как видно, что он никакущий. Ошибок может быть миллион. Выглядит как такая бочка говна, в которой где-то в глубине плавает сосиска в упаковке, которую нужно достать. Ты давай ныряй туда сам, а мы тебе будем советовать, как с чистого начинать, чтобы покушать нормально.
#5 Сен. 18, 2021 11:44:09
Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
py.user.next
В коде в этом копаться вряд ли есть смысл, так как видно, что он никакущий. Ошибок может быть миллион. Выглядит как такая бочка говна, в которой где-то в глубине плавает сосиска в упаковке, которую нужно достать. Ты давай ныряй туда сам, а мы тебе будем советовать, как с чистого начинать, чтобы покушать нормально.
Спасибо за образную характеристику ))) Учитывая что я вообще не программист, но вижу в чем есть потребность у коллег по отрасли, и для этого и полез в бото-писание чтобы запустить профильный канал в телеграме.
Убрал из кода всю содержательную часть, оставил только запуск Webhook и один хандлер (для проверки работоспособности кода). Получилось вот так:
на гитхабе
Можешь посоветовать как эти вэбхуки запустить?
(идея в том, что бот ждет когда к нему пользователь обратится, а как именно потом будет с ним взаимодействовать — я пока поубирал)
Лог:
2021-09-18T08:39:34.691426+00:00 heroku: State changed from crashed to starting
2021-09-18T08:39:42.013028+00:00 heroku: Starting process with command `python Bot_test.py`
2021-09-18T08:39:43.710210+00:00 app: ..====== начали =====
2021-09-18T08:39:43.719582+00:00 app: ….контроль прохода к строке 007
2021-09-18T08:39:43.719586+00:00 app: ….контроль прохода к строке 004
2021-09-18T08:39:43.873993+00:00 heroku: Process exited with status 0
2021-09-18T08:39:43.958005+00:00 heroku: State changed from starting to crashed
P.S. Лучше давать ссылку на Гитхаб с кодом, или выкладывать оттуда код сюда? Как удобнее/корректнее?
#6 Сен. 18, 2021 12:09:30
Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
GeorgeSU
Убрал из кода всю содержательную часть
Не, сделай новый питон-файл вообще пустой. И потом начинай его заполнять по минимуму. Там у тебя такой код: при получении сообщения от Telegram код должен на Webhook послать сообщение.
Таким образом ты посылаешь команду боту в смартфоне или в десктопном приложении, а бот тебе отвечает на эту команду “привет”.
Для этого не нужен aiogram. Там вообще хватит только urllib.request.urlopen() .
GeorgeSU
Можешь посоветовать как эти вэбхуки запустить?
Надо в Telegram зарегистрировать этот Webhook. Там ему посылаешь JSON-документ, в котором указываешь url. Так Telegram поймёт, куда перенаправлять команды.
https://core.telegram.org/bots/api#setwebhook
GeorgeSU
Лучше давать ссылку на Гитхаб с кодом, или выкладывать оттуда код сюда?
Если будет готовый вариант даже простого эхо-бота, то лучше здесь оставить его с полным описанием. Кто-нибудь потом найдёт его случайно через поисковик типа Google или Яндекс и применит для своего обучения. При этом на GitHub’е его не нужно будет держать годами. А тут он сохранится.
Вот если бы такой вариант тут уже был, я бы тебе на него ссылку и дал, чтобы ты сам не экспериментировал.
Тут писал только про виды ботов.
Тут делал скрипт отправки сообщения от имени бота.
Отредактировано py.user.next (Сен. 18, 2021 12:21:38)
#7 Сен. 20, 2021 13:51:52
Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
Уфф, эхо-бот заработал. Дальше буду уже накручивать в него свои функционалы.
Оставляю на случай если кому-то понадобится Webhook для Телеграма, работающий на Heroku:
Procfile:
web: python test.py
Отредактировано GeorgeSU (Сен. 20, 2021 13:54:10)
Источник: python.su