Лайфхаки

Маленькие, полезные хитрости

Как запустить aiogram бота с помощью прокси url. Как пробросить webhook Telegram бота на домашний компьютер через виртуальный сервер с OpenVPN и Docker?

07.07.2023 в 14:23

Как запустить aiogram бота с помощью прокси url. Как пробросить webhook Telegram бота на домашний компьютер через виртуальный сервер с OpenVPN и Docker?

Доброго времени суток. Проблема такая… Мне удобно вести разработку и отлаживать бота у себя на домашнем компьютере при помощи Docker, т.к. в дальнейшем сильно упрощается деплой на сервер. Но я не могу позволить пробросить телеграммовский вебхук себе на локальную машину по логичным причинам, а его нужно как-то дебажить в процессе работы, клиенту результат показывать и т.д. Постоянно пушуить/пуллить всё на продакшн сервер и там запускать для дебага - не вариант. Примерно представляю, что в данном случае мне легче заиметь какой-нибудь самый дешевый виртуальный сервер, который будет выступать в роли организатора туннеля через OpenVPN. Вопрос тогда в том, как это правильно всё настроить. С OpenVPN раньше не работал, не знаю с какой стороны подойти. Ситуацию усложняет то, что для вебхука тг необходим ssl сертификат, а домен держать на сервере не хочется. Могу ли я его просто на ip повесить, тг даст мне такой вебхук установить? И как в итоге это всё на моей стороне должно описываться? В случае с aiogram, например… Пример запуска бота с вебхуком:

import logging from aiogram import Bot, types from aiogram.contrib.middlewares.logging import LoggingMiddleware from aiogram.dispatcher import Dispatcher from aiogram.dispatcher.webhook import SendMessage from aiogram.utils.executor import start_webhook API_TOKEN = 'BOT_TOKEN_HERE' # webhook settings WEBHOOK_HOST = 'https://your.domain' WEBHOOK_PATH = '/path/to/api' WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}" # webserver settings WEBAPP_HOST = 'localhost' # or ip WEBAPP_PORT = 3001 logging.basicConfig(level=logging.INFO) bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) dp.middleware.setup(LoggingMiddleware()) @dp.message_handler() async def echo(message: types.Message): # Regular request # await bot.send_message(message.chat.id, message.text) # or reply INTO webhook return SendMessage(message.chat.id, message.text) async def on_startup(dp): await bot.set_webhook(WEBHOOK_URL) # insert code here to run it after start async def on_shutdown(dp): logging.warning('Shutting down..') # insert code here to run it before shutdown # Remove webhook (not acceptable in some cases) await bot.delete_webhook() # Close DB connection (if used) await dp.storage.close() await dp.storage.wait_closed() logging.warning('Bye!') if __name__ == '__main__': start_webhook( dispatcher=dp, webhook_path=WEBHOOK_PATH, on_startup=on_startup, on_shutdown=on_shutdown, skip_updates=True, host=WEBAPP_HOST, port=WEBAPP_PORT, )

  • Вопрос задан

Warning aiogram:goodbye. Как решить проблему, не запускается бот python с библиотекой aiogram?

Создал для теста простого бота

import config import logging from aiogram import Bot, Dispatcher, executor, types # Задаем уровень логов logging.basicConfig(level=logging.INFO) # Инициализация бота bot = Bot(token=config.tokenbot) dp = Dispatcher(bot) # Эхо @dp.message_handler() async def echo(message: types.Message): await message.answer(message.text) # запускаем лонг поллинг if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)

Но при запуске выдает ошибку
WARNING:aiogram:Goodbye!
Traceback (most recent call last):
File "C:/Users/zahar/Downloads/bot/bot.py", line 21, in
executor.start_polling(dp, skip_updates=True)
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\utils\executor.py", line 41, in start_polling
executor.start_polling(reset_webhook=reset_webhook, timeout=timeout, relax=relax, fast=fast)
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\utils\executor.py", line 305, in start_polling
loop.run_until_complete(self._startup_polling())
File "C:\Users\zahar\AppData\Local\Programs\Python\Python38-32\lib\asyncio\base_events.py", line 616, in run_until_complete
return future.result()
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\utils\executor.py", line 356, in _startup_polling
await self._welcome()
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\utils\executor.py", line 346, in _welcome
user = await self.dispatcher.bot.me
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\bot\bot.py", line 27, in me
setattr(self, '_me', await self.get_me())
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\bot\bot.py", line 176, in get_me
result = await self.request(api.Methods.GET_ME, payload)
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\bot\base.py", line 201, in request
return await api.make_request(self.session, self.__token, method, data, files,
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\bot\api.py", line 104, in make_request
return check_result(method, response.content_type, response.status, await response.text())
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\bot\api.py", line 84, in check_result
exceptions.Unauthorized.detect(description)
File "C:\Users\zahar\Downloads\bot\venv\lib\site-packages\aiogram\utils\exceptions.py", line 137, in detect
raise cls(description)
aiogram.utils.exceptions.Unauthorized: Unauthorized
Уже все что смог в интернете перечитал, не могу понять в чем проблема.
Несколько раз устанавливал библиотеку, все что только смог обновил.

State proxy aiogram. Как получать от пользователя файл, а потом хранить его в памяти (aiogram)?

Я получаю от пользователя текст и хочу получать от пользователя pdf файл, а затем хранить его в памяти( в дальнейшем выводить пользователю по команде), поискав в документации, что то не смог найти данного решения и обращяюсь сюда. Заранее скажу, что я новичек в библиотеке и в целом и python.
Так же, хендлеры зарагестрированны в основном файле и закоменчены
Пожалуйста, подскажите каким образом это можно реализовать в коде ниже( заранее спасибо )

from aiogram import types from aiogram import Bot from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup from aiogram.dispatcher import Dispatcher import os from aiogram.contrib.fsm_storage.memory import MemoryStorage class FSMAdmin(StatesGroup): date = State() pfd = State() # @dp.message_handler(commands='Загрузить', state=None) async def cm(message : types.Message): await FSMAdmin.date.set() await message.reply('Введите дату') # @dp.message_handler(state=FSMAdmin.date) async def load_date(message : types.Message, state:FSMContext): async with state.proxy() as data: data = message.text await FSMAdmin.next() await message.reply('Загрузите PDF файл') # @dp.message_handler(content_types=,state=FSMAdmin.pfd) async def load_pdf(message : types.Message, state: FSMContext): async with state.proxy() as data: data = message.document.file_id async with state.proxy() as data: await message.reply(data) await state.finish() def register_handlers_client(dp : Dispatcher): dp.register_message_handler(cm, commands=, State=None) dp.register_message_handler(load_date, state=FSMAdmin.date) dp.register_message_handler(load_pdf, content_types=, state=FSMAdmin.pfd)

  • Вопрос задан

Aiogram contact handler. Кнопки, как шаблоны ¶

Этот вид кнопок появился вместе с Bot API в далёком 2015 году и представляет собой не что иное, как шаблоны сообщений (за исключением нескольких особых случаев, но о них позже). Принцип простой: что написано на кнопке, то и будет отправлено в текущий чат. Соответственно, чтобы обработать нажатие такой кнопки, бот должен распознавать входящие текстовые сообщения.

Напишем хэндлер, который будет при нажатии на команду/startотправлять сообщение с двумя кнопками:

Несмотря на то, что Telegram Bot APIуказывать просто строки вместо объектовKeyboardButton, при попытке использовать строку aiogram 3.x выкинет ошибку валидации и это не баг, а фича .
Живите теперь с этим ‍♂️

Что ж, запустим бота и обалдеем от громадных кнопок:

Как-то некрасиво. Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметрresize_keyboard=True.