我有一个使用 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()
我尝试使用下面的示例代码将消息发送到 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()
电报机器人输出:
本地输出:
Docker 镜像本地输出:
然后,我将映像推送到 Azure 容器注册表,如下所示。
使用容器注册表创建 Web 应用程序后,我将 BOT_TOKEN 添加到 Web 应用程序的环境变量中,如下所示。
BOT_TOKEN = <bot_token>
Azure Web 应用程序 Telegram 机器人输出:
Azure Web 应用程序日志流: