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

别再问怎么给QQ机器人加功能了!手把手教你用Nonebot2写一个天气查询插件(附完整代码)

NoneBot2实战从零构建智能QQ机器人天气查询插件在当今即时通讯生态中智能机器人已成为提升社群互动效率的利器。本文将深入探讨如何基于Python的NoneBot2框架为QQ机器人开发一个功能完备的天气查询插件。不同于基础教程我们聚焦于工程化实现与最佳实践涵盖API集成、异常处理、性能优化等进阶话题。1. 开发环境与项目结构1.1 环境配置要点确保已安装以下核心组件Python 3.8推荐3.10NoneBot2 2.0.0QQ适配器如nonebot-adapter-qqpip install nonebot2 nonebot-adapter-qq httpx项目目录结构示例my_bot/ ├── bot.py # 入口文件 ├── pyproject.toml # 插件配置 └── plugins/ └── weather.py # 天气插件1.2 基础通信架构NoneBot2采用事件驱动模型其核心流程为QQ消息 → 2. 适配器解析 → 3. 事件处理器 → 4. 插件响应在bot.py中初始化机器人import nonebot from nonebot.adapters.qq import Adapter nonebot.init() driver nonebot.get_driver() driver.register_adapter(Adapter) nonebot.load_plugins(plugins) # 自动加载插件目录 if __name__ __main__: nonebot.run()2. 天气插件核心实现2.1 命令响应器设计使用on_command创建天气查询指令from nonebot import on_command from nonebot.rule import to_me from nonebot.params import CommandArg weather on_command( 天气, ruleto_me(), aliases{weather, 查天气}, priority5, blockTrue )参数解析技巧weather.handle() async def handle_location(args: str CommandArg()): if not args.extract_plain_text().strip(): await weather.finish(请输入查询地点例如/天气 北京)2.2 天气API集成推荐使用高稳定性的和风天气APIimport httpx from typing import Dict, Optional async def fetch_weather(location: str) - Optional[Dict]: base_url https://devapi.qweather.com/v7/weather/now params { location: location, key: YOUR_API_KEY, # 替换为实际key lang: zh } async with httpx.AsyncClient() as client: try: resp await client.get(base_url, paramsparams, timeout5.0) return resp.json() if resp.status_code 200 else None except (httpx.TimeoutException, httpx.NetworkError): return None提示实际开发中应将API密钥存储在环境变量中避免硬编码2.3 数据格式化输出将API响应转换为用户友好格式def format_weather(data: Dict) - str: if not data or data.get(code) ! 200: return 天气数据获取失败请稍后重试 now data[now] return ( f当前天气{now[text]}\n f温度{now[temp]}℃ | 体感{now[feelsLike]}℃\n f湿度{now[humidity]}% | 风向{now[windDir]}\n f空气质量{now[airQuality][category]} )3. 进阶功能实现3.1 缓存机制优化使用lru_cache减少API调用from functools import lru_cache import time lru_cache(maxsize32) async def get_cached_weather(location: str): # 设置10分钟缓存 if cached : cache.get(location): if time.time() - cached[timestamp] 600: return cached[data] data await fetch_weather(location) if data: cache[location] {data: data, timestamp: time.time()} return data3.2 异常处理策略完善错误处理流程weather.got(location, prompt请输入要查询的城市名称) async def handle_weather(location: str ArgPlainText()): try: if not (data : await get_cached_weather(location)): await weather.finish(服务暂时不可用) await weather.finish(format_weather(data)) except Exception as e: logger.error(fWeather query failed: {e}) await weather.finish(查询出现异常)3.3 可视化增强使用MessageSegment实现富媒体回复from nonebot.adapters.qq import MessageSegment async def send_weather_card(location: str): data await fetch_weather(location) if not data: return None return MessageSegment.markdown( f ## {location}天气 - 状态{data[now][text]} - 温度{data[now][temp]}℃ - 湿度{data[now][humidity]}% ![天气图标](https://example.com/weather_icons/{data[now][icon]}.png) )4. 部署与监控4.1 性能监控配置添加Prometheus监控指标from prometheus_client import Counter WEATHER_QUERIES Counter( weather_query_total, Total weather queries, [location] ) weather.handle() async def track_usage(location: str CommandArg()): WEATHER_QUERIES.labels(locationlocation).inc()4.2 日志结构化配置JSON格式日志import json_logging import logging json_logging.init_non_web() logger logging.getLogger(weather-plugin) logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.INFO)典型日志输出示例{ time: 2023-08-20T14:30:00Z, level: INFO, location: 北京, response_time: 320, message: Weather query completed }5. 插件扩展思路5.1 多数据源容灾实现天气API的降级策略async def get_weather_with_fallback(location: str): for api in [fetch_heweather, fetch_openweather]: if result : await api(location): return result return None5.2 用户偏好存储使用SQLite记录用户常用地点import sqlite3 def init_db(): conn sqlite3.connect(user_prefs.db) conn.execute( CREATE TABLE IF NOT EXISTS prefs (user_id TEXT PRIMARY KEY, location TEXT) ) return conn5.3 定时天气推送利用APScheduler实现定时任务from nonebot_plugin_apscheduler import scheduler scheduler.scheduled_job(cron, hour8) async def morning_weather(): conn init_db() for user in conn.execute(SELECT user_id, location FROM prefs): await send_private_msg(user[0], await get_weather(user[1]))通过以上实现我们构建了一个具备生产级可靠性的天气查询插件。在实际项目中建议进一步考虑接口限流防止滥用敏感词过滤机制多语言支持单元测试覆盖率这种模块化设计思路同样适用于其他功能插件的开发如快递查询、日程管理等。关键在于保持代码的可扩展性和可维护性这是区分业余项目与专业开发的核心标准。

相关文章:

别再问怎么给QQ机器人加功能了!手把手教你用Nonebot2写一个天气查询插件(附完整代码)

NoneBot2实战:从零构建智能QQ机器人天气查询插件 在当今即时通讯生态中,智能机器人已成为提升社群互动效率的利器。本文将深入探讨如何基于Python的NoneBot2框架,为QQ机器人开发一个功能完备的天气查询插件。不同于基础教程,我们聚…...

告别轮询!GD32F407 ADC+DMA+定时器触发,实现多通道自动采集与存储

GD32F407 ADCDMA定时器触发:多通道自动采集系统设计指南 在物联网节点和工业监测设备开发中,高效稳定的数据采集系统是核心基础。传统轮询式ADC采集不仅占用大量CPU资源,还难以满足多通道同步、高精度定时采集的需求。本文将深入讲解基于GD32…...

PyTorch 2.8镜像实战案例:内容创作团队基于Diffusers批量生成社媒短视频

PyTorch 2.8镜像实战案例:内容创作团队基于Diffusers批量生成社媒短视频 1. 项目背景与需求 在当今社交媒体内容爆炸式增长的时代,短视频创作团队面临着巨大的内容生产压力。传统视频制作流程需要经历脚本创作、拍摄、剪辑等多个环节,一个专…...

手把手教你玩转双闭环MMC逆变仿真

双闭环+最近电平逼近调制MMC模块化多电平换流器仿真(逆变侧)含技术文档 MMC Matlab-Simulink 直流侧11kV 交流侧6.6kV N22 采用最近电平逼近调制NLM 环流抑制(PIR比例积分准谐振控制),测量桥臂电感THD获得抑…...

Git Diff View:三分钟学会实用的代码差异对比组件

Git Diff View:三分钟学会实用的代码差异对比组件 【免费下载链接】git-diff-view A Diff View component for React / Vue, just like Github 项目地址: https://gitcode.com/gh_mirrors/gi/git-diff-view 你是否曾经在代码审查中为理解复杂的Git差异而头疼…...

如何用FanControl彻底告别电脑噪音?Windows风扇控制终极解决方案

如何用FanControl彻底告别电脑噪音?Windows风扇控制终极解决方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_T…...

Qwen3-14B私有化效果闭环:从部署→使用→反馈→迭代的完整链路

Qwen3-14B私有化效果闭环:从部署→使用→反馈→迭代的完整链路 1. 开箱即用的私有化部署方案 Qwen3-14B作为通义千问系列的最新大语言模型,在14B参数规模下展现出惊人的理解与生成能力。但对于企业用户而言,如何在自有环境中实现稳定、高效…...

pngquant终极内存优化:处理大文件时的10个高效故障排除技巧

pngquant终极内存优化:处理大文件时的10个高效故障排除技巧 【免费下载链接】pngquant Lossy PNG compressor — pngquant command based on libimagequant library 项目地址: https://gitcode.com/gh_mirrors/pn/pngquant 想要高效压缩大型PNG文件却遇到内存…...

智慧小区网络设计避坑指南:华为设备选型、无线覆盖与安全策略实战解析

智慧小区网络设计实战:华为设备选型与无线覆盖避坑指南 当接到智慧小区网络建设项目时,很多工程师会陷入理论完美主义陷阱——画出漂亮的拓扑图,却在实际部署中遭遇信号死角、设备过载、策略冲突等现实问题。本文将从三个真实项目复盘出发&am…...

从IntelliJ到VSCode:开发体验无缝迁移完全指南

从IntelliJ到VSCode:开发体验无缝迁移完全指南 【免费下载链接】vscode-intellij-idea-keybindings Port of IntelliJ IDEA key bindings for VS Code. 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-intellij-idea-keybindings 一、发现迁移痛点&…...

HelixDB安全特性解析:类型安全查询如何确保生产环境可靠性

HelixDB安全特性解析:类型安全查询如何确保生产环境可靠性 【免费下载链接】helix-db HelixDB is a powerful, graph-vector database built entirely in Rust for millisecond query latency and ease of use. 项目地址: https://gitcode.com/gh_mirrors/he/heli…...

新手入门:基于快马平台复现pencil设计工具基础功能学前端

最近在学前端开发,想找个能动手实践的项目练练手。朋友推荐了pencil官网的设计工具,但直接看源码有点复杂。后来发现用InsCode(快马)平台可以快速复现基础功能,特别适合新手理解画布操作和事件处理。下面分享我的学习过程: 画布搭…...

大模型部署成本优化:面向测试从业者的云服务省钱技巧

随着大模型在自动化测试、缺陷智能分析、测试用例生成等领域的应用日益深入,其部署与调用成本已成为测试团队必须面对的核心挑战。高昂的GPU算力费用、未被充分利用的资源以及复杂的定价模型,都可能使技术创新的预算捉襟见肘。一、理解成本构成&#xff…...

4个步骤实现跨设备数据同步:开源工具Kazumi的WebDAV集成方案

4个步骤实现跨设备数据同步:开源工具Kazumi的WebDAV集成方案 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕,支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi …...

从ThreadLocal到TransmittableThreadLocal:手把手解决线程池上下文传递难题

从ThreadLocal到TransmittableThreadLocal:线程池上下文传递的终极解决方案 在分布式系统和微服务架构盛行的今天,异步编程已成为Java开发者日常工作中不可或缺的一部分。无论是处理高并发请求、优化系统性能,还是实现复杂的业务流程&#xf…...

技术人终身学习:2026年软件测试从业者必跟的5个播客

在技术迭代日新月异的今天,终身学习已不再是可选项,而是软件测试从业者保持竞争力的生存法则。碎片化的时间如何转化为系统性的认知升级?深度思考如何突破日常工作环境的局限?播客,以其伴随性强、信息密度高、视角多元…...

JAVA-- 突破默认限制:在Java8 Parallel Stream中高效管理自定义线程池

1. 为什么需要自定义线程池管理Parallel Stream Java8引入的Parallel Stream确实让并行编程变得简单,但很多开发者在使用过程中会发现一个尴尬的事实:所有并行流操作默认共享同一个ForkJoinPool公共线程池。这就好比小区里所有住户共用一个电表&#xff…...

Lingyuxiu MXJ LoRA开源镜像指南:从下载到生成的完整开箱即用流程

Lingyuxiu MXJ LoRA开源镜像指南:从下载到生成的完整开箱即用流程 1. 项目简介 Lingyuxiu MXJ LoRA 是一款专门为生成唯美真人风格人像而设计的轻量级AI图像生成系统。这个项目最大的特点就是针对人像摄影进行了深度优化,能够生成五官精致、光影柔和、…...

NaViL-9B参数详解教程:max_new_tokens与temperature协同调优

NaViL-9B参数详解教程:max_new_tokens与temperature协同调优 1. 认识NaViL-9B多模态大模型 NaViL-9B是上海人工智能实验室研发的原生多模态大语言模型,它不仅能处理纯文本问答,还能理解图片内容。这个模型特别适合需要同时处理文字和图像信…...

Apache Spark 第 11 章:Delta Lake 与 Lakehouse

第十一章深入拆解 Delta Lake 与 Lakehouse 架构,这是现代数据工程的核心组件。从传统数据湖的痛点出发,逐层剖析 Delta Lake 的实现原理。 第一张:为什么需要 Delta Lake。三大痛点和 Delta Lake 的解法一目了然。接下来看最核心的实现机制—…...

突破工厂建设瓶颈:FactoryBluePrints蓝图库带来的自动化生产革命

突破工厂建设瓶颈:FactoryBluePrints蓝图库带来的自动化生产革命 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints是戴森球计划的开源工厂蓝图…...

QuickBMS深度解析:游戏资源逆向工程与批量处理技术实践

QuickBMS深度解析:游戏资源逆向工程与批量处理技术实践 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS 作为游戏逆向工程领域的瑞士军刀,QuickBMS以其卓越的文件格式解析…...

5个效率提升技巧:Cursor AI功能优化指南

5个效率提升技巧:Cursor AI功能优化指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial request li…...

Scrcpy:重新定义安卓设备跨平台交互体验

Scrcpy:重新定义安卓设备跨平台交互体验 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/gh_mirrors/sc/scrcpy 一、跨设备交互的现实困境:发现问题本质 在数字化办公与移动开发的日常场景中&a…...

CBF文件:统一刷写流程的密钥与工程实践

1. CBF文件:汽车电子刷写的"万能钥匙" 第一次接触CBF文件是在2018年参与某新能源车厂的项目时。当时产线上几十种ECU(电子控制单元)需要刷写,每个供应商提供的刷写包格式五花八门——有的用HEX文件,有的用S1…...

动态卷积在图像分割中的应用与优化策略

1. 动态卷积如何让图像分割更智能 第一次接触动态卷积这个概念时,我正被一个医学图像分割项目困扰。传统卷积神经网络在处理不同组织边界的细微变化时总是力不从心,直到尝试了动态卷积方案,分割精度直接提升了8%。这种"会思考的卷积核&…...

TPAMI 2026 | 雨雾噪模糊全搞定!CPL 框架让图像复原告别单一任务限制

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达在日常拍摄中,一张照片可能同时遭遇噪声、雾霾、雨滴等多种退化问题,而传统图像复原方法要么只能处理单一退化类型,要么在多任务场景下…...

ESP32-S3 开发实战:从问题排查到功能优化

1. ESP32-S3开发环境搭建与常见问题 刚拿到ESP32-S3开发板时,我最先遇到的就是环境配置问题。这里分享几个新手容易踩的坑:首先是开发工具链的选择,官方推荐使用ESP-IDF或Arduino IDE。我建议初学者先用Arduino IDE上手,因为它的库…...

从变砖到重生:红魔全系9008深度救砖指南与实战解析

1. 什么是9008模式?为什么能救砖? 当你发现红魔手机卡在开机界面、反复重启甚至完全黑屏时,大概率是遇到了传说中的"变砖"。这时候高通芯片隐藏的9008模式就是最后的救命稻草。简单来说,9008模式相当于电脑的BIOS界面&…...

Apache HBase与Spark集成终极指南:10个实时数据处理高效方案

Apache HBase与Spark集成终极指南:10个实时数据处理高效方案 【免费下载链接】hbase Apache HBase 项目地址: https://gitcode.com/GitHub_Trending/hb/hbase Apache HBase是一个高可靠性、高性能、面向列的分布式存储系统,非常适合存储海量结构化…...