运行时依赖
安装命令
点击复制技能文档
印尼旅游资源解析入库技能 触发识别(使用前必读) 用户提示词关键词解析 收到入库任务时,从用户提示词中自动识别以下关键信息: 提示词关键词 识别结果 操作 https://drive.google.com/... 等 Drive URL 数据源为云盘 调用 google-drive 技能下载 PDF/Word 到本地临时目录 本地路径如 C:\Users\a\Desktop\资源 数据源为本地文件 直接使用该路径下的文件 模型文件路径 / 已存在的 csv 目标生产库位置 在该 CSV 基础上追加新数据,而非覆盖 目标路径 / target 解析结果输出目录 原始 PDF + 解析结果均写入该目录 未提及目标路径 — 告知用户必须指定目标路径 路径仅为示例,不可硬编码。 所有路径必须从用户提示词中动态提取,用作字段值传递给脚本。 示提示词: "检索 https://drive.google.com/drive/my-drive 所有合同并解析,模型文件路径在 C:\Users\a\Desktop\资源,目标路径为 C:\Users\a\Desktop\资源\target" 动态提取结果(作为变量使用): 数据源 URL:https://drive.google.com/drive/my-drive → 传给 google-drive 技能 模型文件路径:C:\Users\a\Desktop\资源 → 拼接生产库 CSV 文件名,得到完整生产库路径 目标路径:C:\Users\a\Desktop\资源\target → 解析结果输出目录 技能依赖检测 使用前检查所需技能是否已安装: 依赖技能 用途 未安装时操作 google-drive 访问 Google Drive 下载合同 提示用户执行 openclaw skills install google-drive,或告知用户提供本地文件 bali-resource-import 本技能(自身) 提示用户提供正确路径 pdfplumber / PyMuPDF PDF 文本提取 pip 安装 pdfplumber 缺失技能时的话术模板: [技能缺失] 解析入库需要先安装 google-drive 技能。 请在终端执行:openclaw skills install google-drive 安装完成后请重新发送任务。 使用流程 Step 0:安装依赖 # 安装 Google Drive 技能(如需要) openclaw skills install google-drive # 安装 PDF 解析库 pip install pdfplumber Step 1:下载合同文件 Google Drive 来源:调用 google-drive 技能,从提示词中提取 Drive URL,列出文件并下载到目标路径 本地来源:从提示词中提取本地路径,定位 PDF/Word 文件 所有路径均为动态变量,不写死。 Step 2:读取生产库表头 必须先读取目标 CSV 的实际表头和 encoding,再生成数据行。 import csv def read_production_csv(path): for enc in ['utf-8-sig', 'gbk', 'utf-8', 'latin1']: try: with open(path, 'r', encoding=enc) as f: headers = next(csv.reader(f)) return headers, enc except UnicodeDecodeError: continue raise ValueError(f"无法读取 {path}") # 示例 headers, enc = read_production_csv(r"C:\Users\a\Desktop\资源\活动标准化完整版_含人群标签与特色标签_V4.csv") # headers = ['contract_id (合同编号)', 'activitynameen (活动英文名)', ...] # 表头格式为 "fieldname (中文说明)",提取时用 split(' (')[0] 取英文字段名 Step 3:解析合同内容 按合同内容识别资源类型: 资源类型 判断关键词 核心价格字段 酒店 房型、床型、早餐、入住、淡旺季 淡季价格_IDR / 旺季价格_IDR 车辆 车型、半天、全天、司机、油费 半天价格 / 全天价格 景点 门票、开放时间、GPS、难度 门票-成人IDR 活动 时长、含保险、含交通、教练语言 成人IDR价格 SPA 疗法、套餐、开放时间 成人IDR价格 俱乐部 最低消费、入场费、时段政策 入场/门票费用 餐厅 菜系、套餐、预约 成人IDR价格 下午茶 套餐类型、成人儿童价 成人IDR价格 Step 4:数据提取规则 提取原则(按优先级): 优先级 来源 处理方式 1 合同原文 直接使用,如实写入字段 2 公开网络信息(如 GPS 坐标) 可填写,标注来源 — 合同无数据 填写"合同未提供",不得留空 — 编造数据 严禁 字段格式规范: 字段类型 格式示例 日期期间 2024-07-01 至 2024-08-31(不用英文月份) 星级 5星(带"星"字,非纯数字) 价格 纯数字,不含货币符号(如 3581500 而非 IDR 3,581,500) 汇率参考 1 CNY ≈ 2,100 IDR;1 USD ≈ 15,000 IDR Step 5:三层标签体系 每条资源必须标注三层标签: 人群标签(第一层): #家庭 #亲子 #情侣 #商务 #蜜月 #年轻人 #老年人 #单身 风格标签(第二层): #豪华 #经济型 #浪漫 #休闲 #刺激 #度假村风格 #自然 #文化 特色标签(第三层): 按资源类型选用,详见下方各资源标签表。 Step 6:写入 CSV 关键规则: 新增数据的字段名必须与生产库表头完全一致 encoding 必须与生产库一致(通常 activity 用 gbk,hotel 用 utf-8-sig) 写入模式为追加(append),不覆盖原有数据 import csv, os def append_to_production(prod_path, data_rows, enc): """追加数据到生产库 CSV""" with open(prod_path, 'r', encoding=enc, newline='') as f: prod_rows = list(csv.reader(f)) prod_headers = prod_rows[0] prod_fieldnames = [h.split(' (')[0] for h in prod_headers] with open(prod_path, 'w', encoding=enc, newline='') as f: writer = csv.writer(f) writer.writerow(prod_headers) writer.writerows(prod_rows[1:]) for row in data_rows: out_row = [row.get(fn, '') for fn in prod_fieldnames] writer.writerow(out_row) 直接追加示例(不依赖 append_to_csv.py): # BOUNTY Cruises → 活动库 append_to_production( r"C:\Users\a\Desktop\资源\活动标准化完整版_含人群标签与特色标签_V4.csv", bounty_rows, 'gbk' ) # Maya Ubud → 酒店库 append_to_production( r"C:\Users\a\Desktop\资源\巴厘岛酒店资源库_2026标准版_V4_FINAL.csv", maya_rows, 'utf-8-sig' ) Step 7:输出报告 入库完成后,向用户报告(路径为实际从提示词中提取的值): 入库完成 ━━━━━━━━━━━━━━ 合同文件:BOUNTY Cruises - March 2026.pdf 资源类型:活动(Activity) 目标库:{从提示词提取的模型文件路径}\活动标准化完整版_含人群标签与特色标签_V4.csv 新增记录:4 条 输出目录:{从提示词提取的目标路径}\ Step 8:清理临时文件 目标文件夹只保留结果文件,入库完成后删除以下内容: 文件类型 示例 删除原因 原始合同 PDF/Word BOUNTY Cruises - March 2026.pdf 原始文件不留在输出目录 解析中间文件 parsed_results.json 仅作中间处理使用,不交付用户 保留文件: {目标路径}\ ├── bounty_activity_out.csv ← 新增的活动数据(追加到生产库) └── maya_hotel_out.csv ← 新增的酒店数据(追加到生产库) import os # 入库完成后清理 temp_files = [ os.path.join(target_dir, "parsed_results.json"), os.path.join(target_dir, "BOUNTY Cruises - March 2026.pdf"), os.path.join(target_dir, "Maya Ubud Contract Valid 31 Mar 2025.pdf"), ] for f in temp_files: if os.path.exists(f): os.remove(f) print(f