部署 Telegram 机器人的 Azure Web App 超时问题

问题描述 投票:0回答:1

我有一个使用 Python、Pyrogram 构建的 Telegram 机器人,并部署在 Azure Web 应用程序上。最初,该机器人运行良好,但一段时间后,它停止响应。 Azure Web App 未能在预期时间限制 (website_container_start_time_limit) 内启动。 日志显示 Gunicorn 服务器(运行 Flask 应用程序)成功启动,但遇到超时错误,并在大约 10 分钟后终止了工作进程。重复此循环,直到 Azure Web App 在 30 分钟后超时,这表明应用程序未在配置的时间限制内响应 HTTP 请求。 令人惊讶的是,在遇到超时大约 30 分钟后,机器人再次开始工作,而没有对代码或配置进行任何更改。

日志:-

2024-05-21T17:07:43.804Z ERROR - Container telegram-bot for site telegram-bot did not start within expected time limit. Elapsed time = 1819.1139457 sec


2024-05-21T17:07:43.838Z ERROR - Container telegram-bot-dignified-india_0_d3110031 didn't respond to HTTP pings on port: 8000, failing site start. See container logs for debugging.

我尝试重新部署机器人以查看是否可以解决问题,但没有成功。我还在应用程序设置中添加了环境变量:

WEBSITES_CONTAINER_START_TIME_LIMIT=1800 网站端口=8080

我预计通过增加 WEBSITES_CONTAINER_START_TIME_LIMIT 值并指定 WEBSITES_PORT,机器人将有足够的时间启动并处理传入请求而不会超时。

参考代码

from pyrogram import Client, filters

app = Client("abc_bot", api_id=api_id, api_hash=api_hash, bot_token=bot_token)

#Define a function to handle the /start command
@app.on_message(filters.command("start"))
def start_command(client, message):
    #Send "Hello" as a response to the /start command
    message.reply_text("Hello!")

#Run the bot
app.run()
azure timeout azure-webapps pyrogram
1个回答
0
投票

我尝试使用下面的示例代码将消息发送到 Telegram 机器人,并通过容器将其部署到 Azure 应用服务,没有任何问题。

我遇到了同样的超时错误,因为 Telegram 机器人令牌在一段时间后过期。因此,我创建了一个新的 Telegram 机器人并使用了新的机器人令牌。

代码:

import logging
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    logger.info(f"Received /start command from user {update.effective_user.id}")
    await update.message.reply_text('Hello! I am your bot. How can I help you?')

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    logger.info(f"Received /help command from user {update.effective_user.id}")
    await update.message.reply_text('Help!')

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    logger.info(f"Received a message from user {update.effective_user.id}: {update.message.text}")
    await update.message.reply_text(update.message.text)

def main():
    BOT_TOKEN = '<bot_token>'
    if not BOT_TOKEN:
        logger.error("Bot token not found. Please set the BOT_TOKEN environment variable.")
        return

    application = ApplicationBuilder().token(BOT_TOKEN).build()
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CommandHandler("help", help_command))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))

    application.add_error_handler(lambda update, context: logger.error(f"Update {update} caused error {context.error}"))
    application.run_polling()

if __name__ == '__main__':
    main()

电报机器人输出:

enter image description here

本地输出:

enter image description here

Docker 镜像本地输出:

enter image description here

然后,我将映像推送到 Azure 容器注册表,如下所示。

enter image description here

使用容器注册表创建 Web 应用程序后,我将 BOT_TOKEN 添加到 Web 应用程序的环境变量中,如下所示。

BOT_TOKEN = <bot_token>

enter image description here

Azure Web 应用程序 Telegram 机器人输出:

enter image description here

Azure Web 应用程序日志流:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.