在Telegram生态中,Bot是连接用户与服务的桥梁。一个能实时查询天气的Bot,不仅能提升用户粘性,更是开发者熟悉Telegram Bot API与第三方服务集成的绝佳练手项目。本文将带你从零开始,完成Telegram Bot与第三方天气API的集成,实现输入城市名即返回实时天气与预报的完整功能。
环境准备与前置条件
在动手写代码之前,请确保具备以下环境与条件:
- Telegram账户:用于创建Bot并获取Token。
- Python环境:推荐使用Python 3.8+,并安装
python-telegram-bot和requests库。 - 天气API Key:从第三方天气服务商(如OpenWeatherMap、和风天气、心知天气等)申请免费或付费API密钥。
- 代理或网络环境:Telegram API在国内可能无法直连,需配置代理(本文示例使用HTTP代理)。
安装依赖:
pip install python-telegram-bot requests选择合适的天气API
市面上天气API众多,根据你的用户群体和使用需求选择:
- OpenWeatherMap:国际通用,免费版支持当前天气和5天预报,需英文城市名。
- 和风天气:国内访问速度快,中文支持好,免费版有每日调用量限制。
- 心知天气:提供中文接口,兼容多种语言,适合国内用户。
本文以OpenWeatherMap为例,因为它文档完善、注册简单、免费额度充足。注册后获取API Key,并记下接口地址:https://api.openweathermap.org/data/2.5/weather。
在Telegram Bot中集成天气API的步骤
步骤1:创建Telegram Bot并获取Token
在Telegram中搜索@BotFather,发送/newbot,按提示设置Bot名称和用户名。创建成功后,BotFather会返回一个HTTP API Token,格式如123456789:AAF...xxxx。妥善保存此Token。
步骤2:获取天气API的Key
登录OpenWeatherMap官网,注册账户后进入API Keys页面,复制默认生成的Key(或新建一个)。免费版Key即可满足本教程需求。
步骤3:编写Bot代码
创建一个名为weather_bot.py的文件,参考下方代码框架。核心逻辑是:监听用户输入的城市名,调用天气API获取数据,解析后以友好的格式回复用户。
注意:由于Telegram API需要代理,请在创建Application时通过defaults或request_kwargs设置代理,或使用python-telegram-bot的Proxy功能。以下是关键代码片段:
import requests
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
# 你的Token和API Key
TOKEN = '你的Telegram Bot Token'
WEATHER_API_KEY = '你的OpenWeatherMap Key'
async def weather(update: Update, context: ContextTypes.DEFAULT_TYPE):
city = update.message.text.strip()
if not city:
await update.message.reply_text('请输入城市名,例如:/weather 北京')
return
try:
url = f'https://api.openweathermap.org/data/2.5/weather?q=&appid=&units=metric&lang=zh_cn'
resp = requests.get(url, timeout=10)
data = resp.json()
if resp.status_code == 404:
await update.message.reply_text('未找到该城市,请检查拼写。')
return
weather_desc = data['weather'][0]['description']
temp = data['main']['temp']
feels_like = data['main']['feels_like']
humidity = data['main']['humidity']
wind = data['wind']['speed']
reply = (
f'📍 城市:\n'
f'🌤 天气:\n'
f'🌡 温度:°C(体感°C)\n'
f'💧 湿度:%\n'
f'💨 风速: m/s'
)
await update.message.reply_text(reply)
except Exception as e:
await update.message.reply_text('查询失败,请稍后再试或联系管理员。')
print(f'Error: ')
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('我是天气机器人!发送城市名即可查询当前天气,例如:北京')
def main():
app = Application.builder().token(TOKEN).proxy('http://你的代理地址').build()
app.add_handler(CommandHandler('start', start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, weather))
app.run_polling()
if __name__ == '__main__':
main()步骤4:测试与部署
在本地运行python weather_bot.py,然后向Bot发送任意城市名,观察回复。如果代理配置正确,Bot应能正常应答。测试通过后,可部署到云服务器(如腾讯云轻量应用服务器、AWS EC2),使用nohup或systemd保持进程常驻。
错误处理与优化建议
- 输入校验:增加对空输入、非法字符的过滤,避免API请求出错。
- 缓存机制:对频繁查询的城市设置Redis或内存缓存(如5分钟),减少API调用量。
- 优雅错误提示:捕获网络异常、API限流等情况,回复给用户友好信息。
- 命令丰富化:支持
/weather 城市命令和纯文本输入,并增加预报查询功能。 - 异步优化:使用
httpx替代requests,配合Asyncio提升并发性能。
总结
通过本文,你已掌握Telegram Bot集成第三方天气API的核心流程。从创建Bot、获取API Key,到编写代码、处理错误,再到部署上线,每一步都为你拆解清楚。天气查询只是一个起点,你可以将此模式扩展到翻译、新闻、支付等更多领域,打造出有价值的Telegram Bot。如需深入源码或讨论更多技巧,欢迎在评论区留言交流。