#!/usr/bin/env python3 """ **This example is outdated** In this example used ArgumentParser for configuring Your bot. Provided to start bot with webhook: python adwanced_executor_example.py \ --token TOKEN_HERE \ --host 0.0.0.0 \ --port 8084 \ --host-name example.com \ --webhook-port 443 Or long polling: python adwanced_executor_example.py --token TOKEN_HERE So... In this example found small trouble: can't get bot instance in handlers. If you want to automatic change getting updates method use executor utils (from aiogram.utils.executor) """ # TODO: Move token to environment variables. import argparse import logging import ssl import sys from aiogram import Bot from aiogram.dispatcher import Dispatcher from aiogram.dispatcher.webhook import * from aiogram.utils.executor import start_polling, start_webhook logging.basicConfig(level=logging.INFO) # Configure arguments parser. parser = argparse.ArgumentParser(description="Python telegram bot") parser.add_argument( "--token", "-t", nargs="?", type=str, default=None, help="Set working directory" ) parser.add_argument("--sock", help="UNIX Socket path") parser.add_argument("--host", help="Webserver host") parser.add_argument("--port", type=int, help="Webserver port") parser.add_argument("--cert", help="Path to SSL certificate") parser.add_argument("--pkey", help="Path to SSL private key") parser.add_argument("--host-name", help="Set webhook host name") parser.add_argument("--webhook-port", type=int, help="Port for webhook (default=port)") parser.add_argument("--webhook-path", default="/webhook", help="Port for webhook (default=port)") async def cmd_start(message: types.Message): return SendMessage(message.chat.id, f"Hello, {message.from_user.full_name}!") def setup_handlers(dispatcher: Dispatcher): # This example has only one messages handler dispatcher.register_message_handler(cmd_start, commands=["start", "welcome"]) async def on_startup(dispatcher, url=None, cert=None): setup_handlers(dispatcher) bot = dispatcher.bot # Get current webhook status webhook = await bot.get_webhook_info() if url: # If URL is bad if webhook.url != url: # If URL doesnt match with by current remove webhook if not webhook.url: await bot.delete_webhook() # Set new URL for webhook if cert: with open(cert, "rb") as cert_file: await bot.set_webhook(url, certificate=cert_file) else: await bot.set_webhook(url) elif webhook.url: # Otherwise remove webhook. await bot.delete_webhook() async def on_shutdown(dispatcher): print("Shutdown.") def main(arguments): args = parser.parse_args(arguments) token = args.token sock = args.sock host = args.host port = args.port cert = args.cert pkey = args.pkey host_name = args.host_name or host webhook_port = args.webhook_port or port webhook_path = args.webhook_path # Fi webhook path if not webhook_path.startswith("/"): webhook_path = "/" + webhook_path # Generate webhook URL webhook_url = f"https://{host_name}:{webhook_port}{webhook_path}" # Create bot & dispatcher instances. bot = Bot(token) dispatcher = Dispatcher(bot) if (sock or host) and host_name: if cert and pkey: ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) ssl_context.load_cert_chain(cert, pkey) else: ssl_context = None start_webhook( dispatcher, webhook_path, on_startup=functools.partial(on_startup, url=webhook_url, cert=cert), on_shutdown=on_shutdown, host=host, port=port, path=sock, ssl_context=ssl_context, ) else: start_polling(dispatcher, on_startup=on_startup, on_shutdown=on_shutdown) if __name__ == "__main__": argv = sys.argv[1:] if not len(argv): parser.print_help() sys.exit(1) main(argv)