我在 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
我不确定
Bot
是什么,因为您还没有包含导入内容。但阅读您的描述后,我了解到您想使用带有由 ngrok
隧道传输的 webhooks 的电报机器人
您需要两个并行运行的应用程序和一个 SSL 证书(您不必显式创建一个证书,因为
ngrok
使用由知名 CA 签名的证书)
您可以使用 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