你是否希望每天早晨一打开Telegram,就能收到所在城市的天气播报?手动查天气太麻烦,而借助Telegram机器人,我们可以实现全自动的每日天气推送。本文将从零开始,演示如何调用第三方天气API(以OpenWeatherMap为例),使用Python编写脚本,并结合定时任务,让机器人每天定时把天气信息发送到你的聊天窗口。
准备工作:创建Telegram Bot和获取天气API密钥
首先,我们需要一个Telegram机器人作为消息发送的主体。打开Telegram,搜索@BotFather,发送 /newbot 指令,按照提示设置机器人的名称和用户名。创建成功后,你会得到一个API Token,形如 123456:ABC-DEF...,请妥善保存。
接下来,获取接收天气消息的Chat ID。你可以向你的机器人发送任意消息,然后访问 https://api.telegram.org/bot<你的Token>/getUpdates,在返回的JSON中提取 chat.id 字段。更简单的办法是:直接给 @userinfobot 发消息,它会自动回复你的用户ID。
天气数据我们选择OpenWeatherMap的免费API。访问 openweathermap.org 注册账号,在API Keys页面生成一个密钥。免费版支持每日调用次数,足够个人使用。
编写天气查询函数
我们使用Python的 requests 库向OpenWeatherMap发起请求。函数接收城市名称和API Key,返回设定格式的天气文本。请注意,请求参数中 lang=zh_cn 可以让天气描述返回中文,units=metric 则使用摄氏度。
def get_weather(city, api_key):
url = f'http://api.openweathermap.org/data/2.5/weather?q=&appid=&lang=zh_cn&units=metric'
resp = requests.get(url)
if resp.status_code != 200:
return f'获取天气失败,状态码:{resp.status_code}'
data = resp.json()
weather = data['weather'][0]['description']
temp = data['main']['temp']
feels_like = data['main']['feels_like']
humidity = data['main']['humidity']
return f'今日天气:\n温度:°C\n体感:°C\n湿度:%'
编写Bot发送消息函数
发送消息使用的是Telegram Bot API的 sendMessage 方法。我们需要构造一个POST请求,包含机器人的Token、目标Chat ID和文本内容。为了复用,我们把发送逻辑封装成一个函数。
def send_telegram_message(bot_token, chat_id, text):
url = f'https://api.telegram.org/bot/sendMessage'
payload = {'chat_id': chat_id, 'text': text}
resp = requests.post(url, json=payload)
if resp.status_code == 200:
print('消息发送成功')
else:
print(f'发送失败:{resp.text}')
实现定时任务
定时任务我们采用APScheduler库。它支持Cron风格的调度,可以精确控制每天几点几分执行。安装APScheduler:pip install apscheduler。下面创建一个每分钟检查一次,但只在早上8点触发的任务。
from apscheduler.schedulers.blocking import BlockingScheduler
def daily_weather_job():
# 配置你的参数
bot_token = 'YOUR_BOT_TOKEN'
chat_id = 'YOUR_CHAT_ID'
api_key = 'YOUR_OPENWEATHER_API_KEY'
city = 'Beijing'
weather_text = get_weather(city, api_key)
send_telegram_message(bot_token, chat_id, weather_text)
scheduler = BlockingScheduler()
scheduler.add_job(daily_weather_job, 'cron', hour=8, minute=0)
scheduler.start()
以上代码会阻塞主线程,持续运行。如果你希望放入主程序后台运行,可以考虑使用 BackgroundScheduler,或者部署到服务器上。
完整代码示例与运行
为了便于你测试,下面给出一个整合了所有步骤的完整脚本。直接复制后,修改开头的配置项即可运行。
import requests
from apscheduler.schedulers.blocking import BlockingScheduler
# 配置区
bot_token = 'YOUR_BOT_TOKEN'
chat_id = 'YOUR_CHAT_ID'
api_key = 'YOUR_OPENWEATHER_API_KEY'
city = 'Beijing' # 换成你的城市
time_hour = 8 # 发送时间
def get_weather():
url = f'http://api.openweathermap.org/data/2.5/weather?q=&appid=&lang=zh_cn&units=metric'
resp = requests.get(url)
if resp.status_code != 200:
return f'获取天气失败,状态码:{resp.status_code}'
data = resp.json()
weather = data['weather'][0]['description']
temp = data['main']['temp']
feels_like = data['main']['feels_like']
humidity = data['main']['humidity']
wind = data['wind']['speed']
return f'今日天气:\n温度:°C\n体感:°C\n湿度:%\n风速: m/s'
def send_telegram_message(text):
url = f'https://api.telegram.org/bot/sendMessage'
payload = {'chat_id': chat_id, 'text': text}
resp = requests.post(url, json=payload)
if resp.status_code == 200:
print('消息发送成功')
else:
print(f'发送失败:{resp.text}')
def job():
weather_text = get_weather()
send_telegram_message(weather_text)
if __name__ == '__main__':
scheduler = BlockingScheduler()
scheduler.add_job(job, 'cron', hour=time_hour, minute=0)
print(f'定时任务已启动,每天 :00 发送天气')
scheduler.start()
运行脚本前请确保已安装 requests 和 apscheduler:pip install requests apscheduler。然后执行 python weather_bot.py,脚本会一直运行并等待触发。
运行与部署建议
如果你的电脑无法24小时开机,建议将脚本部署到云服务器或使用支持Python的定时服务。推荐以下几种方式:
- 云服务器(如阿里云、腾讯云)上使用nohup或systemd守护进程。
- 使用PythonAnywhere、Railway、Render等免费平台的定时任务功能。
- 将脚本封装成Docker容器,用cron触发。
此外,你可以扩展功能,例如增加每日紫外线指数、AQI(空气质量)等,或者同时推送多个城市的天气。只需在天气API中增加相应参数,并在消息模板中格式化即可。
注意:OpenWeatherMap免费版API有调用频率限制(约60次/分钟),个人使用完全足够。务必将API Key保存在环境变量中,避免硬编码泄露。
总结
通过本文,你学会了如何创建Telegram Bot、调用第三方天气API,并使用APScheduler实现每天定时推送。核心思路是:获取数据 → 格式化消息 → 调用Bot API发送 → 用定时任务驱动。这个模式同样适用于日报、股票、新闻推送等场景。快动手搭建你的专属天气播报员吧!