Skill: mobsupport/android-smssdk-integration (version 1.0.0)

--- name: android-smssdk-integration description: Interactive guide for integrating MobTech SMSSDK (短信验证) into Android projects with 6-step workflow. Use when user says "我要在app中增加短信验证", "SMSSDK集成", "Android短信验证码", "配置短信验证", or asks about SMSSDK setup, Gradle configuration, SMS verification, MobSDK appKey, privacy compliance. Supports step-by-step interactive integration with user confirmation at each step. tags: - android - smssdk - mobtech - sms-verification - mobile-verification - gradle - privacy - interactive-integration --- # Android SMSSDK (短信验证) 集成 Skill ## 适用场景 当用户提到以下任一主题时，使用本 skill： - android smssdk - 短信验证集成 - 短信验证码 - 语音验证码 - SMSSDK SDK 接入 - **我要在app中增加短信验证** - **我要在Android项目中接入短信验证码功能** - **帮我配置短信验证** - **一键集成 SMSSDK** - **快速接入短信验证** - **自动配置 SMSSDK** 如果用户问题明确与 Android 的短信验证接入、工程配置、验证码功能、自定义 UI 有关，应优先使用本 skill。 --- ## 6 步交互式集成工作流 当用户表达集成 SMSSDK 的意图时，执行以下 6 步交互式流程。每步操作前都需要展示内容给用户确认，获得明确同意后再执行。 --- ### 步骤 1：启动流程 #### 1-1 触发识别 用户可能通过以下方式表达集成意图： - "我要在app中增加短信验证" - "帮我集成 SMSSDK 到 Android 项目" - "配置短信验证" - "一键集成短信验证" - "Android 短信验证码功能怎么接入" #### 1-2 询问项目路径 **主动询问用户**： ``` 我来帮你集成 SMSSDK 短信验证功能。 请提供需要集成的 Android 项目根路径，例如： /Users/xxx/your-android-project 请确保项目包含 app/build.gradle 文件。 ``` #### 1-3 验证路径合法性 **验证逻辑**： 1. 检查路径是否存在 2. 检查路径下是否有 `app/build.gradle` 或 `settings.gradle` 文件 3. 检查是否为有效的 Android 项目结构 **如果路径不合法**： ``` 路径验证失败，可能原因： - 路径不存在：{path} - 未找到 app/build.gradle 文件，请确认这是 Android 项目根目录 请重新提供正确的项目路径。 ``` **如果路径合法**：进入步骤 2 --- ### 步骤 2：注册 SMSSDK 配置信息 #### 2-1 生成配置模板文件 **操作**： 1. 在 skill 目录中运行 Python 脚本生成 `SMSSDK_Config_Template.xlsx` ```bash python {skill_dir}/assets/generate_excel_template.py ``` 2. 将生成的 `SMSSDK_Config_Template.xlsx` 复制到用户项目根目录，命名为 `SMSSDK_Config.xlsx` **告知用户**： ``` 已在你项目的根目录生成 {path}/SMSSDK_Config.xlsx 配置文件。 请打开该文件，按以下步骤填写： 1. 在"基础信息"Sheet 中填写 MobTech 的 appKey 和 appSecret （从 https://www.mob.com/ 注册应用获取） 2. 填写 Android 包名 3. "短信签名审核"Sheet 中填写短信签名信息（企业需审核，个人使用默认【掌淘科技】） 4. "填写说明"Sheet 中有详细说明 ⚠️ 重要提醒： - 短信签名审核通过后才能正常下发短信 - 请前往 MobTech 开发者工作台提交短信签名审核 - 国际短信签名无需审核，直接自行输入英文即可 填写完成后告诉我"填好了"，我将继续下一步。 ``` #### 2-2 等待用户填写完成 等待用户回复"填好了"或类似表达。 #### 2-3 读取并验证配置 **操作**：读取用户项目根目录的 `SMSSDK_Config.xlsx` 文件 **验证规则**： | 检查项 | 规则 | 不通过时的提示 | |--------|------|---------------| | appKey | 必填，不能为空字符串 | "基础信息 Sheet 中的 appKey 未填写，请从 MobTech 官网获取" | | appSecret | 必填，不能为空字符串 | "基础信息 Sheet 中的 appSecret 未填写" | | 包名 | 必填，格式应为 com.xxx.xxx | "包名格式不正确，应为 com.xxx.xxx 格式" | **类型转换规则**： - `appKey`、`appSecret`、`包名` 等标识符字段：**强制转为字符串**（加引号） **如果不合法**： ``` 配置信息验证失败，请修正以下问题： {具体问题列表} - 第 1 条：{问题描述} - 第 2 条：{问题描述} 请修改 Excel 文件后保存，然后重新告诉我"填好了"。 ``` **如果合法**：提取配置信息，进入步骤 3 --- ### 步骤 3：完成 SDK 集成 #### 3-1 Gradle 环境配置 根据项目 AGP 版本（通过检查 `gradle/wrapper/gradle-wrapper.properties` 中的 distributionUrl 判断），选择对应配置方式。 **【7.0及以上版本】** ##### 文件 1：settings.gradle（AGP 7.0+） **展示内容**： ```groovy pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() maven { url "https://mvn.mob.com/android" } } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositories { gradlePluginPortal() google() mavenCentral() maven { url "https://mvn.mob.com/android" } } } ``` ##### 文件 2：项目级 build.gradle **展示内容**： ```groovy buildscript { dependencies { // 增加 MobSDK 插件配置 classpath "com.mob.sdk:MobSDK2:+" // 如需集成 FCM，增加以下配置（非必须） classpath 'com.google.gms:google-services:4.3.14' } } ``` **7.0以下版本** 在项目级 `build.gradle` 中配置： ```groovy allprojects { repositories { maven { url "https://mvn.mob.com/android" } } } buildscript { repositories { maven { url "https://mvn.mob.com/android" } } dependencies { // 增加 MobSDK 插件配置 classpath "com.mob.sdk:MobSDK2:+" } } ``` ##### 文件 3：gradle.properties **主动询问是否上架googleplay** 如果开发者回答:是/YES 则配置 ```properties MobSDK.spEdition=GPP ``` 否则(否/NO): 则使用如下配置 ```properties MobSDK.spEdition=FP ``` ##### 文件 4：app/build.gradle **生成规则**： 1. **类型转换**：`appKey`、`appSecret` 等标识符：**强制转为字符串**（加引号） **展示内容**： ```groovy // 在文件开头添加插件（根据你的 plugins 块结构选择一种） // 方式 A apply plugin: 'com.mob.sdk' // 方式 B plugins { id 'com.android.application' id 'com.mob.sdk' } // 在文件末尾添加 MobSDK 配置代码 MobSDK { appKey "{用户填写的appKey}" appSecret "{用户填写的appSecret}" SMSSDK {} } ``` **询问**："以上是要添加到 app/build.gradle 的内容，是否确认修改？" #### 3-2 执行 Gradle Sync **说明**：修改 build.gradle 后，需要同步 Gradle 配置才能生效： - 命令行 `./gradlew`：下载依赖、编译代码 - Android Studio Sync：让 IDE 解析 build.gradle 配置，更新项目结构索引 **尝试自动执行**： ```bash cd {project_path} ./gradlew --refresh-dependencies ``` **如果成功**： ``` 命令行 Gradle Sync 成功，依赖已拉取。 ⚠️ 如果你在 Android Studio 中开发，请再执行一次 IDE Sync： 1. 打开 Android Studio 2. 点击菜单栏 File -> Sync Project with Gradle Files 3. 或点击右上角大象图标（Sync Now） ``` **如果失败**： ``` 自动 Gradle Sync 失败，可能原因： - Gradle 未配置环境变量 - 网络问题无法下载依赖 请在 Android Studio 中手动执行： 1. 打开项目 2. 点击菜单栏 File -> Sync Project with Gradle Files 3. 或点击 Gradle 面板中的刷新按钮 ``` 至此，Gradle集成方式环境搭建已经完成。 进入步骤 4 --- ### 步骤 4：补充隐私合规 #### 4-1 说明隐私授权 **向用户说明**： ``` 根据工信部合规要求和 MobTech 隐私合规规范，使用 SMSSDK 需要在用户同意《隐私政策》后才能初始化 SDK。 你需要在 App 中： 1. 首次启动时展示《隐私政策》弹窗 2. 用户点击"同意"按钮后，调用隐私授权代码 3. 用户点击"不同意"则不应调用 请告知我：用户点击隐私政策"同意"按钮的回调代码在哪个文件、哪个方法中？ 例如：MainActivity.java 的 onPrivacyAgreed() 方法 ``` 等待用户告知具体的文件路径和方法名。 **展示要插入的代码**： ```java // 用户同意隐私政策后调用 MobSDK.submitPolicyGrantResult(true); ``` **完整示例**： ```java public void onPrivacyAgreed() { // 用户点击同意按钮 // === SMSSDK 隐私授权 === MobSDK.submitPolicyGrantResult(true); // ========================== // 其他业务逻辑... } ``` #### 4-2 确认隐私授权代码 **询问**：`"以上代码将插入到 {文件} 的 {方法} 中，是否确认？"` #### 4-3 执行插入 用户确认后，将代码插入指定位置。 进入步骤 5 --- ### 步骤 5：插入短信验证代码 #### 5-1 询问集成方式 **说明**：SMSSDK 支持两种使用方式： 1. **自带 UI 页面**（快速集成）：SDK 提供默认注册页面，一行代码拉起 2. **自定义集成**（灵活定制）：自己写 UI，调用 SDK 底层接口 **询问**：`"请选择集成方式：\n1. 自带 UI 页面（快速，一行代码拉起默认注册页）\n2. 自定义集成（灵活，自己写 UI + 调用底层接口）\n\n回复 1 或 2。"` #### 5-2 方式一：自带 UI 页面 **等待用户告知**：要插入代码的文件路径和方法名。 **展示要插入的代码**： ```java // === SMSSDK 自带 UI 页面 === RegisterPage page = new RegisterPage(); page.setTempCode(null); // 未申请模板编号时传 null page.setRegisterCallback(new EventHandler() { @Override public void afterEvent(int event, int result, Object data) { if (result == SMSSDK.RESULT_COMPLETE) { // 成功回调 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { // 提交验证码成功 } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { // 获取验证码成功 } } else { // 失败回调 ((Throwable) data).printStackTrace(); } } }); page.show(context); // ========================== ``` **询问**：`"以上代码将插入到 {文件} 的 {方法} 中，是否确认？"` 用户确认后，将代码插入指定位置。 #### 5-3 方式二：自定义集成 **等待用户告知**：要插入代码的文件路径和方法名。 **展示要插入的代码**： **注册 EventHandler**： ```java // 注册短信回调（建议在 onCreate 中调用） EventHandler eh = new EventHandler() { @Override public void afterEvent(int event, int result, Object data) { if (result == SMSSDK.RESULT_COMPLETE) { // 成功回调 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { // 提交验证码成功 // TODO 利用验证码进行后续操作 } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { // 获取验证码成功 // TODO 提示用户查收短信 } else if (event == SMSSDK.EVENT_GET_VOICE_VERIFICATION_CODE) { // 获取语音验证码成功 } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { // 返回支持发送验证码的国家列表 } } else { // 失败回调 ((Throwable) data).printStackTrace(); } } }; SMSSDK.registerEventHandler(eh); ``` **获取验证码**： ```java // 请求文本验证码（不带模板编号） SMSSDK.getVerificationCode("86", "手机号"); // 请求语音验证码（需先发送完文本验证码） SMSSDK.getVoiceVerifyCode("86", "手机号"); // 提交验证码 SMSSDK.submitVerificationCode("86", "手机号", "验证码"); ``` **注销监听**（建议在 Activity 的 onDestroy 中调用）： ```java SMSSDK.unregisterEventHandler(eh); ``` **询问**：`"以上代码将插入到 {文件} 的 {方法} 中，是否确认？"` 用户确认后，将代码插入指定位置。 进入步骤 6 --- ### 步骤 6：完成集成 #### 6-1 生成项目级 README **操作**：在用户项目根目录生成 `SMSSDK_README.md`，内容包含集成说明、关键文件位置、后续修改指引。 #### 6-2 完成告知 **向用户说明**： ``` SMSSDK 集成已完成！ 📁 生成的文件： - {project_path}/SMSSDK_README.md — 集成说明文档 📝 后续修改位置： - 修改 SDK 配置：app/build.gradle 中的 MobSDK { } 块 - 修改隐私授权位置：{privacy_file} 的 {privacy_method} 方法 - 修改短信回调：{callback_file} 的 {callback_method} 方法 📖 更多帮助： - 短信验证集成指南：https://mob.com/wiki/detailed?wiki=440&id=23 - SDK API：https://mob.com/wiki/detailed?wiki=440&id=23 - 产品简介：https://mob.com/wiki/detailed?wiki=163&id=23 - 合规指南：https://mob.com/wiki/detailed?wiki=210&id=23 - 服务端验证 API：https://mob.com/wiki/detailed?wiki=112&id=23 - 短信设置：https://mob.com/wiki/detailed?wiki=452&id=23 - 常见问题：https://mob.com/wiki/detailed?wiki=123&id=23 ⚠️ 重要提醒： 1. 确保短信签名审核已通过（否则无法正常下发短信） 2. 确保包名与 MobTech 后台配置一致 3. 必须配置《隐私政策》并在用户同意后调用 submitPolicyGrantResult 4. Android 9.0+ 如需 HTTP 请求需配置 usesCleartextTraffic="true" 5. 回调 afterEvent 在子线程，不可直接处理 UI，需传到主线程 ``` --- ## 附录：技术参考 ### A. Gradle 配置参考 #### A.1 Gradle 插件 7.0 及以上 在 `settings.gradle` 中： ```groovy pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() maven { url "https://mvn.mob.com/android" } } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositories { gradlePluginPortal() google() mavenCentral() maven { url "https://mvn.mob.com/android" } } } ``` 在项目级 `build.gradle` 中： ```groovy buildscript { dependencies { classpath "com.mob.sdk:MobSDK2:+" } } ``` #### A.2 Gradle 插件 7.0 以下 在项目级 `build.gradle` 中配置： ```groovy allprojects { repositories { maven { url "https://mvn.mob.com/android" } } } buildscript { repositories { maven { url "https://mvn.mob.com/android" } } dependencies { classpath "com.mob.sdk:MobSDK2:+" } } ``` #### A.3 应用级启用插件 ```groovy // 方式 A apply plugin: 'com.mob.sdk' // 方式 B plugins { id 'com.android.application' id 'com.mob.sdk' } ``` #### A.4 gradle.properties 配置 ```properties MobSDK.spEdition=FP // 上架 Google Play 则改为 GPP ``` --- ### B. 短信 SDK API #### B.1 注册回调 ```java EventHandler eh = new EventHandler() { @Override public void afterEvent(int event, int result, Object data) { if (result == SMSSDK.RESULT_COMPLETE) { // 成功 } else { // 失败 ((Throwable) data).printStackTrace(); } } }; SMSSDK.registerEventHandler(eh); ``` #### B.2 获取验证码 ```java // 文本验证码 SMSSDK.getVerificationCode("86", "手机号"); // 带模板编号 SMSSDK.getVerificationCode("模板编号", "86", "手机号"); // 语音验证码（需先发送完文本验证码） SMSSDK.getVoiceVerifyCode("86", "手机号"); ``` #### B.3 提交验证码 ```java SMSSDK.submitVerificationCode("86", "手机号", "验证码"); ``` #### B.4 获取国家列表 ```java SMSSDK.getSupportedCountries(); ``` #### B.5 注销监听 ```java SMSSDK.unregisterEventHandler(eh); ``` #### B.6 本机号码验证（可选） ```java // 获取 token SMSSDK.getToken(); // 验证本机号码 SMSSDK.login("手机号", new TokenVerifyResult("opToken", "token", "operator")); ``` > **注意**：当同时使用秒验（MSSDK）和短信（SMSSDK）时，默认支持本机号验证，**不需要**也**不能**通过开关打开。仅单独使用短信 SDK 时才需要配置 `mobileAuth true`。 --- ### C. 隐私合规要求 必须提醒用户： 1. App 需要有《隐私政策》 2. 隐私政策中必须明确说明使用 MobTech 短信验证服务 3. 首次冷启动展示隐私政策并获取用户同意 4. 同意后调用 `MobSDK.submitPolicyGrantResult(true)` 5. 不同意时不能调用该方法 隐私政策参考条款： > "我们使用了第三方（上海掌之淘信息技术有限公司，以下称"MobTech"）MobTech 短信验证服务为您提供短信验证功能。为了顺利实现该功能，您需要授权 MobTech SDK 提供对应的服务；在您授权后，MobTech 将收集您相关的个人信息。" 完整合规指南：https://mob.com/wiki/detailed?wiki=210&id=23 --- ### D. 短信签名审核 SMSSDK 需要短信签名才能下发短信。 **签名类型要求**（自 2025-08-01 起）： - **公司签名**（推荐）：与企业营业执照名称完全一致，或简称需包含在营业执照全称中 - **商标签名**：商标需已在中国商标网完成注册 - ~~网站/公众号/小程序签名~~（已不再支持） **个人用户**：默认使用【掌淘科技】签名 **企业用户**：需上传营业执照审核 国际短信签名：无需审核，直接自行输入英文即可。 --- ### E. 常见问题排查 | 问题 | 可能原因 | |------|----------| | 验证码发送失败 | 短信签名未审核通过、包名不一致、网络异常 | | 验证码接收慢 | 运营商通道问题，可尝试语音验证码 | | Gradle Sync 失败 | 仓库地址配置错误、网络问题 | | 回调在子线程 | afterEvent 在子线程执行，处理 UI 需传到主线程 | | 服务端验证失败 | 未开启服务端验证开关、IP 未加入白名单 | --- ## 回答边界 - 仅聚焦 Android SMSSDK 工程集成与合规 - 不扩展到 iOS、服务端（仅参考服务端验证 API 文档）、非 MobTech SDK - 不伪造真实账号、密钥、签名值

path: README.md
content: # android-smssdk-integration

一个面向 OpenClaw / ClawHub 的 Android SMSSDK (短信验证) 集成 Skill，采用交互式工作流程。

## 用途

当用户提到以下主题时触发：

- 我要在app中增加短信验证
- 帮我集成 SMSSDK 到 Android 项目
- 帮我配置短信验证
- android smssdk
- SMSSDK 集成
- 短信验证码
- MobSDK 短信功能接入

## 目录结构

```
android-smssdk-integration/
├── SKILL.md                              # 核心 Skill 定义（交互式工作流程）
├── README.md                             # 本文件
├── assets/
│   └── generate_excel_template.py        # 生成 Excel 模板的脚本
└── examples/
    └── example-prompts.md                # 示例触发问法
```

## 交互式集成工作流

本 Skill 采用交互式工作流程，每步操作前都会展示内容给用户确认：

1. **启动流程**：询问并验证项目路径
2. **获取配置信息**：引导用户从 MobTech 后台获取 AppKey / AppSecret
3. **完成 Gradle 集成**：逐个文件展示修改内容，确认后执行
4. **配置隐私合规**：插入隐私授权代码
5. **完成集成**：生成项目级 README 文档

## 支持功能

- Android Gradle Plugin 7.0+
- Android Gradle Plugin 7.0 以下
- MobSDK 插件集成
- SMSSDK AppKey / AppSecret 配置
- 首次冷启动隐私授权回传
- Google Play 版本配置（GPP）
- 短信验证码 API 调用示例

## 重要提醒

- **工信部合规必需**：用户同意隐私协议后才能调用 `MobSDK.submitPolicyGrantResult()`
- **minSdkVersion 19**：最低支持 Android 5.0
- **MobTech 后台配置**：确保包名与后台配置一致

## 建议放置位置

将此目录放入 OpenClaw workspace 的 `skills/` 目录中。

## 参考资料

- [Mob 文档中心](https://www.mob.com/wiki/list)
- [产品简介](https://mob.com/wiki/detailed?wiki=163&id=23)
- [短信验证集成指南](https://mob.com/wiki/detailed?wiki=440&id=23)
- [SDK API](https://mob.com/wiki/detailed?wiki=440&id=23)
- [服务端验证 API](https://mob.com/wiki/detailed?wiki=112&id=23)
- [短信设置](https://mob.com/wiki/detailed?wiki=452&id=23)
- [合规指南](https://mob.com/wiki/detailed?wiki=210&id=23)
- [常见问题](https://mob.com/wiki/detailed?wiki=123&id=23)
- [关于短信签名申请规则更新的公告](https://mob.com/wiki/detailed?wiki=732&id=23)


path: _meta.json
content: ownerId: kn74wfhpmhkqcpz21tdd0cxqx185cpvq
slug: android-smssdk-integration
version: 1.0.0
publishedAt: 0

path: assets/generate_excel_template.py
content: #!/usr/bin/env python3
"""
生成 SMSSDK 配置模板 Excel 文件
"""

import os
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter


def create_sheet_with_header(wb, sheet_name, headers, data):
    """创建带表头的 Sheet"""
    if sheet_name in wb.sheetnames:
        ws = wb[sheet_name]
    else:
        ws = wb.create_sheet(title=sheet_name)

    # 设置表头样式
    header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
    header_font = Font(bold=True, color="FFFFFF", size=11)
    header_alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)

    # 写入表头
    for col, header in enumerate(headers, 1):
        cell = ws.cell(row=1, column=col, value=header)
        cell.fill = header_fill
        cell.font = header_font
        cell.alignment = header_alignment

    # 写入数据
    for row_idx, row_data in enumerate(data, 2):
        for col_idx, value in enumerate(row_data, 1):
            cell = ws.cell(row=row_idx, column=col_idx, value=value)
            cell.alignment = Alignment(vertical="center", wrap_text=True)

    # 设置列宽
    ws.column_dimensions['A'].width = 25
    ws.column_dimensions['B'].width = 50
    ws.column_dimensions['C'].width = 40

    # 冻结首行
    ws.freeze_panes = 'A2'

    return ws


def create_basic_info_sheet(wb):
    """创建基础信息 Sheet"""
    headers = ["配置项", "说明", "您的信息（必填）"]
    data = [
        ["AppKey", "SMSSDK应用Key，从MobTech官网(https://www.mob.com/)注册应用获取", ""],
        ["AppSecret", "SMSSDK应用密钥，与AppKey一同获取", ""],
        ["包名", "Android应用包名，如：com.example.app", ""],
        ["签名MD5", "Android签名MD5（去掉冒号并转小写），如：a1b2c3d4e5f6...", ""],
        ["短信签名审核", "是否已在MobTech后台提交短信签名审核并通过（填写是或否）", "否"],
    ]
    ws = create_sheet_with_header(wb, "基础信息", headers, data)

    # 标记必填项
    for row in range(2, 7):
        cell = ws.cell(row=row, column=1)
        cell.font = Font(bold=True, color="FF0000")

    return ws


def create_privacy_sheet(wb):
    """创建隐私合规 Sheet"""
    headers = ["说明项", "详细内容"]
    data = [
        ["合规要求", "根据工信部合规要求和中国区 App 上架规范，使用 MobSDK 需要在用户同意隐私政策后才能初始化 SDK"],
        ["隐私政策条款", "在 App 隐私政策中应包含以下参考条款：\n\"我们使用了第三方（上海掌之淘信息技术有限公司，以下称\"MobTech\"）MobTech 短信验证服务为您提供短信验证功能。为了顺利实现该功能，您需要授权 MobTech SDK 提供对应的服务；在您授权后，MobTech 将收集您相关的个人信息。关于 MobTech 所收集的信息种类、用途、个人信息保护的规则及退出机制等，详见短信验证隐私政策。\"", ""],
        ["代码位置", "在用户点击隐私政策\"同意\"按钮的回调中添加授权代码"],
        ["调用时机", "必须先展示隐私政策弹窗，用户点击\"同意\"后才能调用"],
        ["授权代码", "MobSDK.submitPolicyGrantResult(true, null);\n\n参数说明：\n- true: 用户同意隐私政策\n- null: 使用默认的隐私控制器"],
        ["替代方案", "MobSDK.submitPolicyGrantResult(MobCustomController cont, boolean auth);\n使用 MobCustomController 可限制 MobSDK 采集的数据维度"],
        ["合规指南", "https://mob.com/wiki/detailed?wiki=210&id=23", ""],
    ]

    ws = wb.create_sheet(title="隐私合规")

    # 设置表头
    header_fill = PatternFill(start_color="ED7D31", end_color="ED7D31", fill_type="solid")
    header_font = Font(bold=True, color="FFFFFF", size=11)

    for col, header in enumerate(headers, 1):
        cell = ws.cell(row=1, column=col, value=header)
        cell.fill = header_fill
        cell.font = header_font
        cell.alignment = Alignment(horizontal="center", vertical="center")

    # 写入数据
    for row_idx, row_data in enumerate(data, 2):
        for col_idx, value in enumerate(row_data, 1):
            cell = ws.cell(row=row_idx, column=col_idx, value=value)
            cell.alignment = Alignment(vertical="top", wrap_text=True)

    # 设置列宽和行高
    ws.column_dimensions['A'].width = 20
    ws.column_dimensions['B'].width = 80
    for row in range(2, len(data) + 2):
        ws.row_dimensions[row].height = 50

    return ws


def create_instructions_sheet(wb):
    """创建填写说明 Sheet"""
    headers = ["说明项", "详细内容"]
    data = [
        ["填写步骤", "1. 先在 MobTech 官网(https://www.mob.com/) 注册应用，获取 AppKey 和 AppSecret\n2. 在开发者后台完成应用登记和短信签名审核\n3. 填写基础信息（必填）\n4. 填写完成后告诉我\"填好了\"，我将继续下一步"],
        ["必填项", "基础信息 Sheet 中的 AppKey、AppSecret、包名是必填项\n短信签名审核必须通过才能正常使用"],
        ["重要提醒", "短信签名审核通过后才能正常使用短信验证功能\n企业用户需上传营业执照申请自定义签名\n个人用户默认使用【掌淘科技】签名"],
        ["短信签名要求", "字数限制：3-8个字，不能全英文，不能添加特殊字符\n企业用户需上传营业执照\n申请应用名称还需提供商标证明、软著证明或上线截图"],
        ["国际短信", "如需支持国外或港澳台短信发送，需在签名审核页面开启\"支持全球所有运营商\"开关，并配置相应的英文签名"],
        ["常见问题", "验证码发送失败：检查AppKey/AppSecret是否正确、包名是否与后台一致\n短信签名未审核：需在MobTech后台提交短信签名审核"],
    ]

    ws = wb.create_sheet(title="填写说明")

    # 设置表头
    header_fill = PatternFill(start_color="70AD47", end_color="70AD47", fill_type="solid")
    header_font = Font(bold=True, color="FFFFFF", size=11)

    for col, header in enumerate(headers, 1):
        cell = ws.cell(row=1, column=col, value=header)
        cell.fill = header_fill
        cell.font = header_font
        cell.alignment = Alignment(horizontal="center", vertical="center")

    # 写入数据
    for row_idx, row_data in enumerate(data, 2):
        for col_idx, value in enumerate(row_data, 1):
            cell = ws.cell(row=row_idx, column=col_idx, value=value)
            cell.alignment = Alignment(vertical="top", wrap_text=True)

    # 设置列宽和行高
    ws.column_dimensions['A'].width = 20
    ws.column_dimensions['B'].width = 80
    for row in range(2, len(data) + 2):
        ws.row_dimensions[row].height = 60

    return ws


def main():
    wb = Workbook()

    # 删除默认创建的 Sheet
    if "Sheet" in wb.sheetnames:
        wb.remove(wb["Sheet"])

    # 按顺序创建各个 Sheet
    create_basic_info_sheet(wb)
    create_privacy_sheet(wb)
    create_instructions_sheet(wb)

    # 调整 Sheet 顺序
    sheets = wb.sheetnames
    target_order = [
        "基础信息",
        "隐私合规",
        "填写说明",
    ]

    for idx, name in enumerate(target_order):
        if name in sheets:
            wb.move_sheet(name, offset=-wb.sheetnames.index(name) + idx)

    # 获取当前脚本的目录
    script_dir = os.path.dirname(os.path.abspath(__file__))
    # 拼接输出路径（脚本目录 + 文件名）
    output_path = os.path.join(script_dir, "SMSSDK_Config_Template.xlsx")
    
    # 保存文件
    wb.save(output_path)
    print(f"Excel 模板已生成: {output_path}")


if __name__ == "__main__":
    main()


path: examples/example-prompts.md
content: # Example Prompts

## 触发集成流程的问法

1. 我要在app中增加短信验证
2. 帮我集成 SMSSDK 到 Android 项目
3. 帮我配置短信验证
4. 一键集成 SMSSDK
5. 我要在 Android 项目中接入短信验证码功能
6. 根据skill一键集成 SMSSDK
7. 根据skill一键集成短信验证
8. Android 短信验证码功能集成

## 技术咨询类问法

9. android smssdk 怎么集成？
10. 我想在 Android 项目里接入 Mob 的短信验证，给我完整步骤
11. SMSSDK 的 Gradle 配置怎么写？
12. AppKey、AppSecret 应该配置在哪里？
13. MobSDK 隐私合规的 submitPolicyGrantResult 应该什么时候调用？
14. 我是 AGP 8.x，怎么集成 SMSSDK？
15. 我把 build.gradle 发你，你帮我改成能接入短信验证

## 功能使用类问法

16. 怎么调用 SMSSDK 获取验证码？
17. SMSSDK 短信验证怎么提交验证码？
18. SMSSDK 怎么获取国家列表？
19. SMSSDK 怎么自定义 UI？

## 排查问题类问法

20. 验证码发送失败是什么原因？
21. Android 9.0+ SMSSDK 需要配置什么？
22. SMSSDK 集成后 Gradle Sync 失败怎么办？
23. 短信验证失败，帮我排查一下


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