Teams Bot App 代码解析

article/2025/10/7 8:06:41

上一篇文章我们讲了如何使用 teams toolkit 来快速弄一个 teams bot,可以看到 toolkit 给我们提供了极大的方便性,让开发人员可以更好的把重心放在 coding 上,而不是各种配置上。

那我们这篇文章主要接着上篇,来解析一下 teams bot 的代码,让各种更深入的了解它是怎么运作起来的。

我们先来看一下teams bot 的代码目录下的文件:

可以看到核心的代码文件也就两个 index.ts 和 teamsBot.ts,外加两个 adaptive card的json文件。

可能眼尖的读者已经看到一个没有见过的文件 env.teamsfx.local,这个文件实际上是运行之后生成出来的,里面放的是一些环境变量。里面最关键的是 BOT_ID 和 BOT_PASSWORD,这也是 teams toolkit 给我们带来的方便性。一般情况下,我们需要自己先创建出一个 bot,得到 bot id 和 bot password,但现在 teams toolkit帮我们都自动完成了。

# Following variables are generated by TeamsFx
BOT_ID=2faecc33-2711-40f6-9681-1260b04ebeb4
BOT_PASSWORD=<<passord>>
M365_CLIENT_ID=
M365_CLIENT_SECRET=
M365_TENANT_ID=
M365_AUTHORITY_HOST=
INITIATE_LOGIN_ENDPOINT=
API_ENDPOINT=
M365_APPLICATION_ID_URI=

我们再来看一下整个程序的入口 index.ts 文件,由于整个文件有点过于繁杂,我简化了一下,帮我们更好的理解代码结构。

const adapter = new BotFrameworkAdapter({appId: process.env.BOT_ID,appPassword: process.env.BOT_PASSWORD,
});...const bot = new TeamsBot();// Create HTTP server.
const server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, () => {...
});// Listen for incoming requests.
server.post("/api/messages", async (req, res) => {await adapter.processActivity(req, res, async (context) => {await bot.run(context);});
});

经过简化,我相信对于有 nodejs 开发经验的读者,代码的逻辑已经是一目了然,先创建了一个 bot adapter,这里就用到了刚才的 bot id 和 password。

然后创建了一个 bot,它是 TeamsBot 的一个实例,TeamsBot 是在另一个文件中定义的,我们等会儿讲到那个文件。

之后就创建了一个 http server,监听 3978 端口,这个端口实际上是 ngrok 重定向的端口,也就是说 teams 把请求发送给公网的ngrok网址,ngrok把请求转发给了我们本地的 3978 端口。

最后就是当 http request 是发送给 POST /api/messages 这个 endpoint 的话,就调用 adapter 的 processActivity() 来处理,adapter 的作用就是根据 activity 来产生一个 TurnContext 的对象 context,然后交由 bot 来处理 bot.run(context),bot 的逻辑在 teamsBot.ts 文件中。

那我们现在来看一下简化后的 teamsBot.ts

import rawWelcomeCard from "./adaptiveCards/welcome.json";
import rawLearnCard from "./adaptiveCards/learn.json";export class TeamsBot extends TeamsActivityHandler {constructor() {super();this.onMessage(async (context, next) => {let txt = context.activity.text;switch (txt) {case "welcome": {const card = AdaptiveCards.declareWithoutData(rawWelcomeCard).render();await context.sendActivity({ attachments: [CardFactory.adaptiveCard(card)] });break;}case "learn": {this.likeCountObj.likeCount = 0;const card = AdaptiveCards.declare<DataInterface>(rawLearnCard).render(this.likeCountObj);await context.sendActivity({ attachments: [CardFactory.adaptiveCard(card)] });break;}}await next();});}...

我们可以看到 TeamsBot 实现了 TeamsActivityHandler,在构造函数里,定义了当收到一个 message 之后的处理逻辑。

先从 message 里获取到用户发送的文字,当文字是 “welcome” 时,回复 rawWelcomeCard,这实际上是在 ./adaptiveCards/welcome.json 里定义的,当文字是 “learn” 时,回复 rawLearnCard,这实际上是在 ./adaptiveCards/learn.json 里定义的。

那让我们打开 welcome.json 文件看看,实际上 adaptive card 的 json 有时候不太容易知道这个card显示出来到底是怎么样的,好在 adaptive card/teams 团队为我们开发了一个 vscode 插件,如下图所示,先点击 “Preview and Debug Adaptive Cards”,然后点击 “Install” 来安装 “Adaptive Card Studio” 插件。

稍等几秒钟,等插件安装完毕后,就可以预览到 welcome card 了

我们分析了代码后,再来看看 bot 的运行结果,当我们发送 welcome 消息给 bot,bot就回复我们 welcome 的卡片了,和我们在 vscode 里预览看到的卡片一样。当我们发送 learn 消息时,我们就收到了 learn 的卡片。

我们下篇文章会详细分析 learn 卡片,因为 learn 卡片里有一些用户交互,可以让我们更好的理解 teams bot app 的运行机制。


http://chatgpt.dhexx.cn/article/QlCjgtQc.shtml

相关文章

代码分析(一)

2021SCSDUSC 分析前言 对于APIJSON的代码分析首先就是&#xff0c;看一下该项目的作用以及如何进行&#xff0c;看一下原来不部署这个项目的正常流程&#xff1a; 再来看一下部署上APIJSON后项目的流程走向&#xff1a; 接下来开始按照这个流程对相应的代码进行分析。 Abst…

Linux命令之lsusb

一、lsusb命令用于显示本机的USB设备列表&#xff0c;以及USB设备的详细信息。 二、lsusb命令显示的USB设备信息来自“/proc/bus/usb”目录下的对应文件。 三、Linux从/var/lib/usbutils/usb.ids识别USB设备的详细信息。 语法格式 lsusb [参数] 常用参数&#xff1a; -v显…

Linux命令-磁盘管理-lsusb

1 需求 2 语法 C:\>adb shell lsusb --help Toybox 0.8.4-android multicall binary: https://landley.net/toybox (see toybox --help)usage: lsusbList USB hosts/devices. 3 示例 adb shell lsusb 4 参考资料

嵌入式debian没有lsusb命令解决

问题 -bash: lsusb: command not found 解决

linux之lsusb命令和cd -命令使用总结

1、lsusb命令介绍 使用 lsusb 来列出 USB 设备和它的属性,lsusb 会显示驱动和内部连接到你系统的设备。直接在控制台输入 lsusb 即可 2、lsusb简单使用 在控制台输入 lsusb 效果如下 系统中同时使用了 USB 2.0 root hub 驱动和 USB 3.0 root hub 驱动。 bus 002 指明设备…

LSB

知识点 LSB即为最低有效位&#xff08;Least Significant Bit&#xff0c;lsb&#xff09;&#xff0c;这里百度了一下&#xff1a;图片中的图像像素一般是由RGB三原色&#xff08;红绿蓝&#xff09;组成&#xff0c;每一种颜色占用8位&#xff0c;取值范围为0x00~0xFF&#…

lsusb命令-在系统中显示有关USB设备信息

在 中我们使用lsusb 列出USB设备及其属性&#xff0c;lsusb用于显示系统中的USB总线及其连接的设备信息。下面介绍如何安装并使用。 系统环境 7 安装usbutils 默认Centos7系统中没有lsusb &#xff0c;我们需要安装usbutils安装包&#xff0c;才能使用lsusb&#xff1a; […

LSF-bsub命令

文章目录 一、LSF(load sharing facility)二、bsub命令三、 常用命令3.1 bhosts3.2 bqueues3.3 bjobs3.4 bkill3.5 bhist3.6 busers 一、LSF(load sharing facility) 分布资源管理的工具&#xff0c;用来调度、监视、分析联网计算机的负载。 目的&#xff1a;通过集中监控和调…

Linux下的lsusb命令详解

lsusb命令详解 参考&#xff1a; 1、https://zhuanlan.zhihu.com/p/142403866 2、https://blog.csdn.net/phmatthaus/article/details/124198879 简介 ​USB&#xff0c;是英文Universal Serial Bus&#xff08;通用串行总线&#xff09;的缩写&#xff0c;是一个外部总线标…

详解 lsusb命令

USB设备检测的一般过程 USB设备检测也是通过/proc目录下的USB文件系统进行的。为了使一个USB设备能够正常工作&#xff0c;必须要现在系统中插入USB桥接器模块。在检测开始时&#xff0c;一般要先检测是否存在/proc/bus/usb目录&#xff0c;若不存在则尝试插入USB桥接模块。 现…

lsusb

1.lsusb查看系统的USB设备 $ lsusb Bus 001 Device 006: ID 0951:1666 Kingston Technology Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 004: ID 0e0f:0008 VMware, Inc. Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB H…

Linux常用命令——lsusb命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) lsusb 显示本机的USB设备列表信息 补充说明 lsusb命令用于显示本机的USB设备列表&#xff0c;以及USB设备的详细信息。 lsusb命令是一个学习USB驱动开发&#xff0c;认识USB设备的助手&#xff0c;推荐大家使用…

Linux下lsusb命令详解

Linux下lsusb命令详解 参考链接&#xff1a;https://zhuanlan.zhihu.com/p/142403866 ​ USB&#xff0c;是英文Universal Serial Bus&#xff08;通用串行总线&#xff09;的缩写&#xff0c;是一个外部总线标准&#xff0c;早期用于规范电脑与外部设备的连接和通讯。 ​ U…

[Kong 与 Konga 与 Postgres数据库] 之 Kuberneres 部署

1、Kong的概述 Kong是一个clould-native、快速的、可扩展的、分布式的微服务抽象层&#xff08;也称为API网关、API中间件或在某些情况下称为服务网格&#xff09;框架。Kong作为开源项目在2015年推出&#xff0c;它的核心价值是高性能和可扩展性。Kong被广泛用于从初创企业到全…

Konga arm64 安装

arm64 平台&#xff1a; 一、源码安装 konga 前提&#xff1a;安装nodejswget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-arm64.tar.xztar -xf node-v12.16.1-linux-arm64.tar.xz 配置node环境变量&#xff1a;vi /etc/profileexport NODE_HOME/home/node-v12.16…

kong/kongA docker部署+汉化

部署完成后界面 一、部署kong/kongA 1、创建一个自定义 Docker 网络以允许容器相互发现和通信&#xff1a; docker network create kong-net 2、启动一个 PostgreSQL 容器&#xff1a; sudo docker run -d --name kong-database \--networkkong-net \-v /opt/pgdata:/var/l…

konga--添加service和rouce详细步骤

注意&#xff1a;先有service后&#xff0c;才能创建rouce(可以有多个),包括删除顺序先删除route&#xff0c;再删除service。次序问题 1.添加service 是抽象层面的服务&#xff0c;他可以直接映射到一个物理服务 (host 指向 ip port)&#xff0c;也可以指向一个 upstream 来…

kong及konga的最新版本安装

1、创建docker网络 docker network create kong-net 2、运行postgresql的数据库 挂载 # docker volume create kong-volume # docker run -d --name kong-database \ --networkkong-net \ -p 5432:5432 \ -v kong-volume:/var…

使用Kong和Konga管理微服务和API

Kong是Mashape开源的高性能高可用API网关和API服务管理层。自2015年在github开源后&#xff0c;广泛受到关注。它基于OpenResty&#xff0c;进行API管理&#xff0c;并提供了插件实现API的AOP。Kong在Mashape 管理了超过15,000 个API&#xff0c;为200,000开发者提供了每月数十…

docker安装nginx kong konga

一、docker安装nginx 1. 外网直接拉取&#xff0c;拉取后跳转至第三步 docker pull nginx:1.23.3 2. 内网 &#xff08;1&#xff09;找一个外网电脑拉取镜像 docker pull nginx &#xff08;2&#xff09;将镜像打包为tar包 docker save -o nginx-1.23.3.tar nginx:1.23.3…