Помогите правильно настроить telegrambotapi и webhook
столкнулся с такой проблемой. Раньше бот обращался к сайте для отправки и приема данных (post\get) запросы. После того как На сервере появился ssl сертификат. То бот стал выдавать ошибку. Погуглив я нашел способ где можно было у всех запросов прописать verify=False и вроде как все должно работать. Но при таком способе у меня не работали post запросы я начал искать дальше. Нашел что надо настраивать webhook. Но опыта в этом нет. Не только в этом но и работе с ssl сертификатом. Помогите разобраться, как настроить? Могу ли я настроить что бы запускать на локальной машине или надо обязательно запускать не сервере где сайт с которого берется инфа? сервер nginx
Я сделал следующим образом. Создал 3 файла: main - файл с кодом программы, webhook_cert.pem - где храниться ssl сертификат, Корневой сертификат, Промежуточный сертификат webhook_pkey.pem - где храниться приватный ключ
import telebot, logging, requests, json, time
from telebot import types
import dpath.util as dp
from string import ascii_letters
import cherrypy
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
TOKEN_BOT = 'token'
bot = telebot.TeleBot(TOKEN_BOT)
WEBHOOK_HOST = 'ip адрес сайта'
WEBHOOK_PORT = 443
WEBHOOK_LISTEN = 'ip адрес сайта'
WEBHOOK_SSL_CERT = './webhook_cert.pem' # Путь к сертификату
WEBHOOK_SSL_PRIV = './webhook_pkey.pem' # Путь к приватному ключу
WEBHOOK_URL_BASE = "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/%s/" % (TOKEN_BOT)
class WebhookServer(object):
@cherrypy.expose
def index(self):
if 'content-length' in cherrypy.request.headers and \
'content-type' in cherrypy.request.headers and \
cherrypy.request.headers['content-type'] == 'application/json':
length = int(cherrypy.request.headers['content-length'])
json_string = cherrypy.request.body.read(length).decode("utf-8")
update = telebot.types.Update.de_json(json_string)
bot.process_new_updates([update])
return ''
else:
raise cherrypy.HTTPError(403)
def main_menu(message):
user_id = message.chat.id
keyboard = types.InlineKeyboardMarkup(True)
row = [types.InlineKeyboardButton(text="Пройти тест", callback_data=" ")]
keyboard.row(*row)
row = [types.InlineKeyboardButton(text="Личная информация", callback_data=" ")]
keyboard.row(*row)
row = [types.InlineKeyboardButton(text="Перейти на сайт", url="https://sitename.ru/home")]
keyboard.row(*row)
row = [types.InlineKeyboardButton(text="Выйти", callback_data=" ")]
keyboard.row(*row)
return keyboard
@bot.message_handler(commands=["start"])
def send_welcome(message):
img = open("./logo.jpg", "rb")
bot.send_photo(message.chat.id, img,
caption="Добро пожаловать",
reply_markup=main_menu(message))
bot.remove_webhook()
bot.set_webhook(url=WEBHOOK_URL_BASE + WEBHOOK_URL_PATH,
certificate=open(WEBHOOK_SSL_CERT, 'r'))
cherrypy.config.update({
'server.socket_host': WEBHOOK_LISTEN,
'server.socket_port': WEBHOOK_PORT,
'server.ssl_module': 'builtin',
'server.ssl_certificate': WEBHOOK_SSL_CERT,
'server.ssl_private_key': WEBHOOK_SSL_PRIV
})
cherrypy.quickstart(WebhookServer(), WEBHOOK_URL_PATH, {'/': {}})
все файлы загрузил на сервер и получил ошибку которая повторяется пока не остановлю сервер.
[25/Apr/2020:14:56:39] ENGINE Listening for SIGTERM.
[25/Apr/2020:14:56:39] ENGINE Listening for SIGHUP.
[25/Apr/2020:14:56:39] ENGINE Listening for SIGUSR1.
[25/Apr/2020:14:56:39] ENGINE Bus STARTING
[25/Apr/2020:14:56:39] ENGINE Started monitor thread 'Autoreloader'.
[25/Apr/2020:14:56:40] ENGINE Serving on https://31.31.203.65:8443
[25/Apr/2020:14:56:40] ENGINE Bus STARTED
[25/Apr/2020:14:56:40] ENGINE Error in HTTPServer.tick
Traceback (most recent call last):
File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/server.py", line 1776, in serve
self.tick()
File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/server.py", line 1999, in tick
conn = self.connections.get_conn(self.socket)
File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/connections.py", line 180, in get_conn
return self._from_server_socket(server_socket)
File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/connections.py", line 199, in _from_server_socket
s, ssl_env = self.server.ssl_adapter.wrap(s)
File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/ssl/builtin.py", line 244, in wrap
sock, do_handshake_on_connect=True, server_side=True,
File "/usr/lib64/python3.6/ssl.py", line 365, in wrap_socket
_context=self, _session=session)
File "/usr/lib64/python3.6/ssl.py", line 773, in __init__
self.do_handshake()
File "/usr/lib64/python3.6/ssl.py", line 1033, in do_handshake
self._sslobj.do_handshake()
File "/usr/lib64/python3.6/ssl.py", line 645, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_BAD_CERTIFICATE] sslv3 alert bad certificate (_ssl.c:877)
Помогите разобраться, только пожалуйста помните что я в этом вообще не понимаю и если не сложно более детально объясните.
Ответы (1 шт):
Получение оповещения bad certificate означает, что сервер требует от вас аутентификации с помощью сертификата, а вы этого не сделали, и это вызвало сбой рукопожатия.
проверьте дату истечения сертификата (выполните данную команду в консоли сервера): openssl x509 -enddate -noout -in file.pem
еще смущает, что у вас в коде WEBHOOK_PORT = 443, а в консоли [25/Apr/2020:14:56:40] ENGINE Serving on https://31.31.203.65:8443 или у вас перенаправление?
так же вы можете попробовать использовать сертификаты выданные Let's Encrypt через certbot