梁晓声说,他读书的时候,有个老师姓艾,生 了三个孩子,分别取名:艾国、艾民、艾党; 又红又专又拍马P。 邻居发现的,连起来看,艾国民党,告发。红 卫兵把艾老师抓起来,屎都给他打出来 后来又责问邻居你早就发现咋现在才说?俩人 都被送到青海改造去了。 头条@花
#文书助手

开发一款浏览器扩展需要在完全离线的内网环境中运行,面向烟草专卖局的稽查人员,直接在现有专卖系统页面上无缝集成。核心功能是针对案件文书的文本智能处理:自动检查错别字、修正不规范术语、优化句式结构,并提供一键优化替换。重点创新在于引入“智能多样化引擎”,通过同义词替换、句式变换和细节增强,有效避免不同案件描述的同质化,使文书表述更加丰富、准确且专业。扩展以侧边栏形式交互,支持用户自定义行业术语和规则,所有处理均在本地的WASM微型模型和规则引擎中完成,确保数据安全且响应迅速。最终目标是显著提升文书质量与稽查工作效率。
90 年代,一款办公软件启动要 5 分钟。
工程师把它优化到 30 秒。
上线后,投诉骤增。
因为那 5 分钟,本来是员工倒咖啡、聊天、进入状态的时间。
软件更快了,
但人被提前拉进了工作。
一旦规模化,连 Bug 都会拥有用户
黄仁勋:爱上你所做的事比找到你所爱的事容易得多。

“很多人都说,‘找到你热爱的事情。’我对此持保留意见。我想我已经爱上了我所做的很多事情。我喜欢洗碗工的工作,喜欢当餐厅服务员的工作,喜欢送报纸的工作,喜欢当服务员的工作。”

“我热爱我做过的每一份工作,也热爱在英伟达的每一天。我只是学会了热爱我正在做的事情。找到自己热爱的事情很难,但爱上你正在做的事情却容易得多。一旦你因为渴望做好而爱上你的工作,你就更容易把它做好,也更容易努力工作。”
# 戒烟数字疗法系统 PRD(完整)

## 1. 产品背景

- 吸烟是全球主要可预防死亡原因之一。
- 戒烟成功率低,主要受心理和行为依赖驱动。
- 市面普通记录类 App 成效有限,多数缺乏科学行为干预。
- 结合心理学、行为经济学和 AI 智能,可提高戒烟成功率。

---

## 2. 产品目标

- 核心目标:降低吸烟行为发生率,帮助用户逐步戒烟。
- 次要目标:提供即时干预、行为趋势反馈、经济可感知成本展示。
- 核心原则:低羞耻、可解释、合规、AI 辅助表达而非决策。

---

## 3. 用户与场景

- 用户:成年人吸烟者,愿意自我干预戒烟。
- 使用场景:
  - 日常冲动发生时(吸烟触发窗口)
  - 压力或疲劳时
  - 空闲或社交场景
- 用户期望:
  - 不受道德审判
  - 可感知行为影响
  - 获取即时可操作的替代方案

---

## 4. 系统设计原则

- 以行为科学为核心,而非单纯统计。
- 状态机驱动干预流程,减少用户决策负担。
- AI 智能仅用于表达与洞察解释,决策闭环完全隔离。
- 数据隐私保护,所有用户信息可脱敏、可控制。

---

## 5. 系统架构概览

- 行为决策层:规则引擎 + 可解释模型
- 干预执行层:状态机驱动(稳定 → 高风险 → 干预中 → 成功抑制/已吸烟)
- AI 服务层:
  - 文案表达
  - 用户洞察解释
  - 自我反思辅助
- 数据层:行为日志、经济数据、AI 输出日志
- 用户界面层:首页、即时干预页、趋势页、洞察页、经济分析页

---

## 6. UI 与业务逻辑设计

### 6.1 首页(核心干预入口)

**UI结构**:
- 当前状态卡片:显示风险等级或未吸烟时长
- 主操作按钮:「我现在很想抽」
- 次级操作:「我刚刚抽了一支」

**业务逻辑**:
- AI 风险预测模块后台计算吸烟概率
- 点击按钮触发即时干预或行为记录

---

### 6.2 即时干预页(黄金 5 分钟)

**UI结构**:
- 倒计时进度环
- 文案区(单句)
- 替代行为按钮(喝水/深呼吸/走动)

**业务逻辑**:
- 倒计时时长由 AI 建议(3–10 分钟)
- 用户选择或超时 → 状态机更新成功/失败

---

### 6.3 事后确认弹窗

**UI结构**:
- 中性文案:“这次没忍住也没关系,要记录一下吗?”
- 按钮:「记录吸烟」/「暂不记录」

**业务逻辑**:
- 不强制记录
- 若记录 → 作为失败样本更新模型

---

### 6.4 行为趋势页

**UI结构**:
- 吸烟 vs 忍住趋势图
- 核心指标卡片(本周少抽 X 支、成功忍住 X 次)

**业务逻辑**:
- 展示趋势而非绝对值
- 强化正向行为,不强调失败

---

### 6.5 个人行为洞察页(AI解释层)

**UI结构**:
- 洞察卡片示例:
  - “你在晚上 + 疲劳时最容易失败”
  - “延迟 5 分钟最有效”

**业务逻辑**:
- AI 从历史数据提炼可解释结论
- 不展示概率,只给结论级提示

---

### 6.6 通知与后台干预逻辑

**UI结构**:
- 系统通知:“这是你容易想抽的时候,要不要缓一缓?”

**业务逻辑**:
- AI 判定高风险窗口
- 满足打扰频率规则才发送通知

---

### 6.7 业务状态机(简化)

状态:
- 稳定状态
- 高风险状态
- 干预中
- 成功抑制
- 已吸烟

状态转换由 AI + 用户行为触发

---

## 7. MVP 范围定义

- 核心干预流程:首页 → 即时干预 → 事后确认
- 行为趋势页、洞察页、经济分析页为可选模块
- AI 仅用于文案表达与洞察解释

---

## 8. 大模型(LLM)接入设计(DTx 合规版)

### 8.1 设计原则

- LLM 不进入行为预测与决策闭环
- LLM 输出仅用于表达、解释和反思
- 核心行为由规则/可解释模型控制

### 8.2 LLM 使用范围

- 文案表达层:干预意图 → 自然、低压力语言
- AI洞察解释层:行为模式/统计结论 → 用户可理解描述
- 用户自我反思辅助:整理情绪、复述,无干预

### 8.3 LLM 禁止使用场景

- 判断是否需要干预
- 决定干预强度或策略
- 个性化说服或心理操控
- 医疗/健康判断
- 人格或行为标签

### 8.4 系统级技术架构

- 行为决策:规则+可解释模型
- 干预执行:状态机
- LLM 服务:文案生成+洞察解释+反思整理
- 数据/训练层:隔离 LLM 与决策数据

### 8.5 合规与审计设计

- 所有 LLM 输入输出日志化(脱敏)
- 决策可回溯
- 用户可关闭 LLM 功能

---

## 9. 心理学行为干预依据

- 条件反射、负强化、身份认同为核心驱动
- 替代行为训练、延迟满足训练、认知重构、环境干预、自我宽恕机制
- 状态机设计基于行为改变 TT 模型(前思考 → 思考 → 准备 → 行动 → 维持)
- 低羞耻设计,强调趋势和正向强化

---

## 10. 经济消费分析模块

### 10.1 设计原则

- 帮助用户感知短期成本
- 语言中性、非评判
- 不提供财务建议
- 数据可视化简单直观
- 与核心干预逻辑隔离

### 10.2 核心功能

1. **事实层**:吸烟支出记录(每日/周/月累计)
2. **机会成本层**:可替代用途、目标进度条、等价换算
3. **行为强化层**:正向鼓励文案,非羞辱或道德化

### 10.3 数据与 AI 接入

- AI可介入:模式识别、高消费日统计、情绪中性文案生成
- AI禁止介入:行为判断、财务建议、干预策略决策

### 10.4 UI设计建议

- 仪表盘式趋势图
- 替代目标进度条
- 简短、中性提示
- 可关闭模块,不影响核心功能

### 10.5 合规与审计

- 数据本地或加密存储
- AI输出日志化
- 模块完全可关闭

---

## 11. 产品一句话定义

> 以可解释行为模型为核心、以 AI 辅助表达为手段,在吸烟冲动关键窗口提供克制与支持的数字疗法级戒烟系统。
#### 10.2.3 用户自我反思支持(非干预)

**作用**:

* 支持用户自由书写、整理情绪
* 通过复述与结构化帮助用户增强自我觉察

**明确禁止**:

* 提供戒烟建议
* 调整用户决策
* 引导价值判断

---

### 10.3 坚决禁止的 LLM 使用场景(红线)

* 由 LLM 判断是否需要干预
* 由 LLM 决定干预频率或强度
* 利用 LLM 个性化“更有效说服”
* 使用 LLM 生成医疗或健康判断
* 使用 LLM 给用户贴行为或人格标签

---

### 10.4 系统级技术架构(简化描述)

* 行为决策层:规则引擎 + 可解释模型
* 干预执行层:状态机驱动
* LLM 服务层:

* 文案模板生成
* 洞察语言化
* 自我反思整理
* 数据与训练层:完全隔离 LLM 与核心决策数据

---

### 10.5 合规与审计设计

* 所有 LLM 输入输出日志化(脱敏)
* 所有行为决策可回溯
* 用户可关闭 LLM 功能且不影响核心使用

---

## 11. 产品一句话定义

这是一个以可解释行为模型为核心、以 AI 辅助表达为手段,在吸烟冲动发生的关键窗口提供克制与支持的数字疗法级戒烟系统。
# 戒烟系统产品需求文档(PRD)

## 1. 产品背景与目标

### 1.1 背景

吸烟是一种典型的成瘾性行为,其形成与维持并非源于“信息不足”,而是由固定场景、情绪触发、习惯路径与尼古丁依赖共同导致。大量现有戒烟类产品仅停留在记录或宣教层面,难以对真实吸烟行为产生实质性干预。

### 1.2 产品目标

设计并实现一个以“行为改变”为核心的戒烟系统,在关键时刻对吸烟行为进行识别、预测与干预,帮助用户逐步减少吸烟频率并最终实现戒烟。

### 1.3 核心目标指标(KPI)

* 单用户日均吸烟次数下降率
* 成功延迟吸烟的比例(想抽但未抽)
* 用户连续使用 30 天留存率
* 自评戒烟信心提升幅度

---

## 2. 目标用户与使用场景

### 2.1 目标用户

* 有明确戒烟意愿,但多次尝试失败的吸烟者
* 日均吸烟 5–20 支的轻至中度成瘾用户
* 愿意使用手机进行自我管理的成年人

### 2.2 核心使用场景

* 饭后、起床、工作压力大时
* 情绪波动(焦虑、烦躁、无聊)
* 社交或独处时的惯性吸烟时刻

---

## 3. 产品整体设计原则

1. 行为优先于记录:减少一次吸烟比多记录一次更重要
2. 即时干预优先于事后统计
3. 降低羞耻感,避免惩罚性设计
4. 小成功累积,而非一刀切戒断
5. 系统应逐步“理解用户”,而非要求用户适应系统

---

## 4. 系统功能架构

### 4.1 功能分层结构

* 行为感知层(数据输入与信号采集)
* AI 认知与预测层(个体模型构建)
* 智能干预决策层
* 正反馈强化层
* 数据记录与分析层

---

## 4A. AI 智能设计总览

本产品中的 AI 不承担“聊天”或“说服”角色,而是作为**行为预测与决策引擎**存在,其目标是:

* 预测用户的吸烟冲动发生概率
* 在最合适的时机选择最合适的干预方式
* 通过长期学习不断降低干预成本、提升成功率

AI 的价值体现在 更少打扰、更高命中率 上,而不是更花哨的表达。

---

## 5. 核心功能需求

> 以下功能均由 AI 进行个体化驱动,不同用户将呈现不同的系统行为

### 5.1 吸烟与冲动记录(基础模块)

**功能描述**:

* 用户可快速记录“已吸烟”或“想抽但忍住”
* 每次记录可选填触发场景(时间 / 地点 / 情绪)

**设计要点**:

* 操作路径 ≤ 2 步
* 不强制填写完整信息

---

### 5.2 AI 行为模式识别与风险预测(核心)

**功能描述**:

* AI 基于用户历史吸烟、忍住、时间分布、场景与情绪标签
* 构建个人吸烟冲动概率模型(Personal Craving Model)
* 预测未来 1–3 小时内的吸烟风险

**输入信号包括**:

* 时间序列吸烟数据
* 记录失败 / 成功的比值
* 场景标签(饭后、压力、独处等)
* 用户对干预的响应结果

**输出示例**:

* “未来 30 分钟内吸烟冲动概率:72%”
* “你在疲劳 + 晚间场景下的成功率最低”

---

### 5.3 AI 驱动的即时干预机制(核心能力)

**触发方式**:

* AI 判断进入高风险状态时主动触发
* 用户主动点击“我现在很想抽”

**智能决策逻辑**:
AI 根据以下因素动态选择干预策略:

* 当前风险等级
* 近期干预成功率
* 用户历史偏好
* 最近失败后的心理敏感期

**干预策略池**:

1. 延迟倒计时(时长由 AI 自适应调整)
2. 替代行为推荐(基于过往有效性排序)
3. 情绪打断式短提示(语言强度自适应)

**成功定义**:

* 在 AI 设定的窗口期内未发生吸烟记录

---

### 5.4 正反馈与激励系统

**功能描述**:

* 统计并突出展示“成功忍住”的次数
* 可视化展示吸烟下降趋势
* 金钱节省与健康收益估算

**设计原则**:

* 不因失败清零成果
* “少一支也是进步”

---

### 5.5 复盘与自我认知模块

**功能描述**:

* 系统定期生成个人行为摘要
* 提示哪些场景最容易失败,哪些策略最有效

---

## 6. 非功能性需求

* 高隐私性:所有个人数据默认本地或匿名处理
* 低打扰性:通知频率可控
* 高可达性:单手操作,弱网可用

---

## 6A. UI 与业务逻辑设计(核心界面级别)

> 本章节描述具体页面结构、用户操作路径与背后的业务与 AI 决策逻辑

---

## 6A.1 首页(核心干预入口)

### UI 结构

* 当前状态卡片(居中)

* 文案示例:

* “当前吸烟风险:低 / 中 / 高”
* 或“你已 2 小时未吸烟 👍
* 主操作按钮(唯一主按钮)

* 「我现在很想抽」
* 次级操作

* 「我刚刚抽了一支」

### 业务逻辑

* 页面加载时:

* AI 风险预测模块计算当前时间窗吸烟概率
* 决定是否高亮风险状态
* 点击「我现在很想抽」:

* 立即进入【即时干预页】
* 点击「我刚刚抽了一支」:

* 记录吸烟行为
* 更新模型失败样本

---

## 6A.2 即时干预页(黄金 5 分钟)

### UI 结构

* 倒计时进度环(占屏 1/2)
* 文案区(单句)
* 替代行为按钮(1–3 个)

* 喝水 / 深呼吸 / 站起来走走

### 业务逻辑

* 倒计时时长由 AI 决定(3–10 分钟)
* 倒计时过程中:

* 若用户返回首页且未记录吸烟 → 判定为一次“成功忍住”
* 若点击“我还是抽了” → 判定为干预失败

---

## 6A.3 事后确认弹窗(低羞耻设计)

### UI 结构

* 中性文案:

* “这次没忍住也没关系,要记录一下吗?”
* 按钮:

* 「记录吸烟」 / 「暂不记录」

### 业务逻辑

* 不强制记录,避免用户逃避使用
* 若记录:

* 标记该干预策略在当前场景下失败

---

## 6A.4 行为趋势页(反馈而非审判)

### UI 结构

* 吸烟 vs 忍住 双曲线趋势图
* 核心指标卡片:

* 本周少抽 X 支
* 成功忍住 X 次

### 业务逻辑

* 展示变化趋势而非绝对值
* 默认不展示“最差的一天”

---

## 6A.5 个人行为洞察页(AI 解释层)

### UI 结构

* 洞察卡片(AI 生成)

* “你在晚上 + 疲劳时最容易失败”
* “延迟 5 分钟在你身上效果最好”

### 业务逻辑

* AI 从历史数据中抽象可解释结论
* 不给概率细节,只给结论级提示

---

## 6A.6 通知与后台干预逻辑

### UI 结构

* 系统通知(非 App 内)

* 示例:“这是你容易想抽的时候,要不要缓一缓?”

### 业务逻辑

* AI 判定高风险窗口
* 检查最近打扰频率
* 满足条件才发送通知

---

## 6A.7 业务状态机(简化)

状态:

* 稳定状态
* 高风险状态
* 干预中
* 成功抑制
* 已吸烟

状态转换由 AI + 用户行为共同触发

---

## 7. MVP 范围定义

### 7.1 必须包含

* 吸烟 / 忍住记录
* 高风险时间段识别
* 倒计时延迟干预
* 基础趋势反馈

### 7.2 暂不包含

* 医疗诊断或处方建议
* 社交排行与强对比机制
* 强制戒断目标

---

## 8. 成功标准

* 用户能清楚回答:

* “我什么时候最想抽?”
* “我什么时候最容易忍住?”
* 产品能在“想抽 → 真抽”之间发生介入

---

## 9. 风险、伦理与 AI 边界

* AI 不使用羞辱、恐吓或极端激励语言
* 不进行健康诊断或医疗替代决策
* 不制造“失败人格化”标签
* 所有模型决策提供可理解的解释提示(可解释 AI)
* 用户可一键关闭 AI 主动干预,仅保留记录功能

---

* 不替代医疗建议
* 不制造道德压力
* 不诱导用户焦虑或自责

---

## 10. 大模型(LLM)接入设计(DTx 合规版)

### 10.1 设计原则(必须满足)

* 大模型不进入行为预测与决策闭环
* 大模型不直接影响用户真实行为选择
* 大模型输出仅作用于“表达”“解释”“反思”层
* 所有关键行为由可解释逻辑或传统模型控制

核心原则一句话:**LLM 只决定“怎么说”,不决定“做什么”**。

---

### 10.2 LLM 在系统中的合理位置

#### 10.2.1 文案生成层(表达层)

**作用**:

* 将系统既定干预意图转化为自然、低压力的语言

**输入(结构化)**:

* 干预类型(延迟 / 替代 / 提醒)
* 当前风险等级(低 / 中 / 高)
* 语言风格参数(冷静 / 温和 / 极简)

**输出(自然语言)**:

* 单句、中性、非说教文案

**约束**:

* 不得出现命令式、道德化、医疗化语言
* 不得新增任何策略或判断

---

#### 10.2.2 AI 洞察解释层(可解释辅助)

**作用**:

* 将系统已确认的行为模式与统计结论转化为用户可理解的描述

**输入**:

* 已确认的触发因子
* 已验证有效的干预策略

**输出示例**:

* “你在晚上疲劳时更容易想抽,而延迟 5 分钟往往对你更有效。”

**边界**:

* 不展示预测概率
* 不进行因果夸大或人格归因

---
Windows 11 文件共享网络打印机连接时遇到 0x00000709 错误,这是由于微软从 22H2 版本开始禁用了通过命名管道进行 RPC 通信作为打印机共享的默认方法。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\RPC]
"RpcUseNamedPipeProtocol"=dword:00000001
"RpcProtocols"=dword:00000007
"ForceKerberosForRpc"=dword:00000001
彭博:知情人士透露,中国两家私营数据机构克而瑞和中指研究院应政府要求暂停发布月度房屋销售数据

知情人士称,住建部指示两家公司暂停公开此类数据,直至另行通知。由于事涉非公开事宜,知情人士要求匿名。其中一名知情人士称,付费金融机构仍可访问这些数据,但前提是要对数据保密。
项目名称:StarMind(星智)

需求描述:

开发一款以安全和隐私保护为核心的 AI 驱动知识管理工具,MVP 从 GitHub 星标(Starred Repositories)切入。用户可通过 GitHub OAuth 安全授权登录,导入自己收藏的公开星标仓库,系统利用 AI 为每个仓库自动生成中文/英文摘要和智能标签,帮助用户更好地理解、分类与快速检索曾经收藏的开源项目。

该工具遵循最小权限和数据最小化原则,仅处理 GitHub 公开信息,不触碰用户私有仓库,所有敏感数据(如用户凭证、个人备注、AI 生成内容等)均采用加密存储;同时,AI 数据处理过程对用户透明,用户可选择是否启用 AI 增强功能,或自主管理数据的存储与隐私选项。

StarMind 提供简洁的搜索与标签过滤功能,让用户轻松回顾和管理有价值的收藏,同时支持数据导出与账号注销,充分保障用户对自己知识数据的所有权与控制权。产品在设计上立足本地化与隐私优先,为未来扩展更多内容源(如推文、视频、文档等)打下坚实基础,致力于成为用户可信赖的“第二大脑”。
开发一个 **Smart Open for Raycast Extension**,让用户无论是否在 Finder 中选中文件,都能通过自然语言输入或自动识别文件类型,快速获得最合适的本地应用推荐;当系统缺少对应软件时,扩展会自动从 Raycast Store、App Store、Homebrew 及多个 GitHub Awesome macOS 软件仓库中搜索可用工具,并支持一键安装。扩展采用本地文件头 / MIME 类型检测、关键词+规则的离线意图识别(可选启用 Raycast AI 增强语义),结合系统默认应用、最近使用、意图匹配度等进行智能排序,实现“自动识别 → 智能推荐 → 一键打开 / 安装”的全流程体验,覆盖从日常办公到专业逆向调试等多种使用场景,填补 macOS 在通用智能打开工具上的生态空缺。
开发一个独立的 Raycast 扩展,通过 TypeScript 实现完整的 macOS 系统清理能力,包括垃圾文件扫描与删除、应用卸载、磁盘使用分析以及 Touch ID 相关配置等核心功能,并结合 Raycast 原生界面提供实时预览、批量操作、进度展示与快捷键交互的现代化体验;整体功能参考开源项目 *Mole* 的设计理念,但不依赖其代码,实现更轻量、可扩展、原生融合的系统优化工具。
#知乎问答 问:怎么不声不响的把电脑弄坏? 答:如果是win10或者win11系统,在C:\Windows\System32\config下路径下新建一个名为OSDATA的文件夹,然后重启。
一张全景镜头(FULL SHOT)时尚肖像,年轻东亚女子全身入镜,站在深蓝渐层虚化背景前,身着超大号蓝色西装,一手轻柔地抱着高贵的英国短毛灰猫。使用50mm镜头、f/2.2光圈、ISO 200拍摄,在工作室柔和控光下展现均匀的电影级光晕。冷调蓝色主色调衬托人物与空间的平衡感,前卫女性时尚杂志梦幻超现实风格,全高清质感。

一张中景镜头(MEDIUM SHOT)时尚肖像,聚焦年轻东亚女子的上半身与怀中英国短毛灰猫。深蓝渐层虚化背景与蓝色西装形成冷静层次,50mm镜头、f/2.2光圈、ISO 200设置下,光线柔和细腻,突显面部线条与服装质感。梦幻超现实的高级时尚杂志风格,全高清。

一张特写镜头(CLOSE-UP SHOT)时尚肖像,画面集中于年轻东亚女子的面部与英国短毛灰猫的毛发细节。保持她的面部特征完全一致,蓝色西装与深蓝渐层虚化背景呼应。使用50mm镜头、f/2.2光圈、ISO 200拍摄,柔和电影级光晕勾勒立体五官,梦幻冷调前卫时尚杂志风,全高清。

一张过肩镜头(OVER THE SHOULDER SHOT)时尚人像,从年轻东亚女子肩后取景,焦点落在她怀中高贵的英国短毛灰猫。蓝色西装的肩线作为前景,深蓝渐层背景虚化。使用50mm镜头、f/2.2光圈、ISO 200拍摄,柔光塑造空间深度,猫注视镜头,构图高级梦幻,全高清。

一张低角度镜头(LOW ANGLE SHOT)时尚肖像,从下方向上拍摄,强调年轻东亚女子的高挑身形与蓝色西装的挺拔廓形。怀中的英国短毛灰猫姿态优雅,深蓝渐层虚化背景强化空间层次。50mm镜头、f/2.2光圈、ISO 200设置下,柔光与阴影制造雕塑般视觉感受,前卫女性时尚杂志梦幻风,全高清。

一张荷兰镜头(DUTCH SHOT)时尚人像,画面轻微倾斜,年轻东亚女子怀抱英国短毛灰猫立于深蓝渐层虚化背景中。蓝色西装线条与光影倾斜呼应,形成动态张力。使用50mm镜头、f/2.2光圈、ISO 200拍摄,灯光柔和而不对称,前卫梦幻超现实女性时尚杂志风格,全高清。

一张航拍镜头(AERIAL VIEW)时尚肖像,从上方俯拍年轻东亚女子与怀中英国短毛灰猫。深蓝渐层虚化背景铺满画面,蓝色西装与猫的灰色毛发形成和谐冷色对比。50mm镜头、f/2.2光圈、ISO 200设置,柔和光线平衡,梦幻超现实高级时尚杂志风,全高清。

一张插入镜头(INSERT SHOT)时尚细节特写,聚焦年轻东亚女子的手轻抚英国短毛灰猫的瞬间。蓝色西装袖口与灰猫毛发交织在柔光中,景深极浅。使用50mm镜头、f/2.2光圈、ISO 200拍摄,质感细腻,冷调梦幻,超现实时尚编辑风,全高清。

一张定场镜头(ESTABLISHING SHOT)时尚肖像,展现年轻东亚女子与英国短毛灰猫在深蓝渐层虚化背景下的整体场景。蓝色西装与背景冷调统一,灯光柔和渐变,空间层次清晰。50mm镜头、f/2.2光圈、ISO 200拍摄,梦幻超现实前卫女性时尚杂志风格,全高清。
一张全景镜头(FULL SHOT)时尚肖像,年轻东亚女子全身入镜,站在深蓝色背景前,身着超大号蓝色西装,一手轻柔地抱着英国短毛灰猫。镜头以50mm焦距、f/2.2光圈、ISO 200设置拍摄,在工作室灯光控制下呈现均匀的电影级柔光。冷调蓝色主色调强化空间层次与构图的平衡感,梦幻超现实前卫女性时尚杂志风格,全高清质感。

一张中景镜头(MEDIUM SHOT)肖像照,聚焦女子上半身与怀中灰猫。50mm镜头、f/2.2光圈、ISO 200设置,背景深蓝渐层虚化,突出西装的立体线条与织物质感。柔光照亮皮肤与猫毛,形成细腻层次感。整体风格为梦幻冷调高级时尚编辑风,全高清。

一张特写镜头(CLOSE-UP SHOT)时尚人像,画面集中于女子的面部与灰猫的毛发细节。使用50mm镜头、f/2.2光圈、ISO 200拍摄,灯光柔和、电影级光晕勾勒面部曲线,保持面部特征完全一致。冷调蓝色与自然肤色形成对比,梦幻超现实时尚杂志风格,全高清。

一张过肩镜头(OVER THE SHOULDER SHOT)画面,从女子肩后取景,聚焦她怀中英国短毛灰猫。使用50mm镜头、f/2.2光圈、ISO 200拍摄,前景为蓝色西装肩线,背景深蓝虚化。柔光制造层次,猫注视镜头形成焦点。梦幻超现实时尚杂志风格,全高清。

一张低角度镜头(LOW ANGLE SHOT)人像,从下方向上拍摄,强调女子的力量与气场。50mm镜头、f/2.2光圈、ISO 200设置下,蓝色西装廓形在柔和光线中显得雕塑般立体。怀中灰猫安静依偎,冷色光影与阴影拉长构图。前卫女性时尚杂志梦幻风格,全高清。

一张荷兰镜头(DUTCH SHOT)时尚人像,画面轻微倾斜,构图打破平衡制造视觉张力。女子怀抱灰猫立于深蓝背景中,蓝色西装线条与光影倾斜呼应。50mm镜头、f/2.2光圈、ISO 200设置,柔光控制精准。整体风格前卫梦幻,超现实女性时尚杂志风,全高清。

一张航拍镜头(AERIAL VIEW)肖像,从上方俯拍,女子与灰猫形成紧密几何构图。50mm镜头、f/2.2光圈、ISO 200参数拍摄,深蓝背景铺满画面,蓝色与灰色形成和谐对比。光线平衡柔和,梦幻超现实时尚杂志视觉,全高清。

一张插入镜头(INSERT SHOT)细节特写,聚焦女子手轻抚英国短毛灰猫的瞬间。使用50mm镜头、f/2.2光圈、ISO 200设置,柔光散射,景深极浅,毛发与指尖细节清晰。梦幻前卫时尚编辑风格,超现实氛围,全高清质感。

一张定场镜头(ESTABLISHING SHOT)时尚肖像,展示深蓝背景与布光结构的完整空间。50mm镜头、f/2.2光圈、ISO 200设置,女子与灰猫置于中央,灯光柔和渐变,冷色调贯穿全画面。梦幻超现实女性时尚杂志风格,视觉平衡且层次丰富,全高清。
async def _scrape_details_with_progress(self, page: Page):
start_time = time.time()
with tqdm(total=len(self.products), desc="详情解析", unit="项", dynamic_ncols=True) as pbar:
for idx, item in enumerate(self.products, 1):
await self.scrape_details(page, item)
pbar.update(1)
self._update_remaining(pbar, start_time)

async def _download_images_with_progress(self):
start_time = time.time()
async with aiohttp.ClientSession() as session:
with tqdm(total=len(self.products), desc="图片下载", unit="张", dynamic_ncols=True) as pbar:
for idx, item in enumerate(self.products, 1):
await self.download_image(session, item)
pbar.update(1)
self._update_remaining(pbar, start_time)

@staticmethod
def _update_remaining(pbar, start_time: float):
elapsed = time.time() - start_time
rate = pbar.n / elapsed if elapsed > 0 else 0
remaining = (pbar.total - pbar.n) / rate if rate > 0 else 0
pbar.set_postfix_str(f"剩余 {remaining:,.1f}s")

def _export_csv(self):
if not self.products:
return
with open(CSV_FILE, "w", newline='', encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=self.products[0].keys())
writer.writeheader()
writer.writerows(self.products)

def _export_json(self):
with open(JSON_FILE, "w", encoding="utf-8") as f:
json.dump(self.products, f, ensure_ascii=False, indent=2)


# ---------------------------- 脚本入口 ----------------------------

if name == "main":
parser = argparse.ArgumentParser(description="ETMOC 品牌爬虫")
parser.add_argument("--pages", type=str, default="1",
help="抓取页数,默认1页;传 all 表示全部页")
args = parser.parse_args()

# 解析页数参数
if args.pages.lower() == "all":
pages_limit = 0 # 全部页
else:
try:
pages_limit = int(args.pages)
except ValueError:
pages_limit = 1

scraper = ETMOCScraper(pages_limit=pages_limit)
asyncio.run(scraper.run_scrape())
import asyncio
import csv
import json
import time
from pathlib import Path
from typing import List, Dict
from tqdm import tqdm
from playwright.async_api import async_playwright, Page
import aiohttp
import argparse

# ---------------------------- 配置常量 ----------------------------

BASE_URL = "http://www.etmoc.com/firms/Brands" # 品牌列表页
OUTPUT_DIR = Path("etmoc_output") # 输出根目录
IMG_DIR = OUTPUT_DIR / "images" # 图片保存目录
CSV_FILE = OUTPUT_DIR / "brands.csv" # CSV 文件路径
JSON_FILE = OUTPUT_DIR / "brands.json" # JSON 文件路径

OUTPUT_DIR.mkdir(exist_ok=True)
IMG_DIR.mkdir(exist_ok=True)

# ---------------------------- 爬虫类 ----------------------------


class ETMOCScraper:
"""
ETMOC 烟草品牌爬虫
"""

def init(self, pages_limit: int = 1):
self.products: List[Dict] = []
self.pages_limit = pages_limit # 0 表示抓取全部页,1 表示默认1页

async def get_total_pages(self, page: Page) -> int:
"""获取品牌列表页的总页数"""
await page.goto(BASE_URL)
try:
await page.wait_for_selector(".pagination", timeout=5000)
pages = await page.query_selector_all(".pagination li a")
numbers = [int(await p.inner_text()) for p in pages if (await p.inner_text()).isdigit()]
total = max(numbers) if numbers else 1
except:
total = 1
# 如果设置了页数限制
return total if self.pages_limit == 0 else min(total, self.pages_limit)

async def scrape_page(self, page: Page, page_num: int) -> List[Dict]:
"""抓取单页品牌信息"""
url = f"{BASE_URL}?page={page_num}"
await page.goto(url)
await page.wait_for_selector(".product-list")
products = await page.query_selector_all(".product-list .item")
result = []
for product in products:
title_el = await product.query_selector("h3 a")
img_el = await product.query_selector("img")
if not title_el:
continue
title = (await title_el.inner_text()).strip()
href = await title_el.get_attribute("href")
img_url = await img_el.get_attribute("src") if img_el else ""
result.append({
"name": title,
"url": f"http://www.etmoc.com{href}",
"img_url": f"http://www.etmoc.com{img_url}" if img_url.startswith("/") else img_url
})
return result

async def scrape_details(self, page: Page, item: Dict) -> Dict:
"""抓取单个产品详情"""
await page.goto(item["url"])
try:
await page.wait_for_selector(".info", timeout=5000)
desc = await page.locator(".info").inner_text()
item["description"] = desc.strip()
except:
item["description"] = ""
return item

async def download_image(self, session: aiohttp.ClientSession, item: Dict):
"""下载单张图片"""
if not item.get("img_url"):
return
filename = IMG_DIR / f"{item['name'].replace('/', '_')}.jpg"
if filename.exists():
return
try:
async with session.get(item["img_url"]) as resp:
if resp.status == 200:
filename.write_bytes(await resp.read())
except:
pass

async def run_scrape(self):
async with async_playwright() as pw:
browser = await pw.chromium.launch(headless=True)
page = await browser.new_page()

total_pages = await self.get_total_pages(page)
print(f"将抓取 {total_pages} 页")

for p in tqdm(range(1, total_pages + 1), desc="分页抓取", unit="页"):
self.products.extend(await self.scrape_page(page, p))

print(f"共发现 {len(self.products)} 个产品")

await self._scrape_details_with_progress(page)
await self._download_images_with_progress()

self._export_csv()
self._export_json()
await browser.close()
print(f"完成。导出至 {OUTPUT_DIR.resolve()}")
直接输入一个命令 networkQuality 来检查你的 Mac 网络速度情况
为满足大规模GitHub star项目的自动化管理需求,现需开发一个基于GitHub Actions的周期处理系统:该系统每7天自动触发一次增量更新,每次仅处理最多50个新star项目(按star时间倒序获取),利用GitHub Models AI能力(严格遵守≤2并发限制)实现项目智能分类与摘要生成,通过SQLite数据库记录处理状态与最后时间戳确保连续性,最终将结构化结果(分类树形结构+项目摘要)自动更新至README.md实现知识沉淀,让超过 4000+项目能在约20个月内自然完成处理,形成免维护的长期自动化管理机制。
Back to Top