当前位置: 首页 > news >正文

飞书群聊机器人定时推送天气与新闻摘要的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_list

3.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 == 200

5. 部署与优化建议

5.1 服务器部署方案

这个脚本可以部署在任何能运行Python的环境。我推荐以下几种方案:

  1. 企业自有服务器:最稳定可靠,适合长期使用
  2. 云函数服务:阿里云函数计算或腾讯云SCF,成本低且免运维
  3. 个人电脑:配合任务计划程序(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)}") raise

5.3 性能优化技巧

当团队规模较大时,可以考虑以下优化:

  1. 使用缓存:对天气数据缓存1小时,减少API调用
  2. 批量发送:先收集所有用户位置,一次性获取天气数据
  3. 异步处理:使用Celery等工具将耗时操作异步化

我在实际项目中还添加了用户反馈功能,团队成员可以回复"更多"获取详细天气信息,或者回复"科技"获取特定分类新闻。这种交互式体验很受欢迎。

http://www.jsqmd.com/news/648926/

相关文章:

  • 技术书籍速读:年度Top 5推荐
  • 2026年口碑好的西安除四害后厨消杀/西安除四害虫害防治/西安除四害/西安除四害虫控服务年度精选公司 - 品牌宣传支持者
  • RPA+AI深度融合:打造企业级自动化流程,降本80%的实战方案
  • 联想Y9000P双系统实战:Ubuntu 20.04安装与硬件兼容性调优全记录
  • Pixel Couplet Gen入门必看:8-bit风格约束下LLM春联押韵与平仄校验方案
  • 【AI入门系列】车市先知:二手车价格预测学习赛507
  • MockGPS位置模拟:5步实现手机定位自由掌控
  • LightOnOCR-2-1B移动端集成:Android NDK开发实战指南
  • Python自动化:dcm2niix批量DICOM转NII的实战技巧与SPM兼容性优化
  • Wireshark实战:5步搞定视频会议H.323/SIP抓包,快速定位通话卡顿元凶
  • Unity TEngine5实战:用它的UI模块和事件系统,快速搭建一个战斗界面(含代码)
  • Rust的Pin类型与自引用结构体在异步编程中的固定语义
  • 2026年靠谱的浙江耐高低温汽车管路/定制化汽车管路/耐腐蚀制动汽车管路/空调制冷汽车管路厂家推荐 - 行业平台推荐
  • 一键部署Phi-4-mini-reasoning至Ubuntu服务器:完整环境配置与运维指南
  • 浪潮云海InCloud Rail超融合:VMware vSphere+vSAN的理想演进之选
  • 实用指南:3分钟掌握百度网盘直连解析,轻松突破下载限速
  • 想快速复现CVPR 2024的SOTA模型?这份NeRF、Diffusion和YOLO-World的保姆级环境配置指南请收好
  • 2026年放心的海南公司注册/海南公司注册注销口碑排行榜 - 品牌宣传支持者
  • 2026AI大模型开发「保姆级教程」!从0到1实操,开发者速抄作业,闭源开源全搞定
  • Rockchip RK3568平台Android系统‘瘦身’全记录:从31M到26M的Kernel裁剪实战
  • Llama-3.2V-11B-cot精彩案例分享:高考物理图解题自动推理全过程
  • 用STM32CubeMX搞定单脉冲输出:外部触发和软件触发两种方式实测(附完整代码)
  • 打破视频孤岛:基于 ZLMediaKit 的 GB28181 与 RTSP 统一接入网关架构设计
  • WRF-Hydro实战指南:从配置到排错的全流程解析
  • Pixel Epic智识终端部署教程:Docker镜像快速启动与自定义配置
  • Wan2.2-T2V-A5B新手必看:ComfyUI界面操作详解,快速出片不求人
  • 2026年知名的海南财务公司代理记账/海南个体户代理记账/海南一般纳税人代理记账/海南零申报代理记账综合评价公司 - 行业平台推荐
  • 信号完整性入门:UI(Unit Interval)与比特周期的关系及其在眼图分析中的应用
  • 2026年靠谱的旧房翻新装修公司/独栋装修公司/联排装修公司/本地人装修公司优选榜单 - 品牌宣传支持者
  • Downkyi哔哩下载姬:如何快速掌握B站视频下载神器?终极完整指南