Как установить вебхук Telegram

Добрый день. Помогите пожалуйста никак не могу найти информации о деплое Telegram бота на pythonenywhere. Написал бота используя pyTelegramBotAPI (база данных, админка и еще некоторые вещи на Django). Столкнулся с проблемой, что на локальной машине с использованием polling() все работает, а когда выкладываю на pythonenywhere, чтобы не мучать сервер нужно использовать webhook.

Только нигде в интернете нет вменяемого объяснения как сделать это для Django. Для Flask куча описаний. Пытался переделать то, что удалось найти, но бот никак не заводится. Вернее само приложение Django работает прекрасно, как и админка бота, только бот ника не реагирует на мои сообщения в телеграм. По логам все ок и теграм говорит, что webhook установлен успешно. Вот мой код: Файл «urls.py» проекта:

urlpatterns = [ path(‘admin/’, admin.site.urls), path(», include(‘bot.urls’)), . ]

Файл «urls.py» бота:

urlpatterns = [ path(», UpdateBot.as_view(), name=’update’), ]

Файл «views.py» бота:

2. Создание Telegram бота с Webhook’ом на Python. Установка Webhook’а.

Для Flask (с ним не работал) есть такой пример:

Буду благодарен за помощь.

Рекомендуем хостинг TIMEWEB

Рекомендуем хостинг TIMEWEB

Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Подписка на обсуждение 3
Подписка на раздел 95

Вам это нравится? Поделитесь в социальных сетях!

nayk1982

Добрый день.
Посмотрите для начала статус установленного WebHook, нет ли ошибок с сертификатом безопасности. Это можно сделать из командной строки:

curl https://api.telegram.org/bot/getWebhookInfo

Arrow

Попробовал реализовать через сертефикат и изменил код:

curl https://api.telegram.org/bot/getWebhookInfo
«,»max_connections»:100>>

Arrow

В логах pythonenywhere:

Request: method=get url=https://api.telegram.org/bot/setWebhook params= files=> (apihelper.py:55 uWSGIWorker1Core0) DEBUG — TeleBot: «The server returned: ‘b»'» The server returned: ‘b»
curl https://api.telegram.org/bot/getWebhookInfo «,»max_connections»:100>>

nayk1982

Сертификат не проходит проверку. У меня такое было, когда пытался использовать самоподписанный сертификат. Решилось установкой сертификата Lets Encrypt. После этого WebHook заработал без проблем и сообщения стали приходить.

Arrow

Попробовал создать сертефикат при помощи acme-tiny (Let’s Encrypt certificates):

Что такое Webhook за 12 минут


openssl genrsa 4096 > account.key
# Webhook CERTIFICATE = join(settings.BASE_DIR, ‘account.key’) bot.set_webhook(url=»https://myapp.pythonanywhere.com/», certificate=open(CERTIFICATE), max_connections=100000)

И получил в логах:

Request: method=get url=https://api.telegram.org/bot/setWebhook params= files=> The server returned: ‘b»’

Сервер его вообще не принимает. C рекомендуемым certbot то же самое.

Arrow

Решил уйти от сертификата к простому токену.

Файл urls.py приложения бота:

from django.urls import path from bot.views import UpdateBot from django.conf import settings from django.views.decorators.csrf import csrf_exempt urlpatterns = [ path(‘<>’.format(settings.TOKEN), csrf_exempt(UpdateBot.as_view()), name=’update’), ]

Код views.py приложения бота:

Сразу, когда перезагрузил веб приложение в pythonenywhere пришло куча сообщений от бота (реакция на мои сообщения /start), а затем опять тишина.

При проверке через терминал получаю:

$ curl https://api.telegram.org/bot/getWebhookInfo <«ok»:true,»result»:<«url»:»https://myapp.pythonanywhere.com/»,»has_custom_certificate»:false,»pending_update_count»:19,»last_error_date»:1565006606,»last_err or_message»:»Wrong response from the webhook: 500 Internal Server Error»,»max_connections»:40>>

В логах тишина. Немогу понять, что не верно. Особенно если по началу все вроде бы заработало.

Arrow

Только теперь не знаю как быть. Толи я, что-то не то сделал, то ли телеграм тупит.
Постоянно сробатывает Одна и таже процедура в коде, а именно часть ‘Рассказать о боте’:

def menu(message): try: if message.text == ‘Рассказать о боте’: «»» Эта часть отрабатывает «»» markup = types.InlineKeyboardMarkup() forward_btn = types.InlineKeyboardButton( text=’. ‘, url=’https://t.me/share/url?url=https://t.me/’ + settings.BOT_NAME) markup.add(forward_btn) text = ‘. ‘ bot.send_message(message.chat.id, text=text, reply_markup=markup, parse_mode=’html’) bot.register_next_step_handler(message, menu) elif message.text == ‘Поиск’: bot.delete_message(message.chat.id, message.message_id) markup = types.InlineKeyboardMarkup() search_channel = types.InlineKeyboardButton( text=’. ‘, callback_data=’. ‘) search_bot = types.InlineKeyboardButton( text=’. ‘, callback_data=’. ‘) search_chat = types.InlineKeyboardButton( text=’. ‘, callback_data=’. ‘) markup.row(search_channel) markup.row(search_bot) markup.row(search_chat) text = ‘. ‘ bot.send_message(message.chat.id, text=text, parse_mode=’html’, reply_markup=markup) bot.register_next_step_handler(message, owner_menu) elif message.text == ‘Изменить настройки’: bot.register_next_step_handler(message, owner_menu) manage_interests(message) else: raise Exception() except: bot.register_next_step_handler(message, owner_menu)

Подскажите пожалуйста, где я туплю. Спасибо.

nayk1982

Возможно телеграм повторяет одно и то же сообщение, это бывает, если в ответ на сообщение от телеграм ваш бот ничего не отвечает. Нужно на сообщения посылать ответ:

И еще, в каждом сообщении есть счетчик update_id, для каждого чата. Можно его запоминать и сравнивать, чтоб не дублировать ответы.

Arrow

  • Arrow
  • #
  • 6 августа 2019 г. 14:07
  • Ответ был помечен как решение.

Что-то не особо помогает.

Похоже что у pythonanywhere какие-то проблемы с передачей обновлений боту или у телеграм. То приходят данные, то нет. Сейчас проверка показывает:

«,»has_custom_certificate»:false,»pending_update_count»:0,»max_connections»:40>>

А сообщения вообще перестали приходить.

Можете привести пример реализации ответа или подредактировать мое, может я уже туплю на ровном месте.

urls.py приложения бота:

from django.urls import path from django.conf import settings from django.views.decorators.csrf import csrf_exempt from bot.views import UpdateBot, Check app_name = ‘PlayMarketBot’ urlpatterns = [ path(‘<>’.format(settings.TOKEN), csrf_exempt(UpdateBot.as_view()), name=’update’), path(‘/’, csrf_exempt(Check.as_view()), name=’check’), ]

views.py приложения бота:

Большое спасибо за помощь.

nayk1982

На python не делал, поэтому не подскажу, как правильно.
Бросаются в глаза последние строчки из views.py:

bot.remove_webhook() bot.set_webhook(url=f»/»)

Они что, выполняются каждый раз? Если да, то это не правильно. WebHook устанавливается один раз и после этого ничего с ним делать не нужно (пока адрес вашего сервера не изменится или токен бота). Я бы вообще управление вэбхуком из кода убрал, это можно из консоли сделать одной строчкой, когда понадобится.

Могу рассказать, как делал я своего бота. На сервере для начала создал простой скрипт для приема сообщений и вывода в лог-файлы всего, что принял. Это поможет разобраться, как работает Telegram API. WebHook поставил на этот скрипт, добавил бота в тестовый чат Telegram и просто изучал, как работает API, параллельно читая документацию.

Потом начал потихоньку наполнять этот скрипт и делать дополнительные если нужно. По началу лучше логировать все, что только можно, легче разобраться.

Источник: evileg.com

Telegram бот и регистрация URL для веб-хука

Edit Bots
/setname — change a bot’s name
/setdescription — change bot description
/setabouttext — change bot about info
/setuserpic — change bot profile photo
/setcommands — change the list of commands
/deletebot — delete a bot

Bot Settings
/token — generate authorization token
/revoke — revoke bot access token
/setinline — toggle inline mode (https://core.telegram.org/bots/inline)
/setinlinegeo — toggle inline location requests (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback — change inline feedback (https://core.telegram.org/bots/inline#collecting-feedback) settings
/setjoingroups — can your bot be added to groups?
/setprivacy — toggle privacy mode (https://core.telegram.org/bots#privacy-mode) in groups

Games
/mygames — edit your games (https://core.telegram.org/bots/games) [beta]
/newgame — create a new game (https://core.telegram.org/bots/games)
/listgames — get a list of your games
/editgame — edit a game
/deletegame — delete an existing game

Для добавления адреса для веб-хуков:

https://api.telegram.org/bot/setwebhook?url=
https://api.telegram.org/bot1260943904:ktr3f49m6jrmrz68scbthw/setwebhook?url=https://site.net/bot_telegram/

Добавление адреса веб-хуче через консоль Linux:

curl —location —request POST «https://api.telegram.org/bot/setwebhook» —header «Content-Type: application/json» —data ‘»>’

Библиотека на PHP «PHP Telegram Bot Api»

Установка через Composer:

$ composer require telegram-bot/api
$bot = new TelegramBotApiBotApi(‘YOUR_BOT_API_TOKEN’); $bot->sendMessage($chatId, $messageText);
$bot = new TelegramBotApiBotApi(‘YOUR_BOT_API_TOKEN’); $document = new CURLFile(‘document.txt’); $bot->sendDocument($chatId, $document);

Send message with reply keyboard:

$bot = new TelegramBotApiBotApi(‘YOUR_BOT_API_TOKEN’); $keyboard = new TelegramBotApiTypesReplyKeyboardMarkup(array(array(«one», «two», «three»)), true); // true for one-time keyboard $bot->sendMessage($chatId, $messageText, null, false, null, $keyboard);

Send message with inline keyboard:

$bot = new TelegramBotApiBotApi(‘YOUR_BOT_API_TOKEN’); $keyboard = new TelegramBotApiTypesInlineInlineKeyboardMarkup( [ [ [‘text’ => ‘link’, ‘url’ => ‘https://core.telegram.org’] ] ] ); $bot->sendMessage($chatId, $messageText, null, false, null, $keyboard);

Send media group:

$bot = new TelegramBotApiBotApi(‘YOUR_BOT_API_TOKEN’); $media = new TelegramBotApiTypesInputMediaArrayOfInputMedia(); $media->addItem(new TelegramBotApiTypesInputMediaInputMediaPhoto(‘https://avatars3.githubusercontent.com/u/9335727’)); $media->addItem(new TelegramBotApiTypesInputMediaInputMediaPhoto(‘https://avatars3.githubusercontent.com/u/9335727’)); // Same for video // $media->addItem(new TelegramBotApiTypesInputMediaInputMediaVideo(‘http://clips.vorwaerts-gmbh.de/VfE_html5.mp4’)); $bot->sendMediaGroup($chatId, $media);
require_once «vendor/autoload.php»; try < $bot = new TelegramBotApiClient(‘YOUR_BOT_API_TOKEN’); // or initialize with botan.io tracker api key // $bot = new TelegramBotApiClient(‘YOUR_BOT_API_TOKEN’, ‘YOUR_BOTAN_TRACKER_API_KEY’); //Handle /ping command $bot->command(‘ping’, function ($message) use ($bot) < $bot->sendMessage($message->getChat()->getId(), ‘pong!’); >); //Handle text messages $bot->on(function (TelegramBotApiTypesUpdate $update) use ($bot) < $message = $update->getMessage(); $id = $message->getChat()->getId(); $bot->sendMessage($id, ‘Your message: ‘ . $message->getText()); >, function () < return true; >); $bot->run(); > catch (TelegramBotApiException $e) < $e->getMessage(); >

Источник: disweb.ru

Оцените статью
Добавить комментарий