使用node.js构建天气和时间电报机器人
#node #telegram #bot

Telegram bot是在电报中运行的自动化应用程序。用户可以通过发送消息,命令和内联请求来与机器人进行交互。今天,我们将带您浏览如何使用Node.js构建简单的电报机器人,该node.js为任何城市提供天气和时间信息。

先决条件

我们开始之前,请确保您有以下内容:

  • Node.js和NPM安装在您的计算机上。
  • 一个电报帐户来创建和管理机器人。
  • openweathermap的API键。

设置您的项目

首先,安装所需的node.js软件包:**dotenv****node-telegram-bot-api****axios****moment-timezone**

npm install dotenv node-telegram-bot-api axios moment-timezone
  • **dotenv**:处理环境变量。
  • **node-telegram-bot-api**:与电报bot api互动。
  • **axios**:向OpenWeatherMap API提出HTTP请求。
  • **moment-timezone**:处理时间和时区。

创建机器人

您需要电报中的机器人令牌。使用BotFather创建一个新的机器人并获取令牌。将令牌和您的OpenWeatherMap api键保存在**.env**文件中:

TELEGRAM_BOT_TOKEN=your_telegram_bot_token
OPENWEATHERMAP_API_KEY=your_openweathermap_api_key

Image description

在您的主javascript(app.js)文件中,初始化机器人和存储对象:

require('dotenv').config()

const TelegramBot = require('node-telegram-bot-api')
const axios = require('axios')
const moment = require('moment-timezone')

const TELEGRAM_BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN
const OPENWEATHERMAP_API_KEY = process.env.OPENWEATHERMAP_API_KEY

const bot = new TelegramBot(TELEGRAM_BOT_TOKEN, { polling: true })
const storage = {}

**storage**对象将跟踪与每个用户的对话状态。

处理命令和回调查询

接下来,处理**/start**命令,并向用户提供两个选项:获取天气或时间。我们为此使用内联键盘:

bot.onText(/\/start/, (msg) => {
  const chatId = msg.chat.id
  bot.sendMessage(
    chatId,
    'Hello! This bot can show you the weather and time for any city. To use it, please choose an option below:',
    {
      reply_markup: {
        inline_keyboard: [
          [{ text: 'Get Weather', callback_data: 'get_weather' }],
          [{ text: 'Get Time', callback_data: 'get_time' }],
        ],
      },
    }
  )
})

然后,该机器人聆听按钮按下,并要求用户输入城市名称:

bot.on('callback_query', async (callbackQuery) => {
  const chatId = callbackQuery.message.chat.id
  const data = callbackQuery.data

  switch (data) {
    case 'get_weather':
      const userDataWeather = getUserData(chatId)
      userDataWeather.waitingForCity = true
      userDataWeather.waitingForWeather = true
      bot.sendMessage(chatId, 'Please enter the name of the city or send /stop to cancel:')
      break
    case 'get_time':
      const userDataTime = getUserData(chatId)
      userDataTime.waitingForCity = true
      userDataTime.waitingForTime = true
      bot.sendMessage(chatId, 'Please enter the name of the city or send /stop to cancel:')
      break
    default:
      break
  }
})

处理用户响应

**getUserData**功能初始化或从**storage**对象检索用户的状态:

function getUserData(chatId) {
  let userData = storage[chatId]
  if (!userData) {
    userData = {
      waitingForCity: false,
      waitingForWeather: false,
      waitingForTime: false,
    }
    storage[chatId] = userData
  }
  return userData
}

然后,机器人聆听用户的消息,这应该是城市的名称:

bot.on('message', async (msg) => {
  const chatId = msg.chat.id
  const text = msg.text

  const userData = getUserData(chatId)
  if (userData && userData.waitingForCity) {
    const city = text
    let messageText = ''
    if (userData.waitingForWeather) {
      messageText = await getWeatherData(city)
    } else if (userData.waitingForTime) {
      messageText = await getTimeData(city)
    }
    bot.sendMessage(chatId, messageText)
    resetUserData(chatId)
  }
})

我们在发送响应后重置用户数据,因此该机器人已准备好用于下一个命令。 **resetUserData**功能看起来像这样:

function resetUserData(chatId) {
  const userData = getUserData(chatId)
  userData.waitingForCity = false
  userData.waitingForWeather = false
  userData.waitingForTime = false
}

获取天气和时间数据

**getWeatherData**功能从OpenWeatherMap API获取天气数据:

async function getWeatherData(city) {
  const response = await axios.get(
    `http://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${OPENWEATHERMAP_API_KEY}`
  )
  const weatherData = response.data
  const weatherDescription = weatherData.weather[0].description
  const temperature = Math.round(weatherData.main.temp - 273.15)
  const messageText = `The weather in ${city} is currently ${weatherDescription} with a temperature of ${temperature}°C.`
  return messageText
}

使用Moment timeZone:

async function getTimeData(city) {
  const response = await axios.get(
    `http://api.geonames.org/timezoneJSON?formatted=true&lat=${city.lat}&lng=${city.lon}&username=demo&style=full`
  )
  const data = response.data
  const localTime = data.time
  const messageText = `The current time in ${city} is ${localTime}.`
  return messageText
}

运行机器人

更新您的package.json文件以运行机器人:

  "scripts": {
    "start": "node app.js"
  },

在终端上运行命令:

npm start

在电报应用程序上打开机器人进行测试:

DEMO: Telegram Bot - YouTube

这个简单的电报机器人使用OpenWeathMap API和时机库为给定的城市提供了天气和时间信息。

favicon youtube.com

总结

这个简单的机器人是探索电报bot和node.js功能的有趣方式。该机器人可以通过多种方式扩展,例如支持更多命令,集成更多的API或添加更复杂的对话状态。

记住要正确保护您的API键和令牌。切勿将它们暴露在您的代码或版本控制系统中。而是使用环境变量或某种形式的安全秘密管理。

GitHub logo achingachris / telegram-helper

一个告诉您时间和天气的电报机器人

Telegram Bot(JavaScript) - Weather and Time Telegram Bot

This is a simple Telegram bot that provides weather and time information for a given city using the OpenWeatherMap API and the Moment Timezone library.

Table of Contents

  1. Features
  2. Getting Started
  3. Usage
  4. Environment Variables
  5. Dependencies
  6. License

功能

  • 检索给定城市的天气信息。
  • 检索特定城市的当前时间。

入门

要开始此项目,请按照以下步骤操作:

  1. 将存储库克隆到您的本地机器。
  2. 使用npm install安装所需的依赖项。
  3. 设置所需的环境变量(请参阅Environment Variables)。
  4. 使用node index.js运行机器人。

用法

要使用机器人,请按照以下步骤:

  1. 通过发送/start命令启动机器人。
  2. 通过单击“获得天气”或“获取时间”来选择一个选项。
  3. 提示时输入城市的名称。
  4. 机器人将返回天气或时间信息

快乐编码!