diff --git a/examples/adwanced_executor_example.py b/examples/adwanced_executor_example.py new file mode 100644 index 00000000..a1dcdcc6 --- /dev/null +++ b/examples/adwanced_executor_example.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +""" +II 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 dev.illemius.xyz \ + --webhook-port 443 + +Or long pooling: + 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_pooling, 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_pooling(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)