Telegram bot не работает webhook

Содержание

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-сообщество

[RSS Feed]

  • Начало
  • » 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

Рейтинг
( Пока оценок нет )
Загрузка ...