使用node.js编写电报机器人

完整的代码可以在这里找到



今天,我们将开发一个基于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的配置,该配置可显示冠状病毒患者的统计数据。



All Articles