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
在您的主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
在电报应用程序上打开机器人进行测试:
总结
这个简单的机器人是探索电报bot和node.js功能的有趣方式。该机器人可以通过多种方式扩展,例如支持更多命令,集成更多的API或添加更复杂的对话状态。
记住要正确保护您的API键和令牌。切勿将它们暴露在您的代码或版本控制系统中。而是使用环境变量或某种形式的安全秘密管理。
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
功能
- 检索给定城市的天气信息。
- 检索特定城市的当前时间。
入门
要开始此项目,请按照以下步骤操作:
- 将存储库克隆到您的本地机器。
- 使用
npm install
安装所需的依赖项。 - 设置所需的环境变量(请参阅Environment Variables)。
- 使用
node index.js
运行机器人。
用法
要使用机器人,请按照以下步骤:
- 通过发送
/start
命令启动机器人。 - 通过单击“获得天气”或“获取时间”来选择一个选项。
- 提示时输入城市的名称。
- 机器人将返回天气或时间信息
快乐编码!