使用 Azure Functions 和 Node.js 构建 Telegram Bot





5.00/5 (3投票s)
如何使用 Azure Functions 和 Node.js 构建 Telegram Bot
流程回顾
- 用户向 Telegram Bot 发送任何消息。
- Telegram 通过 Webhook 将请求发送到我们的 Azure Function。
- Azure Function 以复制的消息回复 Webhook。
必备组件
- node.js - v10.16.2
- npm - v6.14.5
- telegraf - v3.38.0
- ngrok - v2.3.35
- Azure 订阅
- 您需要将 Azure Functions 扩展 安装到 Visual Studio Code。
在 Visual Studio Code 中创建 Azure Function
- 点击 Visual Studio Code 中的 Azure 图标
使用您的 Azure 订阅登录。
- 点击“创建 Function 图标”
- 系统会询问您是使用现有项目还是创建新项目。我们来创建一个新项目。
- 选择 Function 模板。我们将使用 HTTP 触发器。
- 提供一个 Function 名称,然后按 **Enter**。
- 请输入一个 **Function** 密钥用于 Function 授权。
- 倒数第二步。选择您想要打开项目的方式。我们将使用当前窗口。
- 您将被重定向到带有 JavaScript 代码的默认 HTTP 触发器 Function。
- 现在,此 Function 将出现在 Azure Functions 部分。
文件夹结构
- package.json - 与 Node.js 项目相关的元数据
- proxies.json - 您可以修改来自 Function 的请求和响应。
- host.json - 与 Azure 项目相关的元数据文件。它是应用程序中所有 Function 的全局配置。
azure-bot-cloud-function
- 这是我们的 Function 文件夹。每个 Function 都有一个单独的文件夹,包含代码文件(在本例中为 .js)和 function.json。Function.json 是一个 绑定配置文件。
本地运行 Function
-
在 Visual Studio Code 菜单中,选择 **运行** -> **开始调试**。
-
如果您本地没有 Azure Functions Core Tools,则需要在此步骤安装它们。说明可在 Azure 仓库 中找到:
-
您应该会看到 NPM 任务如何执行,并最终获得一个工作 Function 的链接。
-
让我们在浏览器中打开我们的 Function。
-
如您所见,Function 以默认行为回复我们。此外,您也可以使用
func start
命令简单地运行 Function。
实现 Bot
为了处理 Telegram API,我们将使用 Node.js 最流行的库 - Telegraf.js。我们需要在项目文件夹中安装它。
npm install telegraf --save
运行上述命令后,请确保 package.json 中包含 Telegraf。
因为 Telegram 会向我们的 Bot 发送 webhook 请求,所以我们需要一个外部 HTTPS URL。为此,我们可以使用 ngrok 库。
npm install ngrok -g
如果一切顺利,我们可以进入 <function-folder>/index.js 并创建一个简单的 Echo-bot。
const Telegraf = require('telegraf')
const { TELEGRAM_BOT_TOKEN, WEBHOOK_ADDRESS } = process.env
const bot = new Telegraf(TELEGRAM_BOT_TOKEN, {telegram: { webhookReply: true }})
bot.telegram.setWebhook(WEBHOOK_ADDRESS)
bot.on('message', (ctx) => ctx.telegram.sendCopy
(ctx.chat.id, ctx.message))module.exports = async function (context, req) {
return bot.handleUpdate(req.body, context.res) }
您可以在 BotFather 机器人 中获取 TELEGRAM_BOT_TOKEN
值。WEBHOOK_ADDRESS
将包含 Azure Function 的链接。我们稍后会讨论这个变量。
我们的 Bot 将在 Webhook 模式下运行 - 这是运行 Telegram Bot 的更优选方式。Telegram 会自动通知我们的 Bot 所有更新。在轮询机制中,我们的 Bot 需要频繁地向 Telegram 查询更新,因此它需要我们的 Bot 不间断地运行(大多数情况)。
本地运行 Bot
要本地运行此 Bot,我们需要使用 ngrok
创建一个公共地址。默认情况下,本地 Azure Function 运行在端口 7071 上。我们可以在终端中使用以下组合来创建一个公共 URL:
ngrok http 7071
在终端中,您将获得用于测试 Webhook 的 HTTPS 链接。
复制 ngrok 创建的链接
并添加 Function 的路由。类似这样:
bot.telegram.setWebhook('https://<random-value>.ngrok.io/api/azure-bot-cloud-function')
另外,请不要忘记将真实的 Telegram 令牌传递给 Telegraf 构造函数。
const bot = new Telegraf('some-token-value', { telegram: { webhookReply: true }, })
这很粗糙,但对于快速测试来说是 **可以的**,所以请记住从代码中删除所有真实的密钥。
然后您可以使用简单的命令来运行 Function。
func start
干得好!现在在 Telegram 中打开您的 Bot 并发送任何消息。我们的 Bot 应该会复制它并重新发送给您。
将 Azure Function 部署到门户
要部署 Azure Function,我们只需点击此按钮。
然后选择您的资源并按“部署”。过程将开始。
成功部署后,我们需要转到 Azure 门户并使用实际值更新 WEBHOOK_ADDRESS
和 TELEGRAM_BOT_TOKEN
变量。
要获取实际的 Function URL,请转到“Functions”,然后选择您的 Azure Function 并按“获取 Function URL”按钮。
我们需要复制此值并将其与 Telegram 令牌一起粘贴到应用程序设置中。
添加我们的密钥后,按“保存”并重新启动我们的应用程序。
就是这样! 我们的 Bot 应该可以在云中运行,您可以实时跟踪所有 Function 的执行情况。
每次 Function 执行都意味着我们的 Bot 处理了一条消息。
结论
在本教程中,我们创建了一个带有简单 Echo-Bot 的 Azure Function 来与 Telegram 交互。Azure Functions 是托管您 Bot 的绝佳方式。您的收费将按照简单公式计算:(内存大小)X(执行时间(毫秒))X(每月执行次数),同时请记住,前 400,000 GB/s 的执行和 1,000,000 次执行是免费的。如果您需要估算定价成本,可以使用 此定价计算器。
历史
- 2020年7月22日:初始版本