TON:编译命令驱动的TGBot界面
🥝

TON:编译命令驱动的TGBot界面

 
在本节中我将创建一个新的项目——一个聊天机器人。一般来说需要先编写一个在服务器上运行的脚本,并使用API密钥连接到Telegram服务器,通过脚本可以从Telegram服务器获取更新消息,并代表你的聊天机器人触发新消息。基本上,这是一个独立的应用程序。
由于我们已经部署了智能合约——它类似于我们dapp的后端。然后创建了一个网页界面,任何人在网上都可以访问并与其互动。接着,我们创建了一个TWA(Telegram网页应用),并将其嵌入到Telegram中。现在,我要编写一个脚本来控制和编程这个对话:提供键盘、询问一些问题,然后根据答案触发某些操作。当然,还需要与TON区块链互动。
 
开始准备
通过创建一个新的目录并进入该目录来启动新项目:
mkdir first_contract_tg_bot cd first_contract_tg_bot
然后设置一个新的包:
yarn init
接下来安装一些必要的库。继续使用TypeScript,因此首先安装用于Node.js的TypeScript及其相关类型文件,并使用swc/core来将TypeScript编译为JavaScript:
yarn add typescript ts-node @types/node @swc/core --dev
在这里,创建一个名为tsconfig.json的配置文件,并添加如下内容:
{ "compilerOptions": { "target": "es2020", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "resolveJsonModule": true}, "ts-node": { "transpileOnly": true, "transpiler": "ts-node/transpilers/swc" } }
该配置文件定义了TypeScript的编译选项和配置。
当前项目是空的。安装一个新的SDK来帮助我们与聊天机器人API交互。我建议使用名为Telegraf的SDK:
yarn add telegraf
在安装的同时可以回顾一下Telegraf的文档。Telegraf使用起来非常简单,即使你要创建复杂的聊天机器人,它也很方便。
编写聊天机器人代码
Telegraf安装完毕后,在项目根目录下创建一个src文件夹,并在其中创建一个index.ts文件。接着,立即在package.json中创建一个脚本,并从命令行运行代码:
{ "name": "first_contract_tg_bot", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "@swc/core": "^1.3.42", "@types/node": "^18.15.9", "ts-node": "^10.9.1", "typescript": "^5.0.2" }, "dependencies": { "telegraf": "^4.12.2" }, "scripts": { "start": "ts-node ./src/index.ts" } }
这个脚本将使用ts-node来运行我们在index.ts中编写的代码。让我们来看一个示例,首先,需要以TypeScript的方式导入Telegraf:
import { Telegraf } from "telegraf";
接下来,初始化一个机器人实例。我们创建一个Telegraf实例:
const bot = new Telegraf(' ');
第一个参数是令牌。当我们使用BotFather API时,已经看到过这个令牌。回到那里,找到自己的令牌,并将其复制到本地以初始化这个机器人实例:
const bot = new Telegraf("你的令牌");
在开发聊天机器人时,通常会设置两个实例,一个用于测试,一个用于生产。因此,我们将使用环境变量来区分这些令牌。在src文件夹中,我们创建一个名为.env的新文件,用于记录不要提交到代码库的变量。我们称之为TG_BOT_TOKEN,并在.env文件中以该变量开头:
TG_BOT_TOKEN=你的令牌
有一个名为dotenv的库可以帮助我们处理这些变量,让我们安装它:
yarn add dotenv
安装完成后可以从index.ts文件中访问它:
const bot = new Telegraf(process.env.TG_BOT_TOKEN!);
首先,配置dotenv并导入它。在文件的开头添加以下内容:
import dotenv from "dotenv"; dotenv.config();
这个变量可能是未定义的,但它实际上是在.env文件中定义的。如果不存在,初始化Telegraf实例将会失败。
好,现在让我们看看启动机器人后的示例代码:
bot.start((ctx) => ctx.reply("欢迎使用计数器应用!", { reply_markup: { keyboard: [ ["增加5"], ["存入1 TON"], ["提取0.7 TON"], ], }, }) );
这段代码将创建一个带有三个按钮的自定义键盘,用户点击后会触发相应的操作。

与TON区块链交互

接下来,安装与TON交互所需的库:
yarn add ton-core ton-crypto
我们将使用这些库生成与TON区块链交互的链接。例如,当用户选择“增加5”时可以生成一个支付链接,用户点击后会被引导到Tonhub完成支付。
代码如下:
import { Address, beginCell, toNano } from "ton-core"; import qs from "qs"; bot.hears("增加5", (ctx) => { const msg_body = beginCell() .storeUint(1, 32) .storeUint(5, 32) .endCell(); let link = `https://test.tonhub.com/transfer/${process.env.SC_ADDRESS}?${qs.stringify({ text: "简单测试交易", amount: toNano("0.05").toString(10), bin: msg_body.toBoc({ idx: false }).toString("base64"), })}`; ctx.reply("要增加计数器5,请签署交易:", { reply_markup: { inline_keyboard: [ [{ text: "签署交易", url: link }] ] } }); });
我们还可以为“存入1 TON”和“提取0.7 TON”分别编写类似的代码,来与智能合约进行交互。