Skill: lijingxu007/tc-travel (version 1.0.0)

# Skill Name 旅游定制助手 (Travel Customizer) # Description 这是一个专为旅游行业设计的智能助手。它能通过自然对话引导用户提供详细的旅游需求（目的地、人数、预算等），并在用户确认后，自动将结构化数据提交到管理员配置的飞书多维表格中。 # Configuration Variables 用户在安装此技能时，需要在 ClawHub 面板配置以下环境变量： - `FEISHU_APP_ID`: 飞书自建应用的 App ID (cli_开头) - `FEISHU_APP_SECRET`: 飞书自建应用的 App Secret - `FEISHU_BASE_TOKEN`: 飞书多维表格的 Base Token (bascn_开头) - `FEISHU_TABLE_ID`: 目标数据表的 Table ID (tbl_开头) # Tools 此技能提供以下工具供 AI 调用： ## submit_to_feishu **描述**: 将收集到的旅游需求提交到飞书多维表格。 **参数**: - `name` (string, required): 用户姓名 - `phone` (string, required): 联系电话 - `destination` (string, required): 意向目的地 - `people_count` (integer, required): 出行人数 - `departure_date` (string, optional): 预计出发日期 (YYYY-MM-DD) - `budget` (number, optional): 人均预算 - `preferences` (array[string], optional): 行程偏好列表 (如: ["美食", "休闲"]) - `special_requirements` (string, optional): 特殊需求备注 # Workflow Instructions (System Prompt) 1. **角色设定**: 你是一名专业、热情的旅游定制顾问。 2. **信息收集**: - 主动询问用户缺失的必填项 (`name`, `phone`, `destination`, `people_count`)。 - 礼貌地追问选填项 (`budget`, `date`, `preferences`) 以提供更好的服务。 3. **隐私保护**: 在对话中展示手机号时，请隐藏中间四位 (如: 138****8000)。 4. **确认机制 (关键)**: - 在调用 `submit_to_feishu` 之前，**必须**生成一份摘要让用户确认。 - 话术示例：“好的，为您总结一下：[姓名] 计划去 [目的地]，共 [人数] 人，预算 [预算]。确认立即提交给定制团队吗？” - 只有当用户明确回复“确认”、“是的”、“提交”时，才执行工具调用。 5. **结果反馈**: - 工具返回成功 -> 回复：“🎉 提交成功！我们的专家将在 24 小时内联系您。” - 工具返回失败 -> 回复：“❌ 提交暂时失败，可能是网络问题，请您稍后重试或直接联系客服。” # Example Conversation User: 我想去日本玩，两个人。 Assistant: 太棒了！日本是个很好的选择。请问您大概什么时候出发？还有怎么称呼您呢？ User: 叫我张三，下个月初吧。 Assistant: 好的张三先生。那您的人均预算大概是多少呢？另外有什么特别想体验的吗（比如美食、购物或温泉）？ User: 预算一人1万吧，主要想吃美食。电话是 13800138000。 Assistant: 收到，帮您确认一下信息： - 姓名：张三 - 电话：138****8000 - 目的地：日本 - 人数：2人 - 时间：下个月初 - 预算：10000元/人 - 偏好：美食 确认无误后我将立即提交给定制团队，可以吗？ User: 确认。 Assistant: (调用 submit_to_feishu 工具) Assistant: 🎉 您的需求已成功提交！我们的资深顾问稍后会通过电话与您联系，为您规划详细行程。

path: requirements.txt
content: requests>=2.28.0

path: tools.py
content: import os
import requests
from typing import List, Optional, Dict, Any

# 飞书 API 基础配置
FEISHU_API_BASE = "https://open.feishu.cn/open-apis"

def get_tenant_access_token(app_id: str, app_secret: str) -> str:
    """获取飞书 Tenant Access Token"""
    url = f"{FEISHU_API_BASE}/auth/v3/tenant_access_token/internal"
    payload = {
        "app_id": app_id,
        "app_secret": app_secret
    }
    try:
        resp = requests.post(url, json=payload, timeout=10)
        resp.raise_for_status()
        data = resp.json()
        
        if data.get('code') != 0:
            raise Exception(f"Feishu Auth Failed: {data.get('msg')}")
        
        return data['tenant_access_token']
    except Exception as e:
        raise Exception(f"Network or Auth Error: {str(e)}")

def submit_to_feishu(
    name: str,
    phone: str,
    destination: str,
    people_count: int,
    departure_date: Optional[str] = "",
    budget: Optional[float] = 0.0,
    preferences: Optional[List[str]] = None,
    special_requirements: Optional[str] = ""
) -> Dict[str, Any]:
    """
    ClawHub 工具函数：将旅游需求提交到飞书多维表格
    此函数名将直接被 SKILL.md 中的定义引用
    """
    # 从环境变量读取配置
    app_id = os.getenv("FEISHU_APP_ID")
    app_secret = os.getenv("FEISHU_APP_SECRET")
    base_token = os.getenv("FEISHU_BASE_TOKEN")
    table_id = os.getenv("FEISHU_TABLE_ID")

    # 校验配置
    missing_configs = []
    if not app_id: missing_configs.append("FEISHU_APP_ID")
    if not app_secret: missing_configs.append("FEISHU_APP_SECRET")
    if not base_token: missing_configs.append("FEISHU_BASE_TOKEN")
    if not table_id: missing_configs.append("FEISHU_TABLE_ID")
    
    if missing_configs:
        return {
            "status": "error", 
            "message": f"技能配置缺失，请联系管理员配置: {', '.join(missing_configs)}"
        }

    try:
        # 1. 获取 Token
        [REDACTED_SECRET], app_secret)
        
        # 2. 构建字段映射 (必须与飞书表格列名严格一致)
        fields = {
            "姓名": name,
            "联系电话": phone,
            "意向目的地": destination,
            "出行人数": people_count
        }
        
        if departure_date:
            fields["预计出发日期"] = departure_date
        
        if budget and budget > 0:
            fields["人均预算"] = budget
            
        if preferences and len(preferences) > 0:
            fields["行程偏好"] = preferences
            
        if special_requirements:
            fields["特殊需求"] = special_requirements

        # 3. 调用飞书新增记录 API
        url = f"{FEISHU_API_BASE}/bitable/v1/apps/{base_token}/tables/{table_id}/records"
        headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json"
        }
        payload = {
            "records": [{"fields": fields}]
        }
        
        resp = requests.post(url, headers=headers, json=payload, timeout=10)
        resp.raise_for_status()
        result = resp.json()
        
        if result.get('code') == 0:
            return {"status": "success", "message": "需求已成功提交至飞书表格！"}
        else:
            return {"status": "error", "message": f"飞书 API 错误: {result.get('msg')}"}

    except Exception as e:
        return {"status": "error", "message": f"系统异常: {str(e)}"}

if __name__ == "__main__":
    # 本地调试用
    print("Tools module loaded successfully.")

path: README.md
content: # 🌍 旅游定制助手 (Travel Customizer)

这是一个专为旅游从业者设计的 OpenClaw 技能插件。它能通过自然对话收集客户的旅游需求，并自动结构化存储到**飞书多维表格**中，极大提高需求收集效率。

## ✨ 功能特点
- **智能对话**: 自动引导用户补充缺失的关键信息（如人数、预算）。
- **二次确认**: 提交前强制要求用户确认信息，避免错误录入。
- **无缝集成**: 数据直达飞书多维表格，方便团队协作跟进。
- **隐私保护**: 对话中自动脱敏敏感信息。

## 🚀 安装与配置

### 前置准备
1. **创建飞书多维表格**:
   - 新建表格，包含以下列名（必须完全一致）：`姓名`, `联系电话`, `意向目的地`, `出行人数`, `预计出发日期`, `人均预算`, `行程偏好`, `特殊需求`。
   - 获取表格的 `Base Token` 和 `Table ID`。

2. **创建飞书自建应用**:
   - 访问 [飞书开放平台](https://open.feishu.cn/)。
   - 创建应用，开通 `bitable:app` 和 `base:record:create` 权限。
   - 获取 `App ID` 和 `App Secret`。

### 在 ClawHub 中安装
1. 在 ClawHub 搜索 "旅游定制助手" 并点击安装。
2. 在配置页面填入以下信息：
   - **飞书 App ID**: `cli_xxxxx`
   - **飞书 App Secret**: `xxxxx`
   - **飞书 Base Token**: `bascn_xxxxx`
   - **飞书 Table ID**: `tbl_xxxxx`
3. 保存配置即可开始使用。

## 💬 使用示例
> **用户**: 我想去日本玩，两个人。
> **助手**: 好的！请问您大概什么时候出发？人均预算是多少呢？还有您的称呼是？
> ...
> **助手**: 收到，帮您总结一下：张三先生，2人去日本，预算人均1万，下月出发。确认提交给定制团队吗？
> **用户**: 确认。
> **助手**: ✅ 提交成功！顾问稍后联系您。



Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)