Telegram机器人实现每日天气定时发送:第三方API完整教程

手把手教你在Telegram上创建机器人,结合第三方天气API与定时任务,实现每天自动推送天气预报到指定聊天,附完整Python代码。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

你是否希望每天早晨一打开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()

运行脚本前请确保已安装 requestsapschedulerpip 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发送 → 用定时任务驱动。这个模式同样适用于日报、股票、新闻推送等场景。快动手搭建你的专属天气播报员吧!

FAQ

下载与安装

常见问题

如何获取Telegram机器人的API Token?

在Telegram中搜索@BotFather,发送 /newbot 指令,按照提示设置机器人名称和用户名,创建完成后会返回API Token,形如 '123456:ABC-DEF'。

如何获取Chat ID?

方法一:向你的机器人发送一条消息,然后访问 https://api.telegram.org/bot<你的Token>/getUpdates ,在返回数据中查找 'chat' 对象下的 'id' 字段值。方法二:直接给 @userinfobot 发消息,它会回复你的用户ID。

天气API密钥需要付费吗?

OpenWeatherMap提供免费层级的API,个人使用足够,但会有调用次数限制(当前为每分钟60次)和延迟。如果需求更高,可以选择付费方案。也可以使用其他免费天气API,如Open-Meteo。

定时任务可以使用哪些时间表达式?

APScheduler支持Cron风格和间隔式调度。例如 'cron' 触发器可以设置 hour=8, minute=0 表示每天8点执行;也可以使用 'interval' 间隔触发器,例如每6小时执行一次。具体请参考APScheduler文档。

脚本必须一直运行吗?

是的,APScheduler的BlockingScheduler会阻塞主线程,脚本需要持续运行才能按时触发。如果你的电脑不能24小时开启,建议部署到云服务器或使用带调度能力的云函数。