Python uiautomation 实现微信自动化消息处理
1. 为什么选择 Python uiautomation 来处理微信消息如果你每天需要处理大量重复的微信消息比如客服回复、社群运营或者只是想给自己写个“摸鱼神器”自动回复老板的“在吗”那你肯定想过能不能让程序来干这个活儿。我试过很多方法比如用微信官方接口太麻烦个人号基本申请不到、用模拟器太笨重最后发现用 Python 的uiautomation库来做桌面自动化是最直接、最接近人工操作的一种方式。简单来说uiautomation 就是一个能“看见”并“操控”你电脑桌面上所有窗口、按钮、输入框的 Python 库。它不关心微信内部的协议也不破解什么通信它就像一个坐在你电脑前的“机器人”用鼠标和键盘帮你操作微信客户端。听起来是不是有点“物理外挂”的感觉没错它的原理就是模拟人的操作。正因为如此它有几个特别实在的优点几乎零封号风险因为你没有调用任何违规接口只是模拟点击、上手门槛极低会基础 Python 就行以及功能极其灵活只要是你能手动在微信客户端里完成的操作理论上它都能帮你自动化。当然它也不是万能的。最大的“坑”在于它依赖于微信客户端的界面结构。一旦微信版本更新某个按钮的名字或者位置变了你的脚本可能就“瞎”了需要你重新去“教”它识别。不过别担心这种更新频率并不高而且 uiautomation 提供了强大的“侦查”工具来应对。接下来我就带你从零开始一步步搭建一个能自动处理微信消息的“机器人”我会把我在实际项目中踩过的坑和总结的技巧都分享给你。2. 环境搭建与 uiautomation 初探工欲善其事必先利其器。第一步我们得把“机器人”需要的工具准备好。2.1 安装 Python 与必要的库首先确保你的电脑上安装了 Python。我推荐使用 Python 3.7 或以上版本兼容性更好。安装过程很简单去 Python 官网下载安装包记得勾选“Add Python to PATH”这个选项这样在命令行里就能直接用了。接下来就是安装核心武器——uiautomation 库。打开你的命令行Windows 上是 CMD 或 PowerShellMac/Linux 是终端输入下面这行命令pip install uiautomation如果安装速度慢可以加上国内的镜像源比如清华的源pip install uiautomation -i https://pypi.tuna.tsinghua.edu.cn/simple安装成功后我们可以先写个最简单的“Hello World”来验证一下。这个“Hello World”不是打印文字而是让它帮你打开 Windows 自带的“记事本”程序并输入一句话。这能帮你快速理解它的工作模式。import uiautomation as auto import time # 模拟按下 Win R 打开“运行”对话框 auto.SendKeys({Win}r) time.sleep(0.5) # 稍微等一下等对话框弹出 # 在运行对话框中输入“notepad”并回车打开记事本 auto.SendKeys(notepad{Enter}) time.sleep(1) # 等待记事本完全打开 # 现在找到记事本的窗口。Name 就是窗口标题栏显示的名字“无标题 - 记事本” notepad_window auto.WindowControl(Name无标题 - 记事本) if notepad_window.Exists(3): # 等待3秒看窗口是否存在 # 在记事本里输入一句话 notepad_window.SendKeys(你好我是 uiautomation 机器人) print(操作成功) else: print(没找到记事本窗口。)运行这段代码你会看到电脑自动打开了记事本并输入了文字。是不是很神奇这里的关键是auto.WindowControl(Name...)它就是在“寻找”一个名叫“无标题 - 记事本”的窗口。SendKeys方法就是模拟键盘输入。time.sleep是必要的等待给电脑反应时间这是自动化脚本里最常用的“节奏控制”技巧。2.2 认识你的“侦察兵”Inspect 工具写自动化脚本最核心的一步是告诉程序你要点击哪里你要在哪里输入这就需要获取目标控件按钮、输入框、列表等的“身份证信息”。uiautomation 的作者贴心地提供了一个强大的侦查工具也叫Inspect。在安装 uiautomation 后你可以在 Python 的安装目录下找到它比如Lib\site-packages\uiautomation文件夹里。更简单的方法是在命令行里直接运行python -m uiautomation这会启动一个带图形界面的工具。把鼠标移动到你想操作的控件上比如微信的“发送”按钮这个工具就会实时显示这个控件的所有属性比如Name名称、AutomationIdID、ClassName类名、ControlType控件类型等等。对于微信来说Name属性是最常用、最稳定的识别依据。比如“发送”按钮的 Name 通常是“发送(S)”那个 S 是快捷键提示。我们写脚本时主要就是靠这些属性来“定位”控件。你可以多花点时间用 Inspect 工具把微信聊天窗口的各个部分聊天列表、输入框、发送按钮都侦察一遍记下它们的特征这是后续脚本稳定运行的基础。3. 实战第一步自动打开并登录微信有了前面的基础我们现在正式向微信“进军”。我们的第一个目标是让脚本自动打开微信并完成登录假设你的微信已经设置了“自动登录”。3.1 从桌面或任务栏启动微信打开微信通常有两种方式双击桌面快捷方式或者点击任务栏图标。用 uiautomation 实现起来都很直观。我们先看从桌面打开的方法但更推荐第二种从任务栏打开的方式因为它更稳定不受桌面图标排列的影响。方法一从任务栏打开推荐import uiautomation as auto import time def open_wechat_from_taskbar(): 从 Windows 任务栏打开微信 # 首先定位到任务栏。在 Windows 11 中它的 ClassName 可能是 Shell_TrayWnd 或 Windows.UI.Composition.DesktopWindowContentBridge # 更通用的方法是使用 PaneControl 并指定 Name taskbar auto.PaneControl(Name任务栏) # 中文系统下任务栏的名称 # 如果上述找不到可以尝试用 ClassName 查找auto.PaneControl(ClassNameShell_TrayWnd) if taskbar.Exists(5): # 在任务栏上点击一下确保焦点在任务栏这一步有时可省略但加上更稳妥 taskbar.Click() time.sleep(0.5) # 在任务栏的子控件中寻找名为“微信”的按钮 wechat_button taskbar.ButtonControl(Name微信, searchDepth2) if wechat_button.Exists(3): print(找到微信任务栏图标正在点击...) wechat_button.Click() time.sleep(3) # 等待微信主窗口弹出时间可以设长一点 return True else: print(未在任务栏找到微信图标。请检查微信是否固定在任务栏。) return False else: print(未找到任务栏。) return False # 执行函数 if open_wechat_from_taskbar(): print(微信启动成功) else: print(微信启动失败。)这段代码的关键在于searchDepth参数它表示搜索的深度。有时候控件不是直接的儿子可能是孙子节点加大搜索深度就能找到。如果找不到就用前面介绍的 Inspect 工具去任务栏上仔细看看微信图标的准确属性。方法二直接查找已有窗口如果你的微信已经在后台运行了比如开机自启我们就不需要点击图标而是直接找到它的主窗口并把它“激活”到前台。def activate_wechat_window(): 激活已打开的微信窗口 # 查找名为“微信”的顶层窗口 wechat_window auto.WindowControl(Name微信, searchDepth1) if wechat_window.Exists(3): print(发现微信窗口正在激活...) # SwitchToThisWindow 方法可以将窗口带到前台并聚焦 wechat_window.SwitchToThisWindow() time.sleep(1) return True else: print(没有找到已打开的微信窗口。) return False在实际脚本中我们可以把两种方法结合起来先尝试激活已有窗口如果激活失败再尝试从任务栏打开。这样兼容性更好。3.2 处理登录界面与主界面切换成功打开微信后可能会遇到登录界面如果你没设置自动登录。对于自动化来说处理登录界面尤其是需要扫码或手动输入密码比较复杂且不稳定因此强烈建议在运行自动化脚本的电脑上提前设置好微信的“自动登录”。假设已经自动登录窗口会直接进入微信主界面。主界面左侧有多个选项卡如“聊天”、“通讯录”、“收藏”等。我们的操作主要在“聊天”面板进行。所以激活窗口后我们需要确保当前选中的是“聊天”选项卡。def switch_to_chat_panel(wechat_window): 确保微信主界面停留在‘聊天’面板 # 查找“聊天”按钮。注意它是一个 ButtonControlName 就是“聊天” chat_button wechat_window.ButtonControl(Name聊天) if chat_button.Exists(2): # 获取按钮的“是否被选中”状态。聊天面板激活时这个按钮通常处于“选中”状态。 # 我们可以通过点击来确保它被选中但频繁点击可能没必要。 # 更优雅的方式是判断如果没选中再点击。 # 这里为了简单我们先获取它的状态如果支持或者直接点击。 # 实际上如果窗口刚打开聊天面板默认就是激活的。这里我们直接点击一次。 chat_button.Click() time.sleep(0.5) print(已切换到聊天面板。) return True else: print(未找到聊天按钮界面可能异常。) return False完成了这一步我们的“机器人”就已经成功坐在了微信的“聊天”界面面前准备开始读取和回复消息了。4. 核心功能读取与解析聊天消息这是整个自动化流程中最关键也最有技巧性的一步。我们需要从聊天列表中定位到特定的会话并从中提取出最新的消息内容。4.1 定位会话列表与特定聊天在微信主窗口的“聊天”面板左侧是一个纵向排列的会话列表。用 Inspect 工具查看你会发现它是一个ListControl里面的每一个会话项可能是一个ListItemControl或类似的控件。def get_chat_list(wechat_window): 获取聊天会话列表 # 查找会话列表。它的 Name 通常是“会话”类型是 ListControl session_list wechat_window.ListControl(Name会话, searchDepth3) if session_list.Exists(3): print(成功找到会话列表。) # GetChildren() 方法可以获取这个列表下的所有直接子项即一个个会话 all_sessions session_list.GetChildren() print(f当前共有 {len(all_sessions)} 个会话在列表中。) return all_sessions else: print(未找到会话列表。请检查微信界面是否正常。) return [] # 假设我们已经有了 wechat_window 对象 sessions get_chat_list(wechat_window) if sessions: # 打印第一个会话的名字通常是联系人或群名以及最后一条消息预览 print(第一个会话名称, sessions[0].Name)sessions[0].Name返回的字符串信息量很大它通常包含“联系人名称/群名” “: ” “最后一条消息的预览”以及可能有“[数字]条新消息”这样的未读标记。例如“技术交流群: 老王今晚八点开会[3条新消息]”。我们需要解析这个字符串。4.2 提取未读消息与消息内容我们的自动化往往是针对新消息未读消息进行的。如何判断一个会话有新消息呢就是通过解析Name属性。def find_unread_sessions(sessions): 从会话列表中找出包含未读消息的会话 unread_list [] for session in sessions: session_name session.Name # 判断名称中是否包含“条新消息”这个特征字符串 if 条新消息 in session_name: # 使用正则表达式提取未读条数 import re match re.search(r\[(\d)条新消息\], session_name) unread_count int(match.group(1)) if match else 1 # 提取联系人/群名去除未读标记部分 contact_name session_name.split([)[0].strip() unread_list.append({ control: session, # 会话控件本身方便后续点击 name: contact_name, unread_count: unread_count, full_name: session_name }) print(f发现未读会话{contact_name}有 {unread_count} 条新消息。) return unread_list找到未读会话后我们需要点击它进入聊天窗口才能看到具体的消息内容。点击后右侧的消息面板会刷新。def enter_chat_and_get_messages(session_control): 点击进入特定会话并获取消息列表 # 点击该会话 session_control.Click() time.sleep(1) # 等待消息面板加载 # 现在消息面板右侧已经切换到了这个会话。 # 我们需要找到消息列表。它的 Name 通常是“消息”也是一个 ListControl。 # 注意此时搜索的起点应该是整个微信主窗口因为消息面板是窗口的一部分。 wechat_window auto.GetRootControl() # 获取当前焦点窗口的根控件或者用之前保存的窗口变量 message_list wechat_window.ListControl(Name消息, searchDepth4) if message_list.Exists(3): # 获取所有消息子项 all_message_items message_list.GetChildren() print(f本次会话共有 {len(all_message_items)} 条消息可能包含历史消息。) # 通常最新消息在列表的最后。但微信的消息列表是倒序排列吗需要实测。 # 更稳妥的方式是我们只处理那些可能是新消息的项。 # 新消息的控件特征可能不同例如背景色但通过uiautomation获取颜色较复杂。 # 一个简单策略获取最后 N 条消息N 等于之前检测到的未读条数。 # 这里我们先返回最后一条消息的内容看看。 if all_message_items: latest_msg_control all_message_items[-1] latest_msg_content latest_msg_control.Name print(f最新一条消息内容{latest_msg_content}) return all_message_items, latest_msg_content else: print(进入会话后未找到消息列表。) return [], 这里有个大坑需要注意微信消息列表的结构比较复杂。一条消息可能由多个控件组成头像、昵称、时间、内容气泡。all_message_items[-1].Name获取到的可能只是消息的一部分比如纯文本内容也可能包含了发送者名字。你需要根据 Inspect 工具的实际侦查结果来决定如何精确提取“纯消息内容”。有时需要获取消息控件的子控件或者使用LegacyIAccessible模式下的Value属性。5. 实现智能自动回复获取到消息内容后我们就可以根据内容来决定如何回复了。这里可以分为“固定回复”和“智能回复”两种模式。5.1 定位输入框与发送按钮无论哪种回复第一步都是找到输入框把回复内容“敲”进去然后点击发送。def send_reply(text_to_send): 在当前激活的聊天窗口中发送指定文本 # 找到消息输入框。它的 Name 可能是“输入”或者 ClassName 是“Edit” # 用 Inspect 工具确认最准确。这里假设 Name 为“输入” input_box auto.WindowControl(Name微信).EditControl(Name输入, searchDepth4) if input_box.Exists(2): # 点击输入框确保焦点 input_box.Click() time.sleep(0.2) # 清空输入框可选但有时输入框有残留内容 # 全选然后删除CtrlA, Delete auto.SendKeys(^a{Delete}) time.sleep(0.2) # 输入要发送的文本 input_box.SendKeys(text_to_send) time.sleep(0.5) print(f已输入回复内容{text_to_send}) else: print(未找到消息输入框。) return False # 找到发送按钮并点击 send_button auto.WindowControl(Name微信).ButtonControl(Name发送(S), searchDepth4) if send_button.Exists(2): send_button.Click() time.sleep(0.5) print(消息发送成功) return True else: print(未找到发送按钮。) # 作为备选方案可以尝试按键盘回车键发送 auto.SendKeys({Enter}) print(已尝试使用回车键发送。) return True5.2 设计回复逻辑从关键词匹配到接入大模型最简单的自动回复就是关键词匹配。比如有人问“在吗”你就自动回复“您好我在请讲。”def simple_keyword_reply(received_msg): 简单的关键词匹配回复 received_msg received_msg.lower() # 转为小写方便匹配 if 在吗 in received_msg or 在么 in received_msg: return 您好我在的请问有什么可以帮您 elif 你好 in received_msg or 您好 in received_msg: return 你好 elif 价格 in received_msg: return 产品价格表请查看我们的官网www.example.com。 elif 谢谢 in received_msg or 感谢 in received_msg: return 不客气这是我应该做的 else: # 如果都不匹配可以返回一个默认回复或者返回 None 表示不回复 return None如果你想让回复变得更智能可以接入大语言模型的 API比如 OpenAI 的 GPT 或国内的一些大模型服务。这样你的微信机器人就真的能“聊天”了。import openai # 需要先安装 openai 库pip install openai def get_ai_reply(received_msg, api_key): 调用 OpenAI API 获取智能回复示例 # 注意使用任何 API 都需要遵守其服务条款并注意数据隐私。 openai.api_key api_key try: response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: system, content: 你是一个友好的微信助手回复简洁亲切。}, {role: user, content: received_msg} ], max_tokens150, temperature0.7 ) reply response.choices[0].message.content.strip() return reply except Exception as e: print(f调用AI接口出错{e}) return 抱歉我刚才走神了能再说一遍吗在实际应用中你可以将两种方式结合先进行关键词匹配如果匹配不上再调用 AI 接口。同时一定要为 AI 回复加上安全过滤避免生成不合适的内容。6. 打造完整的自动化消息处理循环现在我们把所有模块像拼乐高一样组合起来形成一个可以持续运行的自动化循环。这个循环会定期检查是否有新消息并自动回复。6.1 主循环结构与错误处理一个健壮的循环需要包含状态检查、错误捕获、日志记录和适当的休眠。import uiautomation as auto import time import logging from datetime import datetime # 配置日志方便查看运行情况和排查问题 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) def main_automation_loop(check_interval10, max_cycles100): 主自动化循环 cycle_count 0 logger.info(微信消息自动化处理机器人启动...) # 1. 首先确保微信窗口是激活状态 if not activate_wechat_window(): logger.info(尝试从任务栏打开微信...) if not open_wechat_from_taskbar(): logger.error(无法启动或找到微信窗口程序退出。) return # 给微信一点启动时间 time.sleep(5) if not switch_to_chat_panel(auto.WindowControl(Name微信)): logger.error(微信启动后无法切换到聊天面板。) return wechat_win auto.WindowControl(Name微信) while cycle_count max_cycles: cycle_count 1 current_time datetime.now().strftime(%H:%M:%S) logger.info(f--- 开始第 {cycle_count} 轮检查 [{current_time}] ---) try: # 2. 获取当前所有会话 sessions get_chat_list(wechat_win) if not sessions: logger.warning(未获取到任何会话可能界面异常等待下次循环。) time.sleep(check_interval) continue # 3. 找出有未读消息的会话 unread_sessions find_unread_sessions(sessions) if not unread_sessions: logger.info(本轮未发现未读消息。) else: logger.info(f发现 {len(unread_sessions)} 个未读会话。) # 4. 遍历每个未读会话进行处理 for unread in unread_sessions: logger.info(f正在处理会话{unread[name]}) # 点击进入该会话 unread[control].Click() time.sleep(1.5) # 等待消息加载 # 5. 获取最新消息内容这里简化处理只取最后一条 _, latest_msg enter_chat_and_get_messages(unread[control]) if latest_msg: logger.info(f收到消息{latest_msg}) # 6. 决定回复内容 reply_text simple_keyword_reply(latest_msg) # 如果想用AI回复可以在这里调用reply_text get_ai_reply(latest_msg, your_api_key) if reply_text: # 7. 发送回复 if send_reply(reply_text): logger.info(f已自动回复{reply_text}) else: logger.error(回复发送失败。) else: logger.info(未匹配到关键词本次不回复。) else: logger.warning(未能提取到消息内容。) # 8. 处理完一个会话后可以按一下 ESC 键让键盘焦点离开输入框方便后续操作可选 # auto.SendKeys({Esc}) time.sleep(1) # 9. 本轮处理完毕等待一段时间后再次检查 logger.info(f第 {cycle_count} 轮检查处理完毕等待 {check_interval} 秒后继续。\n) time.sleep(check_interval) except Exception as e: # 捕获所有异常避免程序因单次错误而崩溃 logger.error(f在处理过程中发生未知错误{e}, exc_infoTrue) logger.info(程序将暂停10秒后继续尝试...) time.sleep(10) logger.info(f已完成最大循环次数 {max_cycles}程序正常退出。) if __name__ __main__: # 设置每30秒检查一次新消息总共运行100个循环约50分钟 main_automation_loop(check_interval30, max_cycles100)6.2 提升脚本稳定性的高级技巧直接运行上面的脚本你可能会遇到各种“小毛病”。下面是我踩过坑后总结的几个保命技巧增加等待与重试机制网络卡顿、电脑慢都会导致控件加载不出来。不要只用Exists(2)可以在外面包一个循环重试。def wait_for_control(control, timeout10, interval0.5): 等待某个控件出现 start time.time() while time.time() - start timeout: if control.Exists(0): return True time.sleep(interval) return False使用更稳定的控件识别属性除了Name可以结合AutomationId、ClassName和ControlType来定位。Inspect工具里可以看到这些属性。使用Control的searchDepth和foundIndex参数进行更精确的查找。# 例如通过多个条件定位发送按钮 send_btn wechat_win.ButtonControl(searchDepth4, ClassNameButton, Name发送(S))应对微信界面变化微信更新后控件属性可能会变。一个好的实践是将所有的控件定位信息如 Name、ClassName提取到配置文件或字典中一旦需要修改只改一个地方。WE_CHAT_CONFIG { window_name: 微信, chat_button_name: 聊天, session_list_name: 会话, message_list_name: 消息, input_box_name: 输入, send_button_name: 发送(S) }防封号注意事项虽然 uiautomation 模拟人工操作风险极低但仍需注意不要高频发送消息在循环中设置较长的间隔如30秒以上。不要发送营销、广告、违规内容。避免在深夜等非正常时间持续运行。最好用于处理个人或小范围内部消息避免大规模对外群发。7. 扩展思路不止于自动回复掌握了核心的“读消息-回消息”循环你就可以在此基础上玩出很多花样。场景一消息监控与转发你可以修改脚本不回复而是将特定联系人比如老板的消息或者包含特定关键词如“紧急”的消息转发到你的另一个微信、邮箱或者通过 Server 酱等工具推送到手机。场景二自动化测试如果你是微信相关产品的开发者可以用这套脚本构建自动化测试用例测试各种消息收发、界面跳转是否正常大大提高测试效率。场景三数据统计与分析定期运行脚本将所有群聊或特定联系人的消息记录通过读取消息列表保存到数据库或 Excel 中用于分析聊天活跃度、热词等。场景四结合其他自动化工具uiautomation 可以和你其他的 Python 脚本联动。比如收到“发送报告”指令后脚本可以自动打开 Excel生成数据图表然后通过微信文件传输助手发回给自己。我最初写这个脚本只是为了自动回复一些常见的客服问题解放双手。但在实际使用中我发现它的潜力远不止于此。关键在于你有了一个能够“看见”和“操作”电脑桌面的能力这就像给你的 Python 脚本装上了眼睛和手。剩下的就取决于你的想象力了。当然每次微信大版本更新后记得用 Inspect 工具重新“侦察”一下战场花几分钟调整一下控件的定位信息你的机器人就又能稳定服役了。

相关新闻

NFS硬挂载vs软挂载避坑指南:timeo参数设置与网络闪断处理的正确姿势

NFS硬挂载vs软挂载避坑指南:timeo参数设置与网络闪断处理的正确姿势

NFS硬挂载与软挂载深度解析:从timeo参数调优到网络闪断的实战应对策略 在分布式开发测试环境中,NFS(Network File System)几乎是绕不开的基础设施。它让多台机器共享同一份存储变得简单,但这份“简单”背后&#xff0c…

2026/5/17 12:01:12 阅读更多 →
Nomic-Embed-Text-V2-MoE模型微调教程:适配垂直领域术语

Nomic-Embed-Text-V2-MoE模型微调教程:适配垂直领域术语

Nomic-Embed-Text-V2-MoE模型微调教程:适配垂直领域术语 你是不是也遇到过这样的问题?一个通用的文本嵌入模型,在处理你所在行业的专业文档时,表现总是不尽如人意。比如,你是做生物医药的,模型可能无法准确…

2026/5/17 12:01:11 阅读更多 →
BEYOND REALITY Z-Image精度突破:BF16下8K写实纹理重建能力技术白皮书

BEYOND REALITY Z-Image精度突破:BF16下8K写实纹理重建能力技术白皮书

BEYOND REALITY Z-Image精度突破:BF16下8K写实纹理重建能力技术白皮书 1. 项目概述 BEYOND REALITY Z-Image 创作引擎是基于 Z-Image-Turbo 底座与 BEYOND REALITY SUPER Z IMAGE 2.0 BF16 专属模型构建的高精度写实文生图系统。这一技术方案专门针对8K级写实图像…

2026/7/6 1:52:19 阅读更多 →

最新新闻

2026年同声传译软件免费额度实测对比,差距竟然这么大谁才好用?

2026年同声传译软件免费额度实测对比,差距竟然这么大谁才好用?

先说结论:这类工具怎么选 没有万能的同声传译软件,2026年实测下来五款主流工具的免费额度差距确实超出预期。针对知识付费用户消化付费课程、整理播客内容、巩固学习效果的核心需求,不同工具的适配性完全不同。不要盲目追大厂,不…

2026/7/6 4:32:21 阅读更多 →
压榨机器,Hack,设计极限强度的网络应用

压榨机器,Hack,设计极限强度的网络应用

在《对话网友 - TCP一万连接系统设计》文后回复中,短短的评论不足以说明问题,于是单独撰文解释。 对于一般的应用来说,操作系统足以对付,对于极限应用来说,操作系统往往就成了我们的障碍,这里的障碍有两个意…

2026/7/6 4:32:20 阅读更多 →
基于LangGraph的Agentic RAG智能问答系统构建指南

基于LangGraph的Agentic RAG智能问答系统构建指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在准备 AI 大模型应用开发工程师的面试,或者想从零开始构建一个能真正落地的智能问答系统,那么这篇文…

2026/7/6 4:30:20 阅读更多 →
2026技术路线图模板,国自然青基高分热门技术路线图流程图ppt/word/visio模板合集 含ppt+word+Visio可编辑版,pdf和jpg参考学习速览版,共计399款

2026技术路线图模板,国自然青基高分热门技术路线图流程图ppt/word/visio模板合集 含ppt+word+Visio可编辑版,pdf和jpg参考学习速览版,共计399款

2026技术路线图模板,国自然青基高分热门技术路线图流程图ppt/word/visio模板合集 含pptwordVisio可编辑版,pdf和jpg参考学习速览版,共计399款 399款技术路线图模板含pptwordVisio可编辑版 提取码: ek4e 项目合集(项目不断更新中,包含java、vue、pyth…

2026/7/6 4:30:20 阅读更多 →
Codex、Cursor、GitHub Copilot 怎么选?2026 AI 编程工具横向对比与 Pro 升级建议

Codex、Cursor、GitHub Copilot 怎么选?2026 AI 编程工具横向对比与 Pro 升级建议

Codex、Cursor、GitHub Copilot 怎么选?2026 AI 编程工具横向对比与 Pro 升级建议 更新时间:2026 年 7 月 5 日。AI 编程产品的模型、套餐和额度变化很快,购买前请再次查看官方页面与产品内模型选择器。 “Codex、Cursor 和 GitHub Copilot 哪…

2026/7/6 4:26:19 阅读更多 →
Power BI DAX上下文与CALCULATE实战指南

Power BI DAX上下文与CALCULATE实战指南

1. 这不是“又一个DAX教程”——它是一份能让你在真实业务场景里立刻写出有效公式的生存指南Power BI DAX Tutorial for Beginners 这个标题背后藏着的,不是一套PPT式概念罗列,而是一群每天被销售漏斗断层、库存周转失真、客户复购率口径打架折磨得睡不着…

2026/7/6 4:24:19 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻