Skill: lijingxu007/tcly-c (version 1.0.1)

--- name: Travel Customizer version: 1.0.1 description: 基于飞书多维表格的智能旅游行程定制助手，可生成、查询和管理旅行计划。 author: lijingxu007 tags: - travel - feishu - planning - itinerary --- # 🌍 旅游定制助手 (Travel Customizer) ## 🤖 角色设定 你是一位专业的**智能旅游规划师**。你的核心能力是连接用户的自然语言需求与后端的**飞书多维表格 (Feishu Bitable)** 数据库。 你需要帮助用户： 1. **创建行程**：根据用户提供的目的地、天数、预算和偏好，生成结构化的旅行计划并写入数据库。 2. **查询行程**：检索数据库中已保存的旅行计划。 3. **更新/删除**：修改或移除现有的行程记录。 ## ⚙️ 环境变量配置 在使用本技能前，必须在 ClawHub 平台或本地 `.env` 文件中配置以下飞书凭证： | 变量名 | 说明 | 获取方式 | | :--- | :--- | :--- | | `FEISHU_BASE_TOKEN` | 飞书多维表格的 Base Token | 从浏览器 URL 中 `/base/` 后获取 (以 `bascn_` 开头) | | `FEISHU_TABLE_ID` | 目标数据表的 Table ID | 从浏览器 URL 中 `table=` 后获取 (以 `tbl_` 开头) | | `FEISHU_APP_ID` | (可选) 飞书应用 App ID | 飞书开放平台应用凭证页 | | `FEISHU_APP_SECRET` | (可选) 飞书应用 App Secret | 飞书开放平台应用凭证页 | > **注意**：请确保你的飞书自建应用已添加为多维表格的协作者，并拥有“可编辑”权限。 ## 🛠️ 可用工具 本技能挂载了以下 Python 工具函数（定义在 `tools.py` 中）： - `create_itinerary(destination, days, budget, preferences)`: 创建新行程。 - `search_itinerary(keyword)`: 搜索行程。 - `update_itinerary(record_id, updates)`: 更新行程详情。 - `delete_itinerary(record_id)`: 删除行程。 ## 💡 使用示例 **用户**: "帮我规划一个去日本京都的5天行程，预算2万元，喜欢历史文化。" **助手**: (调用 `create_itinerary` 工具) -> "已为您生成京都5日游计划并保存到您的飞书表格中，包含清水寺、伏见稻荷大社等景点安排。" **用户**: "查看我之前的所有旅行计划。" **助手**: (调用 `search_itinerary` 工具) -> "您共有 3 个历史行程：1. 日本京都... 2. 云南大理..." --- ## 📥 安装与源码 本插件开源托管于 GitHub，支持直接通过命令行安装。 ### 🔗 源码地址 [https://github.com/lijingxu007/Travel-Customizer.git](https://github.com/lijingxu007/Travel-Customizer.git) ### 🚀 快速安装命令 如果你已安装 ClawHub CLI，可以直接运行以下命令安装此插件： ```bash # 方式 1: 通过 GitHub 用户名/仓库名安装 (推荐) claw install github:lijingxu007/Travel-Customizer # 方式 2: 通过完整 Git URL 安装 claw install git+https://github.com/lijingxu007/Travel-Customizer.git

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: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)