技术报告:texnunAI(校园活动宣发助手)技术架构与实现分析
产品自述名称:校园活动宣发助手(界面标题与启动日志均使用此名)
分析方法:静态逆向分析(未执行程序)。依次通过 PE 结构解析、PyInstaller 单文件归档提取、内嵌 Python 字节码(
.pyc)符号与字符串还原,确认技术事实。所有结论均标注依据,推断项另作说明。
1. 概述与产物定位
一个面向校园场景的AI 文案生成桌面工具,其本质是一个被打包为 Windows 可执行文件的本地 Web 应用:用户在浏览器中填写活动信息,后端调用本地大模型一次性产出多个社交/媒体平台的宣发文案。
| 项目 | 事实 | 依据 |
|---|---|---|
| 文件类型 | PE32+ 控制台程序,x86-64,7 个节区 | PE 头解析 |
| 构建方式 | PyInstaller 单文件打包(格式 2.1+) | PyInstaller 引导字符串、CArchive 提取 |
| 运行语言 | Python 3.12(内嵌 python312.dll) | 提取文件python312.dll、.pyd文件名 |
| 编译时间 | PE 头时间戳 | |
| 体量 | 10,760,081 字节(≈10.4 MB) | 文件属性 |
推断:10.4 MB 的体积远小于打包了 PyTorch/Transformers 的本地推理程序,结合内嵌依赖清单(无 torch、numpy、onnx 等),可判定其不内置任何大模型权重,AI 能力完全依赖外部运行的 Ollama 服务。
2. 整体架构
采用本地 B/S(浏览器/服务器)架构,三层职责分离:
架构特征:
- 服务端为轻量级 Flask 应用,单一入口脚本
new_app.pyc(约 28 KB 即全量业务代码)。 - 客户端 UI 以字符串形式内联在
index()路由中,通过render_template_string直接返回,无独立前端构建步骤。 - AI 推理严格指向本地 Ollama,不直连任何公有云大模型 API。
3. 技术实现方案
3.1 打包与分发
- 使用 PyInstaller 将 Python 解释器、业务代码、第三方库(Flask 生态、requests 等)及
_wmi.pyd一并打进单文件 exe,用户无需安装 Python 即可运行。 - 资源节区(
.rsrc)含图标(RT_ICON)、版本清单(RT_MANIFEST,声明longPathAware、Common-Controls 6.0)与 RT_VERSION。 - 启动时需在临时目录解包 Python 运行环境,故首次启动有短暂延迟。
3.2 服务端实现
- 框架:Flask 3.0.0,开启 CORS(
flask_cors),便于前端独立部署或跨域调试。 - 运行参数:
app.run(host="0.0.0.0", port=5000, debug=False)(依据:模块常量与启动日志)。 - 依赖精简:未引入数据库、任务队列或 ASGI 服务器,保持最小依赖面。
3.3 客户端实现
- 单页 HTML 内联 CSS(渐变主题、卡片式结果展示、加载动画)与原生 JavaScript。
- 交互逻辑:表单校验(标题/时间/地点为必填)→ 组装
event_info→fetch('/api/generate')→ 渲染结果卡片;客户端对生成内容做& < >转义以防 XSS。 - 回车键快捷触发生成。
3.4 AI 推理接入
- 统一封装函数
call_ollama(prompt, model),向 Ollama/api/generate发送prompt与model字段,读取响应中的response、thinking、done_reason、eval_count,并记录耗时与长度。 - 异常分支覆盖
ConnectionError(Ollama 未运行)、Timeout(生成超时)、HTTP 非 2xx(raise_for_status)及空内容兜底。
4. 核心模块构成
| 模块 | 职责 | 关键事实 |
|---|---|---|
PromptTemplates | 6 套角色化提示词模板 | wechat_article(公众号推文)、moments(朋友圈)、xiaohongshu(小红书)、qq_zone(QQ空间)、douyin_script(抖音脚本)、official_notice(官方通知) |
call_ollama | Ollama REST 调用与容错 | 超时/连接/空结果处理,含重试提示文案 |
index | 主页与 UI 渲染 | 内联 HTML,含 6 平台勾选与模型下拉 |
generate | 多平台生成主流程(POST /api/generate) | 校验入参 → 遍历平台 → 取模板 → 调call_ollama→ 聚合返回;含「首次不理想重试一次」逻辑 |
health_check | 健康检查(GET /api/health) | 探测 Ollama/api/tags,返回 healthy/running/degraded/stopped |
list_models | 模型列表(GET /api/models) | 读取 Ollama 已安装模型 |
5. 关键运行机制
- 启动流程:执行 exe → 解包运行环境 → 启动 Flask → 控制台打印访问地址、默认模型、Ollama 地址与最大长度提示 → 等待用户访问
http://localhost:5000。 - 生成请求流程:浏览器提交 →
/api/generate校验event_info/platforms/model→ 对每个选中平台从PromptTemplates取模板并填充活动信息 → 逐个调用call_ollama→ 收集{platform, content}列表返回。 - 重试机制:当某平台首次返回内容为空或无效时,触发一次重试(日志/提示「首次生成结果不理想,重试一次」)。
- 并发模型:平台生成在
generate中为同步顺序循环,单请求内不并行;服务端为 Flask 开发服务器默认单工作进程。 - 默认值(依据:模块常量)
6. 配置、安全与部署特征
- 配置硬编码:模型、端口、Ollama 地址、token 上限均为源码常量,无配置文件或环境变量覆盖入口。
- 网络暴露:绑定
0.0.0.0意味着同一局域网内其他主机可访问该服务;服务端无身份认证。 - 依赖打包冗余:
_wmi.pyd(Windows 管理规范)被打包但主逻辑未直接调用,疑为传递依赖,徒增体积。 - 平台局限:仅提供 Windows x64 可执行文件,无 macOS/Linux 构建。