# Using Azure Functions for serverless bots. # (Thanks to twitter.com/masyan for the idea) # By default the Azure Functions url is https://.../api/HttpTrigger for HttpTrigger type. # In this example we will use clear webhook url without /api/ -> https://.../HttpTrigger. # Also we set "authLevel": "anonymous". # For HttpTrigger type set "route" and "authLevel" in functions.json # { # "bindings": [ # ... # "authLevel": "anonymous" # "route": "HttpTrigger" # ] # } # To avoid using /api/ in url set "routePrefix":"" in host.json # { # ... # "extensions": { # "http": { # "routePrefix": "" # } # } # } import logging import azure.functions as func import telebot from telebot import apihelper, types logger = telebot.logger telebot.logger.setLevel(logging.DEBUG) # Set bot token TOKEN = '' # Uncomment this for using proxy for request # PROXY = '' # apihelper.proxy = {'https': PROXY} # Set WEBHOOK as your Azure Functions url (https://...azurewebsites.net/HttpTrigger) WEBHOOK = '' bot = telebot.TeleBot(TOKEN) @bot.message_handler(commands=['start']) def start(message): bot.reply_to(message, 'Hello, ' + message.from_user.first_name) @bot.message_handler(func=lambda message: True, content_types=['text']) def echo_message(message): bot.reply_to(message, message.text) # To avoid "error 429 too many request" set webhook only once. Or use time.sleep(1). def main(req: func.HttpRequest) -> func.HttpResponse: bot.set_webhook(url=WEBHOOK) request_body_dict = req.get_json() update = telebot.types.Update.de_json(request_body_dict) bot.process_new_messages([update.message]) return func.HttpResponse(body='', status_code=200) # Sometimes "requests" version is important. # azure-functions==1.0.4 # PySocks==1.7.1 # pyTelegramBotAPI==3.6.6 # requests==2.10.0