飞书群聊机器人定时推送天气与新闻摘要的Python实现
1. 为什么需要飞书群聊机器人定时推送服务
每天早上打开电脑,第一件事就是查看天气和新闻,这已经成为很多人的习惯。但手动操作既费时又容易遗漏重要信息。想象一下,如果这些信息能自动推送到团队群聊里,是不是既方便又高效?这就是我们今天要解决的问题。
飞书作为一款企业级协作工具,其机器人API提供了强大的消息推送能力。我最近在团队内部部署了一个定时推送天气和新闻摘要的机器人,实测下来每天能节省团队成员至少15分钟的信息收集时间。特别是在阴雨天,机器人提前推送的天气预警让很多人避免了淋雨的尴尬。
这种自动化服务特别适合以下几种场景:
- 企业晨会前自动推送当日要闻,帮助团队快速了解行业动态
- 项目组外出作业前获取精准天气预报
- 学习小组每日同步最新教育政策或考试资讯
- 异地协作团队统一掌握各成员所在地天气状况
2. 准备工作:获取必要的API密钥
2.1 创建飞书群聊机器人
首先登录飞书开放平台,进入"应用管理"创建新应用。这里有个坑我踩过:一定要选择"企业自建应用"而不是"商店应用",否则后面获取token会失败。创建完成后,记下App ID和App Secret,这两个相当于机器人的身份证。
在权限配置环节,需要勾选"获取群组信息"和"发送消息"权限。如果是推送图片,还需要额外申请"上传图片"权限。这里建议一次性把可能用到的权限都配置好,免得反复修改。
2.2 申请天气和新闻API
天气服务我推荐使用和风天气API,它提供免费套餐,足够日常使用。注册后获取Key,注意区分Web API和SDK的Key,我们只需要Web API的。
新闻API方面,聚合数据提供不错的服务。他们有个"头条新闻"接口,可以按分类获取热点新闻。免费版每天100次调用完全够用。如果团队有特殊需求,比如只关注科技新闻,可以找更垂直的API服务商。
3. 核心代码实现
3.1 获取天气数据
我们先实现天气查询功能。和风天气的API调用很简单,只需要城市ID和API Key。这里有个技巧:可以通过城市名称自动获取ID,避免手动维护ID列表。
def get_weather(city, api_key): # 先获取城市ID city_url = f"https://geoapi.qweather.com/v2/city/lookup?location={city}&key={api_key}" response = requests.get(city_url) city_id = response.json()['location'][0]['id'] # 获取天气数据 weather_url = f"https://devapi.qweather.com/v7/weather/now?location={city_id}&key={api_key}" weather_data = requests.get(weather_url).json() return { 'city': city, 'temp': weather_data['now']['temp'], 'text': weather_data['now']['text'], 'wind': weather_data['now']['windDir'] }3.2 获取新闻摘要
新闻API的调用更简单,但要注意处理分页和分类。我建议只取前5条热点新闻,太多信息反而影响阅读体验。
def get_news(api_key): url = f"http://v.juhe.cn/toutiao/index?type=top&key={api_key}" response = requests.get(url) news_data = response.json()['result']['data'][:5] # 只取前5条 news_list = [] for item in news_data: news_list.append({ 'title': item['title'], 'url': item['url'] }) return news_list3.3 定时任务设置
使用APScheduler这个库可以轻松实现定时任务。我推荐使用BackgroundScheduler,它会在后台运行不影响主程序。
from apscheduler.schedulers.blocking import BlockingScheduler scheduler = BlockingScheduler() # 每天上午8点执行 @scheduler.scheduled_job('cron', hour=8, minute=0) def daily_push(): weather = get_weather("北京", WEATHER_KEY) news = get_news(NEWS_KEY) send_feishu_message(weather, news) scheduler.start()4. 消息推送与格式优化
4.1 构造飞书消息卡片
飞书支持丰富的消息卡片格式,比纯文本美观多了。我们可以把天气和新闻分成两个模块展示。
def build_weather_card(weather): return { "tag": "div", "text": { "content": f"🌤️ {weather['city']}天气\n" f"温度: {weather['temp']}℃\n" f"天气状况: {weather['text']}\n" f"风向: {weather['wind']}", "tag": "lark_md" } } def build_news_card(news): news_items = ["📰 今日热点新闻"] for item in news: news_items.append(f"- [{item['title']}]({item['url']})") return { "tag": "div", "text": { "content": "\n".join(news_items), "tag": "lark_md" } }4.2 发送消息到群聊
最后一步是把构造好的消息通过webhook发送到群聊。飞书的webhook URL可以在群机器人设置里找到。
def send_feishu_message(weather, news): webhook_url = "YOUR_WEBHOOK_URL" weather_card = build_weather_card(weather) news_card = build_news_card(news) message = { "msg_type": "interactive", "card": { "elements": [weather_card, news_card] } } response = requests.post(webhook_url, json=message) return response.status_code == 2005. 部署与优化建议
5.1 服务器部署方案
这个脚本可以部署在任何能运行Python的环境。我推荐以下几种方案:
- 企业自有服务器:最稳定可靠,适合长期使用
- 云函数服务:阿里云函数计算或腾讯云SCF,成本低且免运维
- 个人电脑:配合任务计划程序(Windows)或crontab(Mac/Linux)
如果选择云函数,要注意配置好触发器和运行环境。云函数通常有冷启动问题,可以在函数配置里设置定时预热。
5.2 错误处理与日志
在实际运行中,API调用可能会失败。我们需要添加重试机制和日志记录。
import logging from tenacity import retry, stop_after_attempt, wait_exponential logging.basicConfig(filename='bot.log', level=logging.INFO) @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) def safe_get_weather(city, api_key): try: return get_weather(city, api_key) except Exception as e: logging.error(f"获取天气失败: {str(e)}") raise5.3 性能优化技巧
当团队规模较大时,可以考虑以下优化:
- 使用缓存:对天气数据缓存1小时,减少API调用
- 批量发送:先收集所有用户位置,一次性获取天气数据
- 异步处理:使用Celery等工具将耗时操作异步化
我在实际项目中还添加了用户反馈功能,团队成员可以回复"更多"获取详细天气信息,或者回复"科技"获取特定分类新闻。这种交互式体验很受欢迎。
