当前位置: 首页 > article >正文

别再只会用BotFather了!用Python-telegram-bot库给你的Telegram机器人加个‘天气查询’功能(附完整代码)

用Python-telegram-bot打造智能天气机器人从基础到高阶实战Telegram机器人早已超越了简单的自动回复工具成为开发者实现个性化服务的利器。今天我们将突破BotFather的基础教学带您开发一个真正实用的天气查询机器人。这个项目不仅能处理用户输入、调用第三方API还会涉及错误处理、数据格式化等实战技巧——所有功能仅需不到100行Python代码实现。1. 为什么需要功能型Telegram机器人基础教程教会了我们如何创建机器人但要让机器人真正产生价值必须赋予它解决实际问题的能力。天气查询是一个典型场景用户输入城市名称机器人返回实时天气数据。这种交互模式可以扩展到新闻推送、汇率查询、待办事项管理等数百种应用场景。与基础机器人相比功能型机器人需要处理三个核心挑战用户输入解析准确提取城市名称可能包含错别字或特殊符号外部API集成安全调用天气服务并处理各种异常情况响应优化将原始天气数据转换为用户友好的格式# 基础机器人 vs 功能型机器人功能对比 BASIC_BOT { 响应类型: 固定文本, 输入处理: 无, 外部依赖: 无, 使用场景: 演示/测试 } WEATHER_BOT { 响应类型: 动态数据, 输入处理: 自然语言解析, 外部依赖: 天气API, 使用场景: 实际工具 }2. 项目架构设计我们的天气机器人将采用模块化设计主要组件包括通信模块处理Telegram消息接收与发送逻辑控制解析用户指令并路由到对应功能天气服务调用外部API获取数据展示层格式化输出内容用户 - [Telegram] - 通信模块 - 逻辑控制 ↓ 天气服务 ↑ 用户 - [格式化输出] - 通信模块 -2.1 技术选型考量python-telegram-bot官方推荐的Python SDK封装了复杂API调用requests轻量级HTTP库用于调用天气APIpython-dotenv安全管理API密钥pytz处理时区转换天气数据通常包含时间戳提示避免在代码中硬编码API密钥使用环境变量是行业标准做法3. 实战开发步骤3.1 环境准备与依赖安装首先创建项目目录并安装必要依赖mkdir weather-bot cd weather-bot python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows pip install python-telegram-bot requests python-dotenv pytz创建项目结构weather-bot/ ├── .env # 存储敏感配置 ├── bot.py # 主程序 ├── weather.py # 天气服务模块 └── config.py # 配置加载器3.2 安全配置管理在.env文件中添加您的配置TELEGRAM_TOKENyour_bot_token_here WEATHER_API_KEYyour_weather_api_key创建config.py处理配置加载from dotenv import load_dotenv import os load_dotenv() class Config: TELEGRAM_TOKEN os.getenv(TELEGRAM_TOKEN) WEATHER_API_KEY os.getenv(WEATHER_API_KEY) staticmethod def validate(): if not all([Config.TELEGRAM_TOKEN, Config.WEATHER_API_KEY]): raise ValueError(Missing required environment variables)3.3 实现天气服务模块weather.py将封装所有天气相关逻辑import requests from typing import Dict, Optional from config import Config class WeatherService: BASE_URL https://api.openweathermap.org/data/2.5/weather classmethod def get_weather(cls, city: str) - Optional[Dict]: try: params { q: city, appid: Config.WEATHER_API_KEY, units: metric, lang: zh_cn } response requests.get(cls.BASE_URL, paramsparams) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(fWeather API error: {e}) return None classmethod def format_weather(cls, data: Dict) - str: if not data: return 无法获取天气数据请检查城市名称或稍后再试 main data[main] weather data[weather][0] return ( f {data[name]}天气情况:\n f• 当前温度: {main[temp]}°C\n f• 体感温度: {main[feels_like]}°C\n f• 天气状况: {weather[description]}\n f• 湿度: {main[humidity]}%\n f• 气压: {main[pressure]}hPa\n f• 风速: {data[wind][speed]}m/s )3.4 构建机器人主逻辑bot.py将整合所有组件from telegram import Update from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext from weather import WeatherService from config import Config import logging # 设置日志 logging.basicConfig( format%(asctime)s - %(name)s - %(levelname)s - %(message)s, levellogging.INFO ) logger logging.getLogger(__name__) def start(update: Update, context: CallbackContext) - None: user update.effective_user update.message.reply_markdown_v2( f你好 {user.mention_markdown_v2()}\n 我是天气查询机器人发送城市名称即可获取实时天气信息。\n 例如北京 或 New York ) def handle_message(update: Update, context: CallbackContext) - None: city update.message.text.strip() if not city: update.message.reply_text(请输入有效的城市名称) return weather_data WeatherService.get_weather(city) reply_text WeatherService.format_weather(weather_data) update.message.reply_text(reply_text) def error_handler(update: object, context: CallbackContext) - None: logger.error(msg机器人异常:, exc_infocontext.error) if isinstance(update, Update): update.message.reply_text(处理您的请求时出现错误请稍后再试) def main(): Config.validate() updater Updater(Config.TELEGRAM_TOKEN) dispatcher updater.dispatcher dispatcher.add_handler(CommandHandler(start, start)) dispatcher.add_handler(MessageHandler(Filters.text ~Filters.command, handle_message)) dispatcher.add_error_handler(error_handler) updater.start_polling() logger.info(机器人已启动...) updater.idle() if __name__ __main__: main()4. 高级功能扩展4.1 添加缓存机制频繁调用天气API可能导致速率限制实现简单缓存from datetime import datetime, timedelta class WeatherService: _cache {} CACHE_TIMEOUT timedelta(minutes30) classmethod def get_weather(cls, city: str) - Optional[Dict]: # 检查缓存 cached cls._cache.get(city) if cached and datetime.now() - cached[time] cls.CACHE_TIMEOUT: return cached[data] # 正常API调用 data cls._fetch_weather(city) if data: cls._cache[city] {data: data, time: datetime.now()} return data classmethod def _fetch_weather(cls, city: str) - Optional[Dict]: # 实际的API调用代码4.2 支持位置共享Telegram允许用户发送实时位置我们可以利用这个功能def handle_location(update: Update, context: CallbackContext) - None: location update.message.location weather_data WeatherService.get_weather_by_coords( location.latitude, location.longitude ) reply_text WeatherService.format_weather(weather_data) update.message.reply_text(reply_text) # 在主函数中添加处理器 dispatcher.add_handler(MessageHandler(Filters.location, handle_location))4.3 多语言支持根据用户语言偏好返回不同语言的结果def detect_user_language(update: Update) - str: # 简单实现检查用户个人资料的语言设置 return update.effective_user.language_code or en def handle_message(update: Update, context: CallbackContext) - None: lang detect_user_language(update) city update.message.text.strip() weather_data WeatherService.get_weather(city, langlang) # ...5. 部署与优化建议5.1 生产环境部署开发完成后您可能需要将机器人部署到服务器# 使用systemd创建服务 sudo nano /etc/systemd/system/weather-bot.service [Unit] DescriptionWeather Bot Service Afternetwork.target [Service] Userubuntu WorkingDirectory/path/to/weather-bot ExecStart/path/to/weather-bot/venv/bin/python bot.py Restartalways [Install] WantedBymulti-user.target # 启用服务 sudo systemctl daemon-reload sudo systemctl enable weather-bot sudo systemctl start weather-bot5.2 性能监控添加基础监控帮助了解机器人使用情况class StatsMiddleware: def __init__(self): self.request_count 0 self.error_count 0 def update_stats(self, update: Update, error: bool False): self.request_count 1 if error: self.error_count 1 def get_stats(self) - str: return ( f总请求数: {self.request_count}\n f错误率: {self.error_count/self.request_count:.1%} ) # 在处理器中使用 stats StatsMiddleware() def handle_message(update: Update, context: CallbackContext) - None: try: stats.update_stats(update) # 正常处理逻辑 except Exception as e: stats.update_stats(update, errorTrue) raise e5.3 安全最佳实践定期轮换API密钥实现速率限制防止滥用对用户输入进行消毒处理使用webhook代替轮询以获得更好性能

相关文章:

别再只会用BotFather了!用Python-telegram-bot库给你的Telegram机器人加个‘天气查询’功能(附完整代码)

用Python-telegram-bot打造智能天气机器人:从基础到高阶实战 Telegram机器人早已超越了简单的自动回复工具,成为开发者实现个性化服务的利器。今天,我们将突破BotFather的基础教学,带您开发一个真正实用的天气查询机器人。这个项目…...

AI破界:2026消费创新爆发:AI助手一句话下单1.2亿次背后的商业变局

2026年,AI不再是实验室里的参数竞赛,而是嵌入了日常消费的每一处褶皱。从"AI助手一句话下单超1.2亿次"到"AI眼镜实时投射导航信息",从"大模型折叠进咖啡取单口令"到"具身智能机器人持证上岗"——AI消…...

如何编辑一个网页?

1.首先要下载一个Visual Studio Code2.点击 New File,点击左上角 File → Save As 3.文件名输入 index.html (一定要加 .html 后缀)4.点击顶部菜单栏 File → Open Folder...,打开 index.html 5, 按 Ctrl S 保存文件6,点击…...

解决Next.js + Sharp在Vercel环境下SVG转PNG的中文乱码问题

1. 问题现象与背景分析 最近在做一个Next.js项目时,遇到了一个让人头疼的问题:使用Sharp库在Vercel生产环境将SVG转为PNG时,中文字符全部变成了乱码。这个现象特别有意思,因为在本地开发环境一切正常,只有部署到Verce…...

openclaw对接高德地图,让你的龙虾为你定制旅游攻略或行程

🦞 OpenClaw 对接高德地图:让你的 AI 助手为你定制个性化旅游攻略 📖 前言 在人工智能快速发展的今天,我们是否曾想过让 AI 助手成为我们的私人旅游顾问?OpenClaw 作为一款强大的 AI 助手框架,通过集成高…...

Text-Grab:Windows平台上最轻量高效的OCR文字提取工具终极指南

Text-Grab:Windows平台上最轻量高效的OCR文字提取工具终极指南 【免费下载链接】Text-Grab Use OCR in Windows quickly and easily with Text Grab. With optional background process and popups. 项目地址: https://gitcode.com/gh_mirrors/te/Text-Grab …...

OWASP ZAP开源安全软件分析与结对编程实践

OWASP ZAP开源安全软件分析与结对编程实践 前言 在开源安全软件工程的学习中,分析成熟的开源安全工具是理解工程化设计思想的最佳方式。本次结对作业选取OWASP ZAP作为分析对象,从环境搭建、系统建模到核心设计复原,完成了对这款专业Web安全…...

el-input输入限制全攻略:从整数到小数,再到特殊符号过滤

1. el-input输入限制的核心场景 在Web开发中,表单输入验证是保证数据质量的第一道防线。Element UI的el-input组件作为最常用的表单控件之一,经常需要处理各种输入限制需求。我见过太多因为输入限制没做好导致的Bug:用户误输入特殊符号导致系…...

颠覆传统BIM协作模式:开源BIM工具IfcOpenShell从技术原理到实战落地

颠覆传统BIM协作模式:开源BIM工具IfcOpenShell从技术原理到实战落地 【免费下载链接】IfcOpenShell Open source IFC library and geometry engine 项目地址: https://gitcode.com/gh_mirrors/if/IfcOpenShell 建筑信息模型(BIM)技术在…...

Linux操作系统中Vim的基本命令

首先在Vim中有三种模式分别是命令行模式、插入模式、末行模式。在Vim中刚进入默认进入的是命令行模式,三个模式之间可以转换。输入i即可进入插入模式,在插入模式案下Esc即可换回命令行模式,命令行模式输入:即可进入末行模式&#…...

调试 vs

按f10 f11会自动打开监视窗口 直接按f5会找断点,若无断点,会运行至程序结束 当有输入值在断点后时,会先让你输入,再跳到之后的断点上 f5是让程序执行到运行逻辑上的下一个断点处 监视窗口只要输入的是合法的表达式,都…...

Qwen3-ASR-0.6B模型部署到STM32:嵌入式语音识别实战

Qwen3-ASR-0.6B模型部署到STM32:嵌入式语音识别实战 1. 引言 想不想让你的STM32开发板也能听懂人话?现在有个好消息:Qwen3-ASR-0.6B这个强大的语音识别模型,经过量化优化后,居然能在STM32这样的嵌入式设备上运行了&a…...

明文注入隐忧:CVE-2026-1642漏洞深度解析,NGINX全球部署安全预警

作为全球使用率最高的Web服务器与反向代理软件,NGINX凭借其极致的高性能、卓越的高稳定性以及轻量化的部署优势,早已成为互联网基础设施的核心支柱性组件。从中小型个人网站、初创企业的应用服务,到大型集团企业的核心业务系统,从…...

AHB总线读写RAM

timescale 1ns/1ps module ahb2ram #(parameter ADDR_BITS 32) ( input resetn, input ahb_clock, input [1:0] ahb_htrans,//传输类型00:idle, 01:busy, 10:NONSEQ, 11:SEQ NONSEQ:新数据 …...

嵌入式软件测试工具选型与工程实践指南

1. 嵌入式软件测试工具选型与工程实践指南嵌入式系统因其运行环境特殊、资源受限、实时性要求高、软硬件强耦合等固有特性,决定了其软件测试方法论与通用桌面/服务器应用存在本质差异。在实际工程中,测试活动必须贯穿开发全生命周期——从宿主机上的单元…...

为什么你的STM32 printf不工作?深入解析串口重定向与标准库的恩怨情仇

为什么你的STM32 printf不工作?深入解析串口重定向与标准库的恩怨情仇 调试STM32时,printf函数突然"罢工"是许多开发者都遇到过的棘手问题。明明代码逻辑正确,硬件连接无误,但串口助手就是收不到任何输出。这背后隐藏着…...

nanobot入门指南:超轻量OpenClaw镜像部署Qwen3-4B并验证llm.log日志

nanobot入门指南:超轻量OpenClaw镜像部署Qwen3-4B并验证llm.log日志 1. nanobot简介与核心优势 nanobot是一款受OpenClaw启发的超轻量级个人人工智能助手,专为开发者提供简单高效的AI代理服务。这个工具最大的特点就是极其轻量,整个核心功能…...

ClearerVoice-Studio商业应用:短视频配音净化+采访音频精准提取

ClearerVoice-Studio商业应用:短视频配音净化采访音频精准提取 1. 语音处理新选择:一体化开源解决方案 在内容创作和媒体制作领域,清晰纯净的音频质量往往决定着作品的成败。无论是短视频平台的配音需求,还是专业采访的音频提取…...

RTMP vs. HTTP-FLV:直播协议选型指南与性能对比

RTMP与HTTP-FLV:直播协议深度对比与实战选型指南 1. 直播协议的技术演进与核心诉求 在流媒体技术发展的二十年历程中,直播协议始终扮演着关键角色。从早期的RealPlayer到今天的超低延迟互动直播,协议选型直接影响着终端用户体验和系统架构设计…...

基于蚂蚁-遗传优化算法的路径规划问题(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…...

钓鱼攻击全面解析:原理、手段与实战防御

# 钓鱼攻击概述\n\n随着互联网技术的飞速发展,网络安全威胁日益严峻。钓鱼攻击作为一种常见的网络攻击手段,通过伪装成合法实体来诱骗用户泄露敏感信息,已成为企业和个人面临的主要安全挑战之一。\n\n## 什么是钓鱼攻击\n\n钓鱼攻击&#xff…...

【机器学习中的数据泄露:你必须知道的事】

【机器学习中的数据泄露:你必须知道的事】机器学习中的数据泄露:你必须知道的事 在机器学习(ML)项目中,数据泄露(Data Leakage)是一个常见且严重的问题。如果我们不小心,它可能会让模…...

GaussDB新手必看:5分钟搞定gsql连接与常用命令速查(附实战示例)

GaussDB新手必看:5分钟搞定gsql连接与常用命令速查(附实战示例) 第一次接触GaussDB的开发者往往会被各种连接参数和命令搞得晕头转向。作为华为开源的分布式数据库,GaussDB提供了强大的gsql命令行工具,但如何快速上手却…...

直播预告!从 Depth Scaling 到 Width Scaling,聊聊 WideSeek-R1:通过 MARL 探索大模型的广度扩展

DeepSeek-R1 的成功证明,深度扩展(Depth Scaling)在复杂逻辑推理中具有巨大潜力。但当任务从“深推理”转向“广信息”——如汇总全球头部科技公司多维财务数据——单一大模型往往受限于多轮检索带来的上下文干扰与串行效率瓶颈。论文&#x…...

Docker入门到实战全攻略

Docker 全面教程:大白话解析 专业生动 生产级实践(长文警告 ⚠️) 目录速览 Docker 是什么?——不是“容器”,是“集装箱操作系统” 为什么非用 Docker 不可?——3 个血泪教训场景 核心概念图解&#…...

大数据基于Python的事业单位报考数据分析与可视化

目录数据采集与清洗数据存储与管理数据分析可视化实现自动化与部署关键注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作数据采集与清洗 使用Python的requests或scrapy库爬取事业单位招聘网站数据(如各地人社…...

隐式算法瞬态分析保姆级教程:用ANSYS模拟笔记本电脑撞击实验

隐式算法瞬态分析实战指南:从零构建笔记本电脑跌落仿真模型 当你的设计团队需要在产品上市前验证笔记本电脑的抗震性能时,传统物理测试不仅成本高昂,而且难以捕捉内部精密组件的瞬时响应。这正是ANSYS隐式瞬态分析技术大显身手的场景——通过…...

AI 印象派艺术工坊建筑可视化:设计图转水彩风格部署案例

AI 印象派艺术工坊建筑可视化:设计图转水彩风格部署案例 1. 引言:当建筑设计遇见印象派 想象一下,你刚刚完成了一个建筑项目的设计图,线条精准,结构清晰,但总觉得少了点什么。客户想要一份能打动人的、有…...

基于Java的农村低保户网站设计与实现

目录需求分析与规划技术选型数据库设计核心功能实现测试与部署注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与规划 明确农村低保户网站的核心功能,包括用户注册/登录、低保申请、审核管理、信息…...

Phi-3-Mini-128K多模态理解潜力展示:从技术图表描述到数据提取

Phi-3-Mini-128K多模态理解潜力展示:从技术图表描述到数据提取 最近在折腾各种AI模型,总想看看它们除了聊天和写代码,还能干点什么更“接地气”的活儿。比如,我们平时工作中会遇到大量的技术文档、流程图、架构图,这些…...