飞书群聊机器人定时推送天气与新闻摘要的Python实现

张开发
2026/6/8 16:44:34 15 分钟阅读
飞书群聊机器人定时推送天气与新闻摘要的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 fhttps://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 fhttps://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 fhttp://v.juhe.cn/toutiao/index?typetopkey{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, hour8, minute0) 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, jsonmessage) return response.status_code 2005. 部署与优化建议5.1 服务器部署方案这个脚本可以部署在任何能运行Python的环境。我推荐以下几种方案企业自有服务器最稳定可靠适合长期使用云函数服务阿里云函数计算或腾讯云SCF成本低且免运维个人电脑配合任务计划程序Windows或crontabMac/Linux如果选择云函数要注意配置好触发器和运行环境。云函数通常有冷启动问题可以在函数配置里设置定时预热。5.2 错误处理与日志在实际运行中API调用可能会失败。我们需要添加重试机制和日志记录。import logging from tenacity import retry, stop_after_attempt, wait_exponential logging.basicConfig(filenamebot.log, levellogging.INFO) retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) 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等工具将耗时操作异步化我在实际项目中还添加了用户反馈功能团队成员可以回复更多获取详细天气信息或者回复科技获取特定分类新闻。这种交互式体验很受欢迎。

更多文章