今天,我们将开发一个基于node js的电报机器人,该机器人可以显示所有国家/地区感染的冠状病毒的统计信息。
首先,您需要在电报联系人列表中添加@botFather并将其写入/ newBot命令。接下来,我们设置机器人的名称,如果不繁忙,我们将提供一个机器人标识符,通过它可以找到它。
到此为止,我们的电报机器人已经准备好,并且botfather已经与我们共享了Token API,这将使我们能够控制该机器人。
接下来,创建一个新项目,输入npm init并添加将在其中开发我们的机器人的bot.js文件。
然后,我将安装telegraf-这是用于创建电报bot的流行框架之一。我们查看电报文档,将初始bot设置复制到我们的项目中,然后快速完成示例中指示的所有方法:
const { Telegraf } = require('telegraf')
const bot = new Telegraf(process.env.BOT_TOKEN) // , botFather
bot.start((ctx) => ctx.reply('Welcome')) // /start
bot.help((ctx) => ctx.reply('Send me a sticker')) // /help
bot.on('sticker', (ctx) => ctx.reply('')) //bot.on , ,
bot.hears('hi', (ctx) => ctx.reply('Hey there')) // bot.hears , - "hi"
bot.launch() //
将api令牌放入我们的示例和zapuctim机器人中。
node bot
让我们检查一下我们的机器人的工作:
现在让我们找出ctx中的内容
。为此,在声明了bot常量之后,我们可以使用log:
ctx.message.from.first_name
重新启动我们的项目,输入/ start命令,然后在控制台中,我们将获得一个对象,可以在其中查看必要的用户数据:
{
"update_id": 375631294,
"message": {
"message_id": 11,
"from": {
"id": 222222,
"is_bot": false,
"first_name": "",
"username": "Evgenii",
"language_code": "ru"
},
"chat": {
"id": 386342082,
"first_name": "",
"username": "Evgenii",
"type": "private"
},
"date": 1593015188,
"text": "/start",
"entities": [
{
"offset": 0,
"length": 6,
"type": "bot_command"
}
]
}
}
我们将对message对象感兴趣,从中可以获取用户名
ctx.message.from.first_name
和他发送给机器人的文字:
ctx.message.text
我们知道ctx的含义,现在我们可以开始连接第三方api,通过它可以获取有关冠状病毒的统计信息。为此,我将使用一个名为covid19-api的库。让我们将其安装到我们的项目中,并将其导入到bot.js文件中:
const covidApi = require('covid19-api')
接下来,我们将删除贴纸处理程序,并创建一个新处理程序,该处理程序使用covid19-api文档中的getReportsByCountries方法来跟踪文本并发送请求以获取冠状病毒数据:
bot.on('text', async ctx => {
const covidData = await covidApi.getReportsByCountries(ctx.message.text) //
ctx.reply(covidData) //
})
让我们检查一下我们得到的数据。例如,让我们在电报中写给我们的机器人:“俄罗斯”:
太好了,我们有很多数据。但是,如果我们用错字输入国家名称,我们的机器人将停止工作并向控制台显示错误:
为避免这种情况,我们需要创建一个错误处理程序,并通知用户该国家不存在。我们还将对代码进行少量重构,使我们的机器人更加友好,更改/ start命令发送的消息的输出,设置统计数据的正确显示并在一个单独的文件中创建一个常量,该常量将包含所有英语国家的列表并将显示该常量使用/ help命令时。
结果,我们得到了代码:
const { Telegraf } = require('telegraf');
const covidApi = require('covid19-api');
const COUNTRIES_LIST = require('./const')
const bot = new Telegraf('1170363720:AAFJ4ALJebB8Luh5kt1DStmYYqV3TparhKc')
bot.start( ctx => ctx.reply(`
${ctx.from.first_name}!
.
.
/help."
`))
bot.help( ctx => ctx.reply(COUNTRIES_LIST)) // covid19-api
bot.on('text', async (ctx) => {
try {
const userText = ctx.message.text
const covidData = await covidApi.getReportsByCountries(userText)
const countryData = covidData[0][0]
const formatData = `
: ${countryData.country},
: ${countryData.cases},
: ${countryData.deaths},
: ${countryData.recovered}`
ctx.reply(formatData)
} catch(e) {
ctx.reply(' , /help')
}
})
bot.launch()
哪个可以根据需要工作:
恭喜你!我们已经完成了电报bot的配置,该配置可显示冠状病毒患者的统计数据。