企业微信消息接入最小可行Demo:Python Flask原生实现接收-解密-响应闭环
简介本资源是一个基于Spring Boot的企业微信对接实战示例项目面向Java后端开发者及企业级应用集成学习者聚焦解决企业微信消息接收、签名验证与自动回复等核心接入问题。项目以轻量级工程结构呈现共152个文件涵盖20个Java源码如WeChatController、MessageUtil、WXBizMsgCrypt等关键类、99个XML配置与消息模板、20个编译后class文件以及properties配置、MD说明文档等总大小仅176KB便于快速导入与调试。已有1229人学习下载反映出其在企业微信API实践中的高参考价值。读者可直接复用消息解析XMLParse、加解密SHA1、PKCS7Encoder、URL校验CheckUrlController及文本响应TextMessage等模块掌握从配置注册、事件处理到安全签名的完整链路是理解企业微信服务端集成机制的优质入门与教学范例。1. 企业微信消息自动回复 Demo一个能跑通接收解析响应闭环的最小可验证包你花半天配好企业微信应用、填完可信域名、下载证书、写完回调验证逻辑结果第一条用户消息发过来日志里只有一行400 Bad Request—— 这不是玄学是绝大多数人卡在「接入完成但收不到消息」的第一道墙。demoProject.zip就是为撕掉这层纸而生它不讲 OAuth2 授权流程不堆 Webhook 配置截图也不依赖任何第三方 SDK而是用最朴素的 Python Flask 实现了一个完整的消息生命周期闭环——从企业微信 POST 原始加密 XML 到服务端到解密、验签、解析事件/文本消息再到构造合法响应 XML 并返回。它面向的是刚拿到企业微信管理后台权限、手握 CorpID/Secret、却连「怎么让企业微信把消息真正推过来」都搞不定的开发者。压缩包里只有 3 个核心文件app.py主服务、crypto.py官方 AES 解密封装、config.py4 行配置没有requirements.txt之外的隐藏依赖也没有需要手动编译的 C 扩展。如果你正被「消息接收失败」「解密报错 invalid padding」「响应后企业微信提示『不支持的消息类型』」反复折磨这个包就是你的后悔药——它不解决所有问题但能让你在 15 分钟内确认是自己的网络/配置问题还是代码逻辑问题。2. 为什么选 Flask 原生 Crypto 而非企业微信 SDK轻量可控才是调试关键2.1 企业微信官方 SDK 的隐性成本与调试盲区企业微信官方 Python SDKwecom-sdk看似省事但实际落地时会埋下三类坑第一它默认启用urllib3连接池和重试机制在调试阶段反而掩盖了Connection refused或Timeout的真实原因第二其WXBizMsgCrypt类对msg_signature、timestamp、nonce的校验逻辑封装过深当验签失败时你只能看到InvalidSignatureException却无法知道是时间戳偏差超 5 分钟、还是 nonce 未参与签名计算第三SDK 的decrypt_msg方法直接返回明文 dict丢失了原始 XML 结构而企业微信某些特殊事件如eventchange_external_contact的字段嵌套极深结构化解析反而容易漏掉ChangeType等关键标识。某开发者曾因 SDK 自动将Eventcreate/Event转成event: create却忽略ChangeTypeadd_follow_user/ChangeType导致自动加好友逻辑完全失效——这种黑匣子式封装在生产环境是效率利器在调试期就是灾难源头。2.2demoProject.zip的精简设计哲学每行代码都可打断点本项目彻底放弃 SDK选择 Flask 作为 Web 框架核心逻辑仅依赖cryptography库AES-CBC 解密和标准库xml.etree.ElementTree。这种「裸写」带来三个确定性优势验签逻辑完全暴露crypto.py中verify_url方法逐行实现 SHA1 签名比对你可以直接在sha1 hashlib.sha1()后加print(fSHA1 input: {tmpstr})亲眼看到参与签名的字符串拼接顺序token timestamp nonce encrypt解密错误可定位到字节级当InvalidPaddingException报错时crypto.py的decrypt方法中cipher.decrypt(encrypted)返回的原始字节流可被完整打印你能确认是否因 Base64 解码失败导致字节长度非 16 倍数响应 XML 严格遵循协议规范app.py中build_response_xml函数不使用dict2xml等通用转换器而是硬编码xmlToUserName![CDATA[...]]/ToUserName.../xml确保 CDATA 包裹、标签大小写、空格换行完全匹配企业微信文档示例。提示cryptography库需单独安装pip install cryptography它比pycryptodome更轻量且无编译依赖Windows/macOS/Linux 全平台 wheel 包开箱即用。不要用pycrypto已废弃或M2Crypto依赖 OpenSSL 编译否则你会在pip install阶段就翻车。2.3 四行配置决定整个接入成败CorpID/Token/EncodingAESKey 的绑定关系config.py是整个项目的命门仅 4 行却承载全部身份凭证CORP_ID wwxxxxxxxxxxxxxx # 企业微信后台「我的企业」页获取 TOKEN your_token_here # 应用设置中自定义的 Token需与后台一致 ENCODING_AES_KEY abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG # 43位后台生成 SECRET your_app_secret # 应用详情页的 Secret用于后续 access_token 获取关键细节在于ENCODING_AES_KEY它必须是 43 位字符串含大小写字母数字且必须与企业微信管理后台「应用管理」→「自建应用」→「接收消息」→「启用接收消息」中填写的 EncodingAESKey 完全一致。常见错误是复制时多出空格、或后台生成后未及时保存导致 Key 不匹配。TOKEN同理——它不是随机字符串而是你在后台「接收消息」配置页手动输入并保存的那个值后续所有签名计算都基于它。CORP_ID和SECRET虽不参与消息加解密但SECRET是后续调用get_access_token接口的必要凭证CORP_ID则用于构造ToUserName字段格式为CORPID。这四行配置一旦写错任意一个字符整个消息链路就会静默失败日志里不会报错只会收不到消息。3. 从零启动服务5 步完成本地调试与公网穿透验证3.1 本地运行Flask 开发服务器的最小化配置解压demoProject.zip后进入目录执行pip install flask cryptography python app.py此时 Flask 默认监听http://127.0.0.1:5000/callback。但企业微信无法访问本地地址因此必须进行下一步。注意app.py中app.run()已禁用debugTrue因为调试模式会启用重载进程导致WXBizMsgCrypt实例被重复初始化引发签名密钥错乱。生产环境务必改用gunicorn或uWSGI但调试阶段python app.py足够。3.2 公网穿透为什么 ngrok 是比 frp 更安全的调试选择企业微信要求回调 URL 必须是 HTTPS 协议且域名已备案国内云厂商限制但调试阶段无需备案。ngrok提供免费 HTTPS 隧道且其ngrok http 5000生成的https://xxx.ngrok.io域名被企业微信白名单收录无需额外配置。执行# 下载 ngrok官网注册获取 authtoken ./ngrok http 5000终端会输出类似Forwarding https://abc123.ngrok.io - http://localhost:5000的信息。将https://abc123.ngrok.io/callback填入企业微信后台「应用管理」→「自建应用」→「接收消息」→「URL」栏Token和EncodingAESKey填写与config.py中完全一致的值点击「保存」。提示ngrok的免费版有连接时长限制约 2 小时但足够完成首次验证。若需长期调试可切换至cloudflaredCloudflare Tunnel它同样提供免费 HTTPS 隧道且无时长限制配置命令为cloudflared tunnel --url http://localhost:5000。3.3 后台配置企业微信管理端的四个必填项与一个隐藏开关在「接收消息」配置页除 URL、Token、EncodingAESKey 外还有两个易忽略项消息加解密方式必须选择「双向加密」而非明文模式否则企业微信不会对消息体加密你的解密逻辑会因encrypt字段为空而崩溃服务器配置验证点击「保存」后企业微信会立即向你的 URL 发起GET请求携带msg_signature、timestamp、nonce、echostr四个参数。app.py中/callback路由已实现该逻辑提取echostr用WXBizMsgCrypt的verify_url方法验签若通过则原样返回echostr。这是唯一一次GET请求成功即表示基础连通性 OK。注意「接收消息」开关必须手动开启默认关闭。很多开发者填完 URL 就以为万事大吉其实开关没点企业微信根本不会推送任何消息。3.4 消息触发用企业微信客户端发送测试消息的正确姿势验证回调成功后需触发真实消息在企业微信管理后台「应用管理」→「自建应用」→「可见范围」中将当前应用授权给至少一个成员如你自己用该成员的手机企业微信客户端进入「工作台」→ 找到你的应用图标 → 点击进入在应用内直接发送文字消息如「你好」。切勿用管理员账号在后台「测试」按钮发送——该按钮发送的是系统事件格式与用户消息不同且不走加密通道。此时app.py的日志会打印Received encrypted msg: xxxxx... Decrypted XML: xmlToUserName![CDATA[ww...]]/ToUserNameFromUserName![CDATA[Em...]]/FromUserNameContent![CDATA[你好]]/Content/xml Sending response: xmlToUserName![CDATA[Em...]]/ToUserNameFromUserName![CDATA[ww...]]/FromUserNameMsgType![CDATA[text]]/MsgTypeContent![CDATA[收到你好]]/Content/xml若看到Decrypted XML和Sending response说明接收-解密-响应闭环已通。3.5 响应构造为什么必须严格遵循 XML 格式与 CDATA 规则企业微信对响应 XML 的格式要求苛刻到字节级ToUserName必须是发送消息用户的UserID如EmXXXXX而非 CorpIDFromUserName必须是你的 CorpID如wwXXXXX且需加前缀wwXXXXX所有文本内容Content、ToUserName等必须包裹在![CDATA[...]]中否则特殊字符如、会导致 XML 解析失败MsgType只能是text、image、voice等预定义值不能是message或string整个 XML 必须以xml开头/xml结尾无 BOM 头UTF-8 编码。app.py中build_response_xml函数硬编码这些规则def build_response_xml(to_user, from_user, content): return fxml ToUserName![CDATA[{to_user}]]/ToUserName FromUserName![CDATA[{from_user}]]/FromUserName CreateTime{int(time.time())}/CreateTime MsgType![CDATA[text]]/MsgType Content![CDATA[{content}]]/Content /xml若你修改为json.dumps({content: content})或漏掉![CDATA[企业微信会静默丢弃响应客户端无任何提示。4. 避坑指南5 条血泪经验总结的高频失败场景4.1 现象回调 URL 保存时提示「请求超时」或「无效的 URL」原因企业微信在保存时会发起GET请求验证连通性但你的本地服务未启动或ngrok进程已断开或防火墙拦截了 5000 端口。解决先执行python app.py确保服务运行再启动ngrok http 5000最后在后台粘贴https://xxx.ngrok.io/callback并保存。检查ngrok终端是否有online状态提示。4.2 现象保存成功但发送消息后服务端无任何日志企业微信客户端显示「消息发送失败」原因应用未授权给发送者。企业微信强制校验消息发送者的 UserID 是否在应用「可见范围」内未授权则直接拦截不发请求。解决登录企业微信管理后台 →「应用管理」→「自建应用」→「可见范围」→ 点击「编辑」→ 添加测试用的成员支持按部门或个人添加→ 保存。4.3 现象日志出现InvalidSignatureException: signature is invalid原因TOKEN值不一致。常见于复制粘贴时前后带空格或后台配置的 Token 与config.py中的TOKEN字符串不完全相同注意大小写。解决在app.py的verify_url调用前加一行print(fConfig TOKEN: {config.TOKEN}, Request TOKEN: {request.args.get(msg_signature)})对比二者是否完全一致。用len()检查长度用repr()查看不可见字符。4.4 现象解密时报ValueError: Input strings must be a multiple of 16 in length原因encrypt字段 Base64 解码失败。企业微信 POST 的 XML 中Encrypt标签内容是 Base64 编码的密文若网络传输中发生截断如 Nginx 默认client_max_body_size 1m或前端代理误处理换行符会导致解码后字节数非 16 倍数。解决在crypto.py的decrypt方法中base64.b64decode(encrypt)后加print(fEncrypted len: {len(decoded)})正常应为 16 的倍数如 256、512。若异常检查反向代理配置或临时将app.py中app.route(/callback, methods[POST])改为app.route(/callback, methods[POST], strict_slashesFalse)并重启。4.5 现象消息成功接收并解密但响应后客户端无回复日志显示Sending response: xml...原因响应 XML 格式错误。最常见的是ToUserName写成了 CorpIDwwXXXXX而非发送者 UserIDEmXXXXX或漏掉![CDATA[导致符号被 XML 解析器当作实体引用。解决将build_response_xml返回的字符串完整复制用在线 XML 格式化工具如https://www.freeformatter.com/xml-formatter.html验证是否为合法 XML。重点检查ToUserName值是否与日志中FromUserName即发送者一致。5. 消息路由与业务逻辑注入如何在解密后安全分发不同类型消息5.1 从 XML 解析到结构化数据避免xml.etree.ElementTree的陷阱企业微信消息 XML 结构复杂同一标签名在不同消息类型下含义不同。例如Event在text消息中不存在但在eventchange_external_contact中是核心字段。直接root.find(Event).text会因None报错。demoProject.zip采用防御式解析def parse_xml(xml_str): root ET.fromstring(xml_str) msg {} for child in root: # 对于可能为空的字段统一设为 None msg[child.tag] child.text if child.text else None # 特殊处理 CDATA 中的嵌套 XML如 event 消息中的 ChangeType if msg.get(Event) change_external_contact: # 解析 ChangeTypeadd_follow_user/ChangeType change_type_elem root.find(ChangeType) msg[ChangeType] change_type_elem.text if change_type_elem is not None else None return msg此方法确保msg字典始终包含所有顶层标签缺失字段值为None业务逻辑可通过if msg.get(Event) xxx:安全判断无需try/except。5.2 消息类型路由表用字典映射替代 if-else 链随着业务增长消息类型会增多text、image、eventsubscribe、eventunsubscribe、eventchange_external_contact。硬编码if msg[MsgType] text: ... elif msg[Event] subscribe: ...易维护。demoProject.zip提供可扩展的路由注册机制# router.py MESSAGE_HANDLERS {} def register_handler(msg_type, eventNone): def decorator(func): key f{msg_type}:{event} if event else msg_type MESSAGE_HANDLERS[key] func return func return decorator register_handler(text) def handle_text(msg): return f收到文字{msg[Content]} register_handler(event, subscribe) def handle_subscribe(msg): return f欢迎关注您的 UserID 是 {msg[FromUserName]} # 在 app.py 中调用 def get_response_content(msg): key f{msg[MsgType]}:{msg.get(Event)} handler MESSAGE_HANDLERS.get(key) or MESSAGE_HANDLERS.get(msg[MsgType]) return handler(msg) if handler else 暂不支持该消息类型新增类型只需添加register_handler装饰器无需修改主逻辑符合开闭原则。5.3 敏感操作防护为什么自动回复不能直接调用send_message很多开发者在收到text消息后立刻用requests.post(https://qyapi.weixin.qq.com/cgi-bin/message/send, ...)推送回复。这存在两大风险频率限制企业微信接口有 QPS 限制通常 20 次/秒高并发时429 Too Many RequestsToken 过期access_token有效期 2 小时需缓存并自动刷新手动管理极易出错。demoProject.zip不包含发送逻辑但提供安全调用范式# utils.py import time import requests class AccessTokenManager: def __init__(self, corp_id, secret): self.corp_id corp_id self.secret secret self._token None self._expires_at 0 def get_token(self): if time.time() self._expires_at: resp requests.get( fhttps://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid{self.corp_id}corpsecret{self.secret} ) data resp.json() self._token data[access_token] self._expires_at time.time() data[expires_in] - 60 # 提前 60 秒刷新 return self._token # 使用时 atm AccessTokenManager(config.CORP_ID, config.SECRET) token atm.get_token() # 安全获取有效 token此封装自动处理过期与刷新调用方只需关心业务逻辑。5.4 日志与监控在关键节点埋点的三个黄金位置生产环境必须可观测demoProject.zip在以下位置强制打日志接收入口app.py中app.route(/callback)函数开头记录request.method、request.headers.get(Content-Type)、request.data[:200]前 200 字节原始数据用于确认是否收到请求解密后parse_xml返回后记录msg[MsgType]、msg.get(Event)、msg.get(Content, )[:50]内容前 50 字快速定位消息类型与内容响应前build_response_xml调用前记录to_user、from_user、content三元组确保响应目标正确。提示日志级别设为INFO避免DEBUG级别泄露敏感信息如完整encrypt字段。用logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s)统一管理。6. 从 Demo 到生产三个必须加固的安全与稳定性动作6.1 输入验证为什么不能信任企业微信传来的任何字段企业微信虽为可信来源但其消息体仍可能含恶意内容。demoProject.zip的parse_xml仅做结构化解析未过滤输入。生产环境必须加固Content字段 XSS 防护若自动回复内容会渲染到网页需对msg[Content]调用html.escape()FromUserName长度限制企业微信 UserID 最长 64 字符超过则视为异常拒绝处理CreateTime时间戳校验abs(int(msg[CreateTime]) - time.time()) 3005 分钟偏差则丢弃防重放攻击。def validate_message(msg): if not msg.get(FromUserName) or len(msg[FromUserName]) 64: return False, Invalid FromUserName if not msg.get(CreateTime): return False, Missing CreateTime if abs(int(msg[CreateTime]) - time.time()) 300: return False, CreateTime out of range return True, OK在app.py的/callback路由中parse_xml后立即调用此函数失败则返回空响应企业微信会重试。6.2 错误隔离用独立进程处理耗时操作避免阻塞主线程自动回复逻辑若包含数据库查询、HTTP 调用等 I/O 操作会阻塞 Flask 主线程导致后续消息积压。demoProject.zip的handle_text是同步函数生产环境需改造# 使用 threading轻量或 celery重型 import threading def async_handle_text(msg): # 模拟耗时操作 time.sleep(2) response f异步处理完成{msg[Content]} # 调用 send_message 接口 send_to_user(msg[FromUserName], response) app.route(/callback, methods[POST]) def callback(): # ... 解密、解析逻辑 # 启动新线程主线程立即返回响应 thread threading.Thread(targetasync_handle_text, args(msg,)) thread.daemon True thread.start() return build_response_xml(msg[FromUserName], config.CORP_ID, 已收到正在处理...)此方案确保企业微信在 5 秒内收到响应其超时阈值避免消息重发。6.3 配置外置化为什么config.py不能进 Git以及如何安全管理config.py中的SECRET、ENCODING_AES_KEY是敏感凭证绝不能提交到代码仓库。demoProject.zip提供两种生产级方案环境变量注入推荐删除config.py在app.py中读取环境变量import os CORP_ID os.environ.get(WECOM_CORP_ID) TOKEN os.environ.get(WECOM_TOKEN) ENCODING_AES_KEY os.environ.get(WECOM_ENCODING_AES_KEY) SECRET os.environ.get(WECOM_SECRET)启动时WECOM_CORP_IDxxx WECOM_TOKENyyy python app.py配置文件外置创建config.yaml不在 Git 中用PyYAML加载文件权限设为600。提示用python-decouple库可统一管理环境变量与配置文件支持.env文件自动加载一行代码from decouple import config; SECRET config(WECOM_SECRET)。从那以后我每次部署企业微信对接服务都强制走一遍这三步先用ngrok过一遍消息闭环再用validate_message函数过滤所有输入最后把SECRET从代码里抠出来塞进环境变量。这三步做完90% 的线上事故都能提前掐灭在本地。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Flutter脚手架鸿蒙化适配:easy_init_cli的工程初始化资产治理实践

Flutter脚手架鸿蒙化适配:easy_init_cli的工程初始化资产治理实践

接手这个任务前,我团队里新开一个 Flutter 项目的标准流程,还是从 Git 仓库拉一个老工程,全局替换包名,然后祈祷 replace 别把注释里的示例代码也改了。这种"复制粘贴式初始化"撑了三年,终于把问题摆到了台面…

2026/10/14 4:14:49 阅读更多 →
Boyer-Moore投票算法:线性时间找多数元素的工业级实现

Boyer-Moore投票算法:线性时间找多数元素的工业级实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 4:14:49 阅读更多 →
开发环境搭建与Git入门:新手必备工具链详解

开发环境搭建与Git入门:新手必备工具链详解

最近带了几位刚接触开发的同学,发现一个很普遍的现象:代码语法学得挺快,但一旦脱离教程,自己装环境、跑项目、提交代码,就完全卡住。问题不是笨,也不是代码写得少,而是开发基础知识里最日常的那…

2026/10/14 4:14:49 阅读更多 →

最新新闻

EPLAN电气项目图纸高效读图与安全复用指南

EPLAN电气项目图纸高效读图与安全复用指南

做电气设计这些年,我经手过不少EPLAN项目文件,有自己从头画的,也有从同行手里拿到后二次改造的。一个很直观的体会是:同样是"分享图纸",文件与文件之间的价值差距可以非常大。有的图纸打开就能当标准模板用&…

2026/10/14 5:12:02 阅读更多 →
多相流数值模拟实战:从水管到沙滩的建模选型与参数调试

多相流数值模拟实战:从水管到沙滩的建模选型与参数调试

做了十几年流体仿真,我越来越觉得多相流数值模拟是最能体现“流体魔法”的领域。一个水龙头看似平稳的水柱,背后是气液两相在高剪切下的剧烈纠缠;一片安安静静的沙滩,底下每分每秒都有颗粒在随波迁徙。你盯着云图上的气泡上升和沙…

2026/10/14 5:12:02 阅读更多 →
P2G与碳捕集耦合的热电联供综合能源系统双目标优化复现

P2G与碳捕集耦合的热电联供综合能源系统双目标优化复现

1. 复现项目的本质:搞懂这篇工作到底在优化什么做综合能源系统方向的人,对“考虑P2G和碳捕集设备的热电联供综合能源系统运行优化”这个题目应该不陌生。这是一篇发表在Energy上的SCI一区论文的复现任务,原文章本身的工作量集中在两个点上&am…

2026/10/14 5:12:02 阅读更多 →
深度神经网络训练核心逻辑:从原理到实战的完整指南

深度神经网络训练核心逻辑:从原理到实战的完整指南

1. 从“能跑通”到“真明白”:深度神经网络训练的核心逻辑拆解很多人学深度学习都有个类似的经历:跟着教程把模型搭起来,数据喂进去,损失曲线也能往下走,但一旦换个数据集、改个任务,就完全不知道从哪儿下手…

2026/10/14 5:12:02 阅读更多 →
CF1420D 区间计数与扫描线:组合数学在算法竞赛中的实战应用

CF1420D 区间计数与扫描线:组合数学在算法竞赛中的实战应用

CF1420D Rescue Nibel! 是我最近复盘次数最多的一道区间计数题。名字带点魔幻气息,但模型的本质非常朴素:给你一堆区间,让你从中选恰好 k 个,使得它们有公共交点。乍一看以为是区间贪心,实际却是组合数学和扫描线的混合…

2026/10/14 5:12:02 阅读更多 →
Cocos Creator 水波纹效果:Shader 扰动与交互涟漪实现

Cocos Creator 水波纹效果:Shader 扰动与交互涟漪实现

简介:这份资源是面向Cocos Creator开发者的一套水波纹特效项目源码,适合具备一定Shader与脚本基础、希望在游戏中实现动态水面、魔法或雨滴等视觉效果的开发者参考。压缩包共3个文件,以inscode工程配置、html页面与gitignore为主,…

2026/10/14 5:11:01 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →