65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2020年7月22日

CPOL

4分钟阅读

viewsIcon

21222

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

流程回顾

  1. 用户向 Telegram Bot 发送任何消息。
  2. Telegram 通过 Webhook 将请求发送到我们的 Azure Function。
  3. 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

  1. 点击 Visual Studio Code 中的 Azure 图标

    Azure Icon in VSC

    使用您的 Azure 订阅登录。

  2. 点击“创建 Function 图标

    Create Function Icon

  3. 系统会询问您是使用现有项目还是创建新项目。我们来创建一个新项目。

    Create a new project

    Create new project folder

  4. 选择 Function 模板。我们将使用 HTTP 触发器。

    Choose a Function Template

  5. 提供一个 Function 名称,然后按 **Enter**。

    Enter the name of the function

  6. 请输入一个 **Function** 密钥用于 Function 授权。

    Function Authorization level

  7. 倒数第二步。选择您想要打开项目的方式。我们将使用当前窗口。

    How to open a function project in Visual Studio Code

  8. 您将被重定向到带有 JavaScript 代码的默认 HTTP 触发器 Function。

    The default function Code

  9. 现在,此 Function 将出现在 Azure Functions 部分。

    Newly created function

文件夹结构

Function Folder Structure

  • package.json - 与 Node.js 项目相关的元数据
  • proxies.json - 您可以修改来自 Function 的请求和响应。
  • host.json - 与 Azure 项目相关的元数据文件。它是应用程序中所有 Function 的全局配置。
  • azure-bot-cloud-function - 这是我们的 Function 文件夹。每个 Function 都有一个单独的文件夹,包含代码文件(在本例中为 .js)和 function.jsonFunction.json 是一个 绑定配置文件

本地运行 Function

  1. 在 Visual Studio Code 菜单中,选择 **运行** -> **开始调试**。

  2. 如果您本地没有 Azure Functions Core Tools,则需要在此步骤安装它们。说明可在 Azure 仓库 中找到:

    Install Azure Function Core Tools

  3. 您应该会看到 NPM 任务如何执行,并最终获得一个工作 Function 的链接。

    Link to the local Azure function

  4. 让我们在浏览器中打开我们的 Function。

    Azure Function is working locally

  5. 如您所见,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 链接。

HTTPS public URL using ngrok

复制 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

Azure Functions is running locally

干得好!现在在 Telegram 中打开您的 Bot 并发送任何消息。我们的 Bot 应该会复制它并重新发送给您。

Echo-Bot example

将 Azure Function 部署到门户

要部署 Azure Function,我们只需点击此按钮。

Deploy Azure Function

然后选择您的资源并按“部署”。过程将开始。

The process of deploying Azure Function

成功部署后,我们需要转到 Azure 门户并使用实际值更新 WEBHOOK_ADDRESSTELEGRAM_BOT_TOKEN 变量。

要获取实际的 Function URL,请转到“Functions”,然后选择您的 Azure Function 并按“获取 Function URL”按钮。

How to get Azure Function URL

我们需要复制此值并将其与 Telegram 令牌一起粘贴到应用程序设置中。

Application Settings in Azure

添加我们的密钥后,按“保存”并重新启动我们的应用程序。

Restart Azure application

就是这样! 我们的 Bot 应该可以在云中运行,您可以实时跟踪所有 Function 的执行情况。

Azure Dashboard

每次 Function 执行都意味着我们的 Bot 处理了一条消息。

结论

在本教程中,我们创建了一个带有简单 Echo-Bot 的 Azure Function 来与 Telegram 交互。Azure Functions 是托管您 Bot 的绝佳方式。您的收费将按照简单公式计算:(内存大小)X(执行时间(毫秒))X(每月执行次数),同时请记住,前 400,000 GB/s 的执行和 1,000,000 次执行是免费的。如果您需要估算定价成本,可以使用 此定价计算器

历史

  • 2020年7月22日:初始版本
© . All rights reserved.