在 webhooks 上部署电报机器人

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

我在 webhooks 上编写了一个电报机器人,使用了 aiogram 库版本 3.0.0rc2。在编写机器人时,我使用 ngrok 创建一个基本 url 并在 aiohttp 上编写了一个应用程序。

async def on_startup(bot: Bot) -> None:
    await bot.set_webhook(f"{BASE_WEBHOOK_URL}{WEBHOOK_PATH}")


def main():
    bot = Bot(TOKEN, parse_mode='HTML')
    dp = Dispatcher()

    dp.startup.register(on_startup)

    app = web.Application()

    webhook_requests_handler = SimpleRequestHandler(
        dispatcher=dp,
        bot=bot
    )

    webhook_requests_handler.register(app, path=WEBHOOK_PATH)
    setup_application(app, dp, bot=bot)
    web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT)


if __name__ == "__main__":
    main()

现在我有一个问题 - 我不知道如何部署这一切,我之前写了一个 tg 机器人,但我使用轮询并托管在 Railway 上,现在我的订阅已在那里结束,我无法购买,尽管我有点找出了这项特殊的服务。除此之外,我没有任何经验。我尝试了许多不同的服务,但我无法以任何方式启动机器人。 我也不知道应该使用哪个IP和端口 我尝试了渲染,但它不支持 aioram 3 也许我可以在那里手动上传 aiogram 在 python 3.7 上渲染我需要 python 3.11

python deployment hosting webhooks aiohttp
1个回答
0
投票

我不确定

Bot
是什么,因为您还没有包含导入内容。但阅读您的描述后,我了解到您想使用带有由
ngrok

隧道传输的 webhooks 的电报机器人

您需要两个并行运行的应用程序和一个 SSL 证书(您不必显式创建一个证书,因为

ngrok
使用由知名 CA 签名的证书)

  • 托管您的 webhook 的 API - 这将接收来自 Telegram API 的消息
  • 对 API 进行隧道传输的 Ngrok - 这将为 Telegram API 提供公共端点,以将消息发送到在本地主机上运行的 API

您可以使用 pyngrok 围绕它编写一个包装器,通过多重处理启动它,并使用单个入口点触发所有内容。

事情就是这样,我创建了一个完整的存储库作为概念证明,用于这个确切的目的(经过尝试和测试)

https://github.com/thevickypedia/telegram-webhook

我使用由

FastAPI
服务器运行的
uvicorn
作为我的 webhook,源代码支持任何隧道应用程序,如 ngrok 或其替代品。

您可以使用任何 API 或服务器来启动您的 Webhook。 我在测试过程中注意到的一个缺点是,有时当我使用

ngrok
替代方案(如 expose-localhost)时,我会遇到通过 DNS 解析的 IP 与实际隧道服务器的 IP 不同的问题。但幸运的是,Telegram API 接受
webhook_ip
作为其负载中的参数,以便您强制执行 IP,而不是依赖 DNS 解析。

我在编写 POC 时用作参考的链接

https://github.com/thevickypedia/telegram-webhook#references

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