从零构建Telegram天气机器人:Python异步编程与API集成实战

news2026/5/12 16:28:18
1. 项目概述一个能聊天的天气机器人如果你用过Telegram大概率会见过或者用过一些机器人。它们能帮你查新闻、翻译、管理任务甚至陪你聊天。今天要聊的这个项目imkarimkarim/Telegram-Weather-Bot就是一个典型的“实用型”机器人——一个部署在你服务器上专门用来查询天气的Telegram Bot。乍一看这似乎很简单不就是调用个天气API然后把结果发给用户吗确实核心逻辑就这么点。但一个真正好用、稳定、能长期运行的机器人背后需要考虑的东西远不止这些。它涉及到如何与Telegram Bot API高效交互、如何选择合适的天气数据源、如何处理用户的并发请求、如何设计清晰易用的指令系统以及如何优雅地处理各种异常比如用户输入了不存在的城市或者天气服务暂时不可用。这个项目提供了一个非常干净的实现范本。它没有过度设计代码结构清晰把核心的“接收消息-处理请求-返回结果”流程封装得很好。对于想入门Telegram Bot开发或者想快速搭建一个私有天气查询服务的开发者来说这是一个极佳的起点。你可以基于它快速理解Bot的工作机制然后轻松地扩展出更多功能比如空气质量查询、未来多天预报、甚至结合位置信息做个性化提醒。接下来我会带你从零开始彻底拆解这个天气机器人的构建过程。我们不仅会复现它还会深入探讨每个环节背后的“为什么”并分享一些从实际运维中积累的、能让你的机器人更健壮、更用户友好的经验和技巧。2. 核心组件与工具选型解析在动手写代码之前选对工具和理清架构是成功的一半。这个项目虽然代码量不大但每个依赖库的选择都很有代表性。2.1 通信基石Python-Telegram-Bot库与Telegram服务器对话你不能直接发HTTP请求而是需要通过Telegram官方提供的Bot API。虽然可以手动用requests库去拼装但那会非常繁琐且容易出错。因此使用一个成熟的封装库是必然选择。这个项目使用了python-telegram-bot库PTB。它几乎是Python生态中开发Telegram Bot的事实标准。为什么是它官方推荐与高活跃度它被Telegram官方Wiki列为推荐库之一社区活跃更新及时能紧跟Bot API的新特性。异步优先v20从v20版本开始PTB全面转向异步asyncio。这对于需要处理多个用户同时请求的Bot来说至关重要。异步模型可以用更少的资源比如线程处理更多的并发连接响应更迅速尤其是在进行网络I/O如调用天气API时不会因为等待一个请求而阻塞其他用户。抽象层次得当它提供了从低级API封装到高级框架如Application类的全套工具。你可以用很短的代码实现一个功能完整的Bot同时也有足够的灵活性进行深度定制。注意在查阅资料或使用旧项目时你可能会看到基于python-telegram-botv13以下的同步代码。新项目务必从v20开始直接使用异步模式。两者的API设计差异很大几乎不兼容。2.2 数据来源OpenWeatherMap API天气数据是机器人的灵魂。选择一个可靠、免费额度足够、数据准确的提供商是关键。项目选择了OpenWeatherMapOWM。免费层足够友好其免费套餐Current Weather Data API每分钟允许60次调用对于个人或小范围使用的Bot来说完全够用。它提供当前天气、温度、湿度、风速、天气状况图标代码等核心信息。数据格式规范返回的JSON数据结构清晰包含了我们需要的绝大部分信息并且有全球数万个城市的覆盖。易于集成只需一个API Key即可调用文档齐全。当然这不是唯一选择。国内开发者可能会考虑和风天气、心知天气等提供中文服务更友好的API。选择OWM作为示例主要是因为其国际通用性和文档的易获取性。无论选择哪个集成模式都是类似的注册、获取Key、构造请求URL、解析JSON响应。2.3 项目骨架代码结构预览在深入细节前我们先俯瞰一下项目的典型结构。这能帮你建立全局观telegram-weather-bot/ ├── bot.py # 主程序入口包含Bot的启动、消息分发逻辑 ├── config.py # 配置文件存放Token、API Key等敏感信息 ├── weather.py # 天气服务模块负责调用API和格式化数据 ├── utils.py # 工具函数如日志设置、错误处理 ├── requirements.txt # Python依赖包列表 └── README.md # 项目说明文档这种按功能分模块的方式比把所有代码堆在一个文件里要清晰得多。config.py单独管理密钥也便于在不同环境开发/生产中切换配置并且避免将密钥硬编码在代码中提交到Git仓库这是一个必须养成的好习惯。3. 从零开始的详细搭建流程理论说得再多不如动手做一遍。我们假设你有一个云服务器或本地开发环境并且已经安装了Python 3.8。下面是一步一步的实操指南。3.1 前期准备获取必要的密钥创建你的Telegram Bot在Telegram中搜索并联系BotFather。发送/newbot指令按照提示输入机器人的名字如MyWeatherBot和用户名必须以bot结尾如my_weather_alert_bot。创建成功后BotFather会给你一个HTTP API Token格式类似1234567890:ABCdefGHIjklMNOpqrsTUVwxyz。妥善保存这个Token它是你的Bot的唯一凭证。注册OpenWeatherMap并获取API Key访问OpenWeatherMap官网注册账号。登录后在“API Keys”选项卡中点击“Generate”创建一个新的Key。你会得到一个长字符串的API Key。免费套餐的Key通常有几分钟的激活延迟。3.2 环境配置与依赖安装在你的项目目录下首先创建虚拟环境并安装依赖这是管理Python项目的标准做法可以避免包版本冲突。# 创建项目目录并进入 mkdir telegram-weather-bot cd telegram-weather-bot # 创建Python虚拟环境推荐使用venv python3 -m venv venv # 激活虚拟环境 # Linux/macOS: source venv/bin/activate # Windows: # venv\Scripts\activate # 创建requirements.txt文件并写入依赖 echo python-telegram-bot20.7 requests2.31.0 python-dotenv1.0.0 requirements.txt # 安装依赖 pip install -r requirements.txt这里我们多引入了一个python-dotenv库它比直接写config.py更安全、更灵活是管理环境变量的最佳实践。3.3 核心模块实现接下来我们分模块编写代码。我会在关键处加上详细注释并解释为什么这么做。1. 使用.env文件管理配置在项目根目录创建.env文件并将你的密钥放进去。切记要将.env添加到.gitignore文件中绝对不要提交到版本库# .env 文件内容 TELEGRAM_BOT_TOKEN你的Telegram_Bot_Token OPENWEATHER_API_KEY你的OpenWeatherMap_API_Key2. 天气服务模块 (weather.py)这个模块负责所有与天气API相关的逻辑是业务核心。import requests import os from typing import Dict, Any, Optional # 从环境变量加载API Key API_KEY os.getenv(OPENWEATHER_API_KEY) BASE_URL http://api.openweathermap.org/data/2.5/weather def get_weather_by_city(city_name: str) - Optional[Dict[str, Any]]: 根据城市名获取天气数据。 参数: city_name: 城市名称如 London 或 北京 返回: 包含格式化天气信息的字典如果出错则返回None。 if not API_KEY: raise ValueError(OPENWEATHER_API_KEY 环境变量未设置) # 构造请求参数 params { q: city_name, appid: API_KEY, units: metric, # 使用公制单位返回摄氏温度 lang: zh_cn # 获取中文天气描述 } try: response requests.get(BASE_URL, paramsparams, timeout10) response.raise_for_status() # 如果状态码不是200抛出HTTPError异常 data response.json() # 检查API返回是否成功 if data.get(cod) ! 200: # 例如城市未找到时cod为404 error_message data.get(message, Unknown error) print(f天气API错误: {error_message}) return None return _format_weather_data(data) except requests.exceptions.Timeout: print(f请求天气API超时: {city_name}) return None except requests.exceptions.RequestException as e: print(f网络请求错误: {e}) return None except ValueError as e: # 包括JSON解析错误 print(f解析天气数据错误: {e}) return None def _format_weather_data(raw_data: Dict[str, Any]) - Dict[str, Any]: 将原始的API响应数据格式化为更友好、易读的结构。 这是提升用户体验的关键一步。 # 主要天气信息 weather_info raw_data[weather][0] main_info raw_data[main] wind_info raw_data.get(wind, {}) # 温度转换和感觉温度计算可选OWM的main里已有feels_like temp main_info[temp] feels_like main_info.get(feels_like, temp) # 构建格式化字典 formatted { city: raw_data[name], country: raw_data[sys].get(country, ), description: weather_info[description], temperature: temp, feels_like: feels_like, humidity: main_info[humidity], pressure: main_info[pressure], wind_speed: wind_info.get(speed, 0), wind_degree: wind_info.get(deg, N/A), icon: weather_info[icon], # 可用于构造图标URL timestamp: raw_data.get(dt) # 数据时间戳 } return formatted def format_weather_message(weather_data: Dict[str, Any]) - str: 将格式化后的天气数据字典转换为一条美观的文本消息。 Telegram支持简单的Markdown和HTML格式这里我们用易读的文本。 if not weather_data: return 抱歉暂时无法获取该城市的天气信息。请检查城市名是否正确或稍后再试。 # 使用emoji让消息更生动 emoji_map { clear: ☀️, clouds: ☁️, rain: ️, snow: ❄️, thunderstorm: ⛈️, drizzle: ️, mist: ️, } icon weather_data[icon] # 简单根据图标代码判断天气类型 weather_emoji ️ # 默认 for key, emoji in emoji_map.items(): if key in icon: weather_emoji emoji break message ( f{weather_emoji} *{weather_data[city]}, {weather_data[country]}* 的天气\n f━━━━━━━━━━━━━━━━━━━━\n f• **状况**: {weather_data[description]}\n f• **温度**: {weather_data[temperature]:.1f}°C\n f• **体感**: {weather_data[feels_like]:.1f}°C\n f• **湿度**: {weather_data[humidity]}%\n f• **气压**: {weather_data[pressure]} hPa\n f• **风速**: {weather_data[wind_speed]} m/s\n f\n数据更新时间戳: {weather_data[timestamp]} ) return message关键点解析错误处理网络请求有无数种失败的可能超时、断线、API限制、城市不存在等。我们用try...except捕获了requests可能抛出的主要异常并在每个环节都做了判断如检查data[cod]。这保证了Bot不会因为一次失败的天气查询而崩溃。数据格式化原始的API数据是给机器看的_format_weather_data函数将其转换成我们程序内部易于处理的字典。而format_weather_message函数则负责将数据转换成面向用户的、友好的文本。将数据处理和呈现分离是保持代码清晰的好习惯。用户体验我们添加了emoji、使用了Markdown加粗(*text*表示斜体**text**表示加粗在Telegram中需设置parse_modeMarkdownV2)让回复的消息更易读。注意Telegram的MarkdownV2有特殊的转义要求对于包含-、.、()等字符的文本需要处理。3. 主Bot逻辑模块 (bot.py)这是机器人的大脑负责处理Telegram的更新。import os import logging from typing import Final from dotenv import load_dotenv from telegram import Update from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes from weather import get_weather_by_city, format_weather_message # 加载.env文件中的环境变量 load_dotenv() # 从环境变量读取Token TOKEN: Final os.getenv(TELEGRAM_BOT_TOKEN) if not TOKEN: raise ValueError(TELEGRAM_BOT_TOKEN 环境变量未设置) # 配置日志便于调试和监控 logging.basicConfig( format%(asctime)s - %(name)s - %(levelname)s - %(message)s, levellogging.INFO ) logger logging.getLogger(__name__) # 定义命令处理函数 async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE): 处理 /start 命令 user update.effective_user welcome_text ( f你好{user.mention_html()}\n\n 我是一个天气查询机器人。\n 你可以直接发送一个城市名给我比如 北京 或 London我就会告诉你那里的当前天气。\n 使用 /help 查看所有可用命令。 ) await update.message.reply_html(welcome_text) async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): 处理 /help 命令 help_text ( *使用说明*\n ━━━━━━━━━━━━━━━━\n • 直接发送城市名查询天气例如上海、New York\n • /start - 开始使用并显示欢迎信息\n • /help - 显示此帮助信息\n • /about - 关于这个机器人\n \n提示城市名请尽量使用英文或标准中文名称对于国外城市加上国家代码可能更准确如 Paris,FR。 ) await update.message.reply_markdown_v2(help_text) async def about_command(update: Update, context: ContextTypes.DEFAULT_TYPE): 处理 /about 命令 about_text ( ️ *天气机器人*\n 版本: 1.0\n 数据来源: OpenWeatherMap\n 这是一个开源的示例项目用于演示如何构建一个Telegram机器人。\n 代码简洁易于理解和扩展。 ) await update.message.reply_markdown_v2(about_text) # 定义处理普通文本消息的函数 async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE): 处理用户发送的文本消息城市名 user_message update.message.text.strip() if not user_message: await update.message.reply_text(请发送一个城市名称。) return logger.info(f用户 {update.effective_user.id} 查询城市: {user_message}) # 显示“正在输入...”提示提升用户体验 await update.message.chat.send_action(actiontyping) # 调用天气查询函数 weather_data get_weather_by_city(user_message) # 格式化并发送结果 reply_message format_weather_message(weather_data) await update.message.reply_markdown_v2(reply_message) async def error_handler(update: Update, context: ContextTypes.DEFAULT_TYPE): 集中处理Bot运行过程中出现的错误 logger.error(f更新 {update} 导致错误: {context.error}) # 这里可以更精细地处理不同类型的错误比如向管理员发送警报 # 对于用户我们发送一个通用的错误信息 if update and update.effective_message: await update.effective_message.reply_text( 抱歉处理你的请求时出了点问题。工程师已经收到通知。 ) def main() - None: 启动Bot的主函数 # 创建Application实例 application Application.builder().token(TOKEN).build() # 注册命令处理器 application.add_handler(CommandHandler(start, start_command)) application.add_handler(CommandHandler(help, help_command)) application.add_handler(CommandHandler(about, about_command)) # 注册消息处理器处理所有非命令的文本消息 # 注意MessageHandler需要放在CommandHandler之后否则命令也会被它捕获 application.add_handler(MessageHandler(filters.TEXT ~filters.COMMAND, handle_message)) # 注册错误处理器 application.add_error_handler(error_handler) # 启动Bot logger.info(Bot正在启动...) # 使用run_polling()来获取更新。对于生产环境可以考虑Webhook方式。 application.run_polling(allowed_updatesUpdate.ALL_TYPES) if __name__ __main__: main()关键点解析异步函数所有处理函数都用了async def定义。这是PTB v20的强制要求确保Bot能高效处理并发。处理器注册顺序CommandHandler必须在MessageHandler之前添加。因为MessageHandler使用了~filters.COMMAND来过滤掉命令消息但如果先添加MessageHandler命令消息可能会先被它捕获尽管有过滤条件但顺序有时会导致意外。按“命令优先”的顺序注册是稳妥的做法。send_action在开始进行可能耗时的操作如网络请求前调用send_action(actiontyping)会让用户的聊天界面显示“对方正在输入...”。这是一个很小的细节但能极大提升用户体验让用户知道Bot已经收到请求并在处理。错误集中处理error_handler函数会捕获Bot运行中未处理的异常。在这里进行统一的日志记录并可以酌情通知用户或管理员。这是保证服务稳定性的重要一环。run_polling这是最简单的启动方式Bot会不断向Telegram服务器询问是否有新消息。适合开发和中小规模部署。对于用户量非常大的BotTelegram推荐使用Webhook模式但配置更复杂。3.4 运行与测试确保你的.env文件已正确配置。在项目根目录下运行python bot.py如果一切正常你会在终端看到日志输出Bot正在启动...。在Telegram中找到你的Bot通过它的用户名发送/start或直接发送一个城市名如Beijing进行测试。4. 进阶优化与功能扩展一个能跑起来的Bot只是开始。要让它在生产环境中稳定、好用还需要考虑更多。4.1 提升稳定性与用户体验加入速率限制防止用户滥用或意外刷屏。PTB提供了AIORateLimiter等扩展你可以轻松地为每个用户或每个聊天设置请求间隔限制。from telegram.ext import AIORateLimiter application ( Application.builder() .token(TOKEN) .rate_limiter(AIORateLimiter(max_retries2)) # 示例 .build() )实现缓存机制天气数据变化没那么快。对于频繁查询的同一城市可以将结果缓存一段时间比如10分钟这能显著减少对OpenWeatherMap API的调用避免触及速率限制同时加快响应速度。可以使用cachetools库实现一个简单的内存缓存或者使用Redis做分布式缓存。更友好的错误提示当用户输入的城市不存在时OpenWeatherMap会返回错误信息。我们应该捕获这个信息并转换成更人性化的回复比如“找不到名为‘某某某’的城市请检查拼写或尝试使用更通用的名称。”支持位置分享Telegram允许用户直接分享实时位置。你可以添加一个处理器来接收Location类型的消息然后根据经纬度反向查询城市天气这比输入城市名更方便。这需要用到OpenWeatherMap的另一个API端点weather?lat{lat}lon{lon}。4.2 功能扩展思路基础天气查询实现后这个机器人可以轻松扩展成你的私人助理多天预报调用OpenWeatherMap的forecastAPI提供未来几天的天气趋势。天气预警订阅让用户订阅某个城市当该城市发布极端天气预警如暴雨、高温时主动推送消息给用户。这需要Bot保存用户的订阅偏好并定时任务去检查天气预警API。多数据源聚合同时查询多个天气API如OpenWeatherMap、和风天气对比数据给出更全面的报告或者当某个源不可用时自动切换。数据持久化使用SQLite或PostgreSQL记录用户的查询历史分析常用城市甚至可以实现“上次查询的城市”这样的快捷功能。国际化根据用户的Telegram语言设置返回对应语言的天气描述。OpenWeatherMap的API支持lang参数。4.3 部署上线开发完成后你需要让Bot 7x24小时运行。传统服务器在云服务器上使用systemd或supervisor来管理进程确保Bot崩溃后能自动重启。这是最直接的方式。容器化部署编写Dockerfile将Bot容器化。这能保证环境一致性并且可以方便地结合Docker Compose或Kubernetes进行编排和管理。Serverless对于查询量有波峰波谷的场景可以考虑将Bot的逻辑部署为Serverless函数如AWS Lambda Google Cloud Functions。但需要注意Telegram的getUpdates轮询模式可能不太适合Serverless需要改为Webhook模式并且要处理好冷启动延迟。5. 常见问题与排查技巧实录在实际开发和运维中你肯定会遇到各种问题。这里记录了一些典型场景和解决方法。5.1 基础问题排查表问题现象可能原因排查步骤与解决方案运行python bot.py后立即报错退出1..env文件不存在或路径不对。2..env文件中的KEY未正确设置。3. 依赖未安装。1. 确认在项目根目录运行且存在.env文件。2. 检查.env文件内容确保TELEGRAM_BOT_TOKEN和OPENWEATHER_API_KEY赋值正确前后没有多余空格。3. 运行pip list检查python-telegram-bot和requests是否已安装。Bot对任何消息都不回复1. Bot未成功启动。2. 处理器注册有误或顺序不对。3. 网络问题无法连接Telegram服务器。1. 查看启动日志确认无报错并看到“Bot正在启动...”。2. 检查bot.py中处理器的注册顺序确保CommandHandler在MessageHandler之前。3. 检查服务器防火墙是否放行了出站连接尤其是某些云服务商的安全组规则。能收到命令回复但发送城市名无反应1.MessageHandler的过滤器设置错误。2.handle_message函数内部出错但被静默处理。1. 检查MessageHandler(filters.TEXT ~filters.COMMAND, ...)这行确保过滤器逻辑正确。2. 在handle_message函数开始和关键步骤添加logger.info打印查看执行流。检查get_weather_by_city函数是否返回了None。返回“抱歉暂时无法获取...”1. 城市名错误拼写、不支持的格式。2. OpenWeatherMap API Key无效或过期。3. 网络超时或OpenWeatherMap服务暂时不可用。1. 尝试使用英文名或“城市,国家代码”格式如Beijing,CN。2. 去OpenWeatherMap官网检查API Key状态确认免费额度未用尽。3. 在服务器上手动用curl命令测试天气API接口是否可通。Bot响应速度慢1. 服务器网络延迟高。2. OpenWeatherMap API响应慢。3. 没有使用异步处理或代码中有阻塞操作。1. 考虑将Bot部署到网络更好的区域。2. 实现缓存机制减少重复API调用。3. 确保所有I/O操作网络请求、数据库查询都使用异步库如aiohttp替代requests并在异步函数中正确使用await。5.2 进阶调试与运维心得日志是你的眼睛一定要用好logging模块。将日志级别设为INFO或DEBUG并输出到文件便于事后分析。记录用户ID、请求内容、API响应时间等对于分析使用情况和排查问题至关重要。logging.basicConfig( levellogging.DEBUG, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(bot.log), logging.StreamHandler() # 同时输出到控制台 ] )处理特殊字符当用户输入的城市名包含-、.、()等字符时在MarkdownV2格式下需要转义否则消息发送会失败。PTB的utils.helpers.escape_markdown函数可以帮你。from telegram.helpers import escape_markdown safe_city_name escape_markdown(city_name, version2)应对API限制OpenWeatherMap免费套餐有每分钟60次的调用限制。如果你的用户量增长很容易触发。除了缓存还可以考虑使用队列asyncio.Queue平滑请求避免突发流量。注册多个OpenWeatherMap账号使用多个API Key进行负载均衡需要更复杂的Key管理逻辑。升级到付费套餐。监控与告警对于正式服务的Bot可以集成简单的健康检查。例如定时向一个特定聊天ID发送心跳消息或者监控日志文件中的错误频率一旦异常就通过Telegram Bot自身或其他渠道如邮件、Slack通知管理员。这个项目就像一颗种子代码本身简洁明了但它清晰地展示了构建一个实用Telegram机器人的完整路径从环境搭建、工具选型、核心逻辑实现到错误处理、用户体验优化和最终部署。沿着这个路径你可以根据自己的想法浇灌出功能各异的“大树”。无论是把它改造成一个新闻推送Bot、一个项目管理助手还是一个智能聊天伴侣其中的原理和模式都是相通的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2606594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…