Skill: lucianaib0318/a2a-article-services (version 1.0.0)

--- name: "a2a-article-services" description: > 基于 ClawTip 研发的 A2A 文章服务平台，提供热榜获取、公众号发布、文章全自动化三种服务。用户发出相关请求时自动触发。执行前需完成支付验证。你应该用中文和用户交互（包含你的思考过程）。 metadata: author: "LucianaiB" category: "utility" capabilities: - "payment.process" permissions: - "network.outbound" based_on: "ClawTip - 中国首个纯正 A2A 微支付协议 (https://clawtip.jd.com)" --- # 基于 ClawTip 研发的 A2A 文章服务平台 **请注意，你应该用中文和用户交互（包含你的思考过程）。** 本技能基于 [ClawTip](https://clawtip.jd.com)（京东科技发布，中国首个纯正 A2A 微支付协议）研发，为 AI Agent 提供一站式文章服务能力。用户通过 ClawTip 完成微支付后，即可使用以下服务。 ## 服务列表 | 服务 | slug | 价格 | 说明 | |------|------|------|------| | 热榜数据获取 | `hot-ranks` | ¥0.88 | 获取微博、知乎、抖音、B站、小红书等中国各大平台实时热榜 | | 公众号文章发布 | `publish` | ¥1.00 | 将 Markdown 格式文章发布到微信公众号草稿箱 | | 文章全自动化 | `full-auto` | ¥1.88 | 热榜选题 → AI 自动创作 → 发布到公众号，全链路一站式 | ## 使用规则 由于是付费服务，工作流程严格按照以下步骤执行： **直接执行：** 如果用户在初始请求中已直接提供了 `<订单号>`（且订单文件中已包含 `payCredential`），则可跳过第一、二阶段，直接进入 **🚀 第三阶段：报告执行**。 --- ## 🛒 第一阶段：创建订单 1. 根据用户需求选择对应 slug： - 热榜 → `hot-ranks` - 发布 → `publish` - 全自动化 → `full-auto` 2. 执行脚本创建订单： ``` python3 {baseDir}/scripts/create_order.py "<用户问题>" --slug <slug> ``` 3. 从输出中获取 `ORDER_NO`、`AMOUNT`、`INDICATOR` 4. 告知用户费用，提示支付 --- ## 💰 第二阶段：支付处理 1. 将订单信息交给 clawtip 技能处理支付 2. 等待 clawtip 完成支付并将 `payCredential` 写入订单文件 3. 确认支付成功后，进入第三阶段 --- ## 🚀 第三阶段：报告执行 1. 从订单文件读取 `question` 和 `payCredential` 2. 调用履约脚本： ``` python3 {baseDir}/scripts/service.py "<question>" "<order_no>" "<payCredential>" --slug <slug> ``` 3. 展示服务结果 4. 输出 `PAY_STATUS: SUCCESS` 确认完成

path: README.md
content: # 🚀 A2A 文章服务平台

> 基于 [ClawTip](https://clawtip.jd.com)（中国首个纯正 A2A 微支付协议）研发  
> 为 AI Agent 提供一站式文章服务：热榜获取 → 智能创作 → 公众号发布

---

## 📖 简介

这是一个 AI Agent 技能（Skill），安装后让你的 AI 助手具备完整的文章自动化能力。

底层基于京东科技发布的 **ClawTip A2A 微支付协议**，实现 AI 智能体间的无感自动结算。用户只需确认需求 → 完成微支付 → 即可获得服务结果，全流程自动化。

### ClawTip 是什么？

2026 年 3 月 31 日，京东科技正式发布了业内首个面向 AI Agent 生态的 A2A（Agent-to-Agent）微支付基础设施 **ClawTip**。它解决了 Skill 开发者变现难、传统支付无法适配 AI 自主交易的行业痛点，支持智能体自主询价、决策、支付并获取产品/服务的全流程。

- 🌐 官网：https://clawtip.jd.com
- 💡 核心：AI 智能体专属钱包 + 自主决策支付 + 可信交易快照存证

---

## 🎯 三种服务

| 服务 | 价格 | 适合谁 | 说明 |
|------|------|--------|------|
| **热榜数据获取** | ¥0.88/次 | 内容运营、自媒体人 | 聚合微博、知乎、抖音、B站、小红书等 35+ 平台实时热榜，帮你快速发现热点选题 |
| **公众号文章发布** | ¥1.00/次 | 公众号运营者 | 将 Markdown 格式的文章一键发布到微信公众号草稿箱，省去找素材、排版、上传的繁琐流程 |
| **文章全自动化** | ¥1.88/次 | 懒人福音、批量产出 | 热榜自动选热门选题 → AI 自动撰写文章 → 自动发布到公众号，全程无需人工干预 |

---

## 📁 目录结构

```
clawtip-services/
├── SKILL.md              # 技能定义文件（AI Agent 的核心指令）
├── README.md             # 本文档
├── scripts/
│   ├── create_order.py   # 创建订单脚本
│   └── service.py        # 服务履约脚本
└── shared/
    └── file_utils.py     # 订单文件读写工具
```

---

## 🚀 快速开始

### 安装

在 OpenClaw 中安装此技能后，AI Agent 即可调用。

### 使用示例

**获取热榜数据：**
```bash
python3 scripts/create_order.py "微博,知乎,B站" --slug hot-ranks
# → ORDER_NO=20260411193000123456
# → AMOUNT=88
# → 完成支付后...
python3 scripts/service.py "微博,知乎,B站" "20260411193000123456" "<payCredential>" --slug hot-ranks
```

**发布文章到公众号：**
```bash
python3 scripts/create_order.py "将 article.md 发布到公众号" --slug publish
# → 完成支付后...
python3 scripts/service.py "发布文章" "<order_no>" "<payCredential>" --slug publish
```

**全自动化流程：**
```bash
python3 scripts/create_order.py "从微博热榜选一个科技话题，写一篇公众号文章并发布" --slug full-auto
# → 完成支付后...
python3 scripts/service.py "全自动化" "<order_no>" "<payCredential>" --slug full-auto
```

---

## 💳 付费说明

本服务采用 **按次计费**，使用一次扣一次费用：

| 服务 | 费用 |
|------|------|
| 热榜数据获取 | ¥0.88 |
| 公众号文章发布 | ¥1.00 |
| 文章全自动化 | ¥1.88 |

支付通过 ClawTip A2A 协议完成，支持钱包内小额零钱无感支付。

---

## 🔧 技术架构

```
┌─────────────┐     创建订单     ┌──────────────────┐
│   AI Agent  │ ──────────────→ │  ClawTip 后端     │
│  (此 Skill)  │                │  (43.136.97.223)  │
│             │ ←────────────── │                   │
│             │   订单信息       │  Flask + SM4 加密  │
└──────┬──────┘                └──────────────────┘
       │
       │ 用户支付
       ▼
┌─────────────┐     支付凭证     ┌──────────────────┐
│  ClawTip    │ ←────────────── │   AI Agent        │
│  微支付      │                 │   (service.py)    │
└──────┬──────┘                 └────────┬─────────┘
       │                                 │
       │ 支付确认                         │ 携带凭证请求结果
       ▼                                 ▼
┌─────────────┐                ┌──────────────────┐
│  服务结果    │ ←──────────────│  ClawTip 后端     │
│  返回给用户  │                │  履约 + 返回数据   │
└─────────────┘                └──────────────────┘
```

- **通信协议**：HTTPS + SM4 国密加密
- **后端框架**：Flask + Nginx 反代
- **加密算法**：SM4（国密标准）
- **部署地址**：`http://43.136.97.223/clawtip-api/`

---

## 📋 API 参考

### POST `/clawtip-api/api/createOrder`

创建订单接口

**请求体：**
```json
{
  "question": "用户需求描述",
  "slug": "clawtip-hot-ranks"
}
```

**响应：**
```json
{
  "responseCode": "200",
  "orderNo": "20260411193000123456",
  "amount": "88",
  "payTo": "...",
  "encryptedData": "..."
}
```

### POST `/clawtip-api/api/getServiceResult`

获取服务结果（履约）

**请求体：**
```json
{
  "question": "用户需求描述",
  "orderNo": "订单号",
  "credential": "支付凭证"
}
```

**响应：**
```json
{
  "responseCode": "200",
  "payStatus": "SUCCESS",
  "answer": "服务结果数据",
  "alreadyFulfilled": false
}
```

---

## 🛡️ 安全与隐私

- **国密加密**：所有交易数据使用 SM4 国密算法加密传输
- **幂等保护**：同一订单不会重复履约
- **小额支付**：仅支持钱包内预设小额零钱，不关联银行卡或主账户
- **交易存证**：所有交互行为生成可信快照存证

---

## ❓ 常见问题

**Q：什么是 A2A？**  
A：A2A（Agent-to-Agent）是指 AI 智能体之间的自主交互和交易。ClawTip 让 AI Agent 能够自主完成询价、决策、支付全流程，无需人类介入。

**Q：支付安全吗？**  
A：安全。ClawTip 使用钱包内预设小额零钱，不关联银行卡。所有交易数据 SM4 加密，行为快照存证。

**Q：可以开发票吗？**  
A：目前暂不支持发票，如需开票请联系开发者。

**Q：服务不支持怎么办？**  
A：请检查网络连接，确认后端服务 `http://43.136.97.223/clawtip-api/` 可访问。如仍有问题，联系开发者。

---

## 📞 联系与反馈

- **开发者**：LucianaiB
- **问题反馈**：通过 ClawHub 页面留言

---

## 📜 许可证

本项目基于 MIT-0 许可证发布，允许任何人免费使用、修改和重新分发。

**基于 ClawTip（中国首个纯正 A2A 微支付协议）研发。**  
ClawTip 由京东科技于 2026 年 3 月 31 日发布，详见 https://clawtip.jd.com


path: shared/file_utils.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
订单文件读写工具
路径: ~/.openclaw/skills/orders/{indicator}/{order_no}.json
"""

import json
import os
import platform


def get_orders_base_dir(indicator: str) -> str:
    """根据操作系统返回固定的订单存储目录"""
    home_dir = os.path.expanduser("~")
    if platform.system() == "Windows":
        return os.path.join(home_dir, "openclaw", "skills", "orders", indicator)
    else:
        return os.path.join(home_dir, ".openclaw", "skills", "orders", indicator)


def load_order(indicator: str, order_no: str) -> dict:
    """根据 indicator 和 order_no 从固定目录读取订单 JSON 文件"""
    base_dir = get_orders_base_dir(indicator)
    json_path = os.path.join(base_dir, f"{order_no}.json")
    if not os.path.isfile(json_path):
        raise RuntimeError(f"订单文件不存在: {json_path}")
    with open(json_path, "r", encoding="utf-8") as f:
        return json.load(f)


def save_order(indicator: str, order_no: str, order_data: dict) -> str:
    """将订单数据写入固定目录，返回文件完整路径"""
    base_dir = get_orders_base_dir(indicator)
    os.makedirs(base_dir, exist_ok=True)

    json_path = os.path.join(base_dir, f"{order_no}.json")
    with open(json_path, "w", encoding="utf-8") as f:
        json.dump(order_data, f, ensure_ascii=False, indent=2)

    return json_path


path: scripts/create_order.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
基于 ClawTip 研发的 A2A 文章服务平台 - 创建订单

支持三种服务：
  - hot-ranks   热榜数据获取    ¥0.88/次
  - publish     公众号文章发布   ¥1.00/次
  - full-auto   文章全自动化     ¥1.88/次

用法:
  python3 create_order.py "微博,知乎,B站" --slug hot-ranks
"""

import sys
import os
import json
import hashlib
import argparse
import urllib.request
import urllib.error

sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'shared'))
from file_utils import save_order

API_BASE = "http://43.136.97.223/clawtip-api/api/createOrder"

SERVICES = {
    "hot-ranks": {
        "slug": "clawtip-hot-ranks",
        "desc": "热榜数据获取",
        "price": "0.88",
    },
    "publish": {
        "slug": "clawtip-publish",
        "desc": "微信公众号文章发布",
        "price": "1.00",
    },
    "full-auto": {
        "slug": "clawtip-full-auto",
        "desc": "文章全自动化（热榜+发布）",
        "price": "1.88",
    },
}


def _md5(text: str) -> str:
    return hashlib.md5(text.encode("utf-8")).hexdigest()


def create_order(question: str, slug: str) -> tuple:
    """
    调用后端创建订单接口，保存订单到本地并返回订单信息。

    Args:
        question: 用户的需求描述
        slug: 服务类型（hot-ranks / publish / full-auto）

    Returns:
        (order_no, amount, question, indicator) 元组

    Raises:
        RuntimeError: 网络请求失败或后端返回错误
    """
    full_slug = SERVICES[slug]["slug"]

    payload = json.dumps({
        "question": question,
        "slug": full_slug,
    }, ensure_ascii=False)

    req = urllib.request.Request(
        API_BASE,
        data=payload.encode("utf-8"),
        headers={"Content-Type": "application/json"},
        method="POST",
    )

    try:
        with urllib.request.urlopen(req, timeout=15) as resp:
            data = json.loads(resp.read().decode("utf-8"))
    except Exception as e:
        raise RuntimeError(f"请求创建订单失败: {e}")

    if data.get("responseCode") != "200":
        raise RuntimeError(f"创建订单失败: {data}")

    order_no = data["orderNo"]
    amount = data["amount"]
    indicator = _md5(full_slug)

    save_order(indicator, order_no, {
        "orderNo": order_no,
        "amount": amount,
        "question": question,
        "slug": full_slug,
        "payTo": data["payTo"],
        "encryptedData": data["encryptedData"],
        "indicator": indicator,
    })

    return order_no, amount, question, indicator


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="A2A 文章服务平台 - 创建订单",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="示例:\n"
               "  python3 create_order.py \"微博,知乎\" --slug hot-ranks\n"
               "  python3 create_order.py \"发布文章\" --slug publish\n"
               "  python3 create_order.py \"热榜+发布\" --slug full-auto",
    )
    parser.add_argument("question", help="用户的需求描述")
    parser.add_argument("--slug", "-s", choices=SERVICES.keys(), default="hot-ranks",
                        help="服务类型: hot-ranks / publish / full-auto（默认: hot-ranks）")
    args = parser.parse_args()

    svc = SERVICES[args.slug]
    print(f"📋 服务: {svc['desc']} (¥{svc['price']})")

    order_no, amount, question_out, indicator = create_order(args.question, args.slug)

    print(f"ORDER_NO={order_no}")
    print(f"AMOUNT={amount}")
    print(f"QUESTION={question_out}")
    print(f"INDICATOR={indicator}")


path: scripts/service.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
基于 ClawTip 研发的 A2A 文章服务平台 - 服务履约

携带支付凭证调用后端获取服务结果。

用法:
  python3 service.py "<问题>" "<订单号>" "<支付凭证>" --slug hot-ranks
"""

import sys
import os
import json
import hashlib
import argparse
import urllib.request
import urllib.error

sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'shared'))
from file_utils import load_order

API_BASE = "http://43.136.97.223/clawtip-api/api/getServiceResult"

SERVICES = {
    "hot-ranks": {
        "slug": "clawtip-hot-ranks",
        "desc": "热榜数据获取",
    },
    "publish": {
        "slug": "clawtip-publish",
        "desc": "微信公众号文章发布",
    },
    "full-auto": {
        "slug": "clawtip-full-auto",
        "desc": "文章全自动化（热榜+发布）",
    },
}


def _md5(text: str) -> str:
    return hashlib.md5(text.encode("utf-8")).hexdigest()


def get_service_result(question: str, order_no: str, credential: str, slug: str) -> str:
    """
    携带支付凭证调用后端获取服务结果。

    Args:
        question: 用户的需求描述
        order_no: 订单号
        credential: 支付凭证（payCredential）
        slug: 服务类型（hot-ranks / publish / full-auto）

    Returns:
        服务结果字符串（JSON 格式）

    Raises:
        RuntimeError: 网络请求失败
    """
    full_slug = SERVICES[slug]["slug"]
    indicator = _md5(full_slug)

    # 从本地订单文件加载，验证订单存在性
    order = load_order(indicator, order_no)

    print(f"正在执行 {SERVICES[slug]['desc']}: {question}")

    if credential is None:
        return "请输入你的服务凭证"

    payload = json.dumps({
        "question": question,
        "orderNo": order_no,
        "credential": credential,
    }, ensure_ascii=False)

    req = urllib.request.Request(
        API_BASE,
        data=payload.encode("utf-8"),
        headers={"Content-Type": "application/json"},
        method="POST",
    )

    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            data = json.loads(resp.read().decode("utf-8"))
    except Exception as e:
        raise RuntimeError(f"请求服务结果失败: {e}")

    if data.get("responseCode") != "200":
        return f"获取服务结果失败: {data}"

    pay_status = data.get("payStatus")
    if pay_status != "SUCCESS":
        error_info = data.get("errorInfo", "支付未成功")
        return f"支付未成功: {error_info}"

    answer = data.get("answer", "")
    already_fulfilled = data.get("alreadyFulfilled", False)

    if already_fulfilled:
        print("该订单已履约过")

    return answer


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="A2A 文章服务平台 - 服务履约",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="示例:\n"
               "  python3 service.py \"微博,知乎\" <order_no> <credential> --slug hot-ranks",
    )
    parser.add_argument("question", help="用户的需求描述")
    parser.add_argument("order_no", help="订单号（从 create_order.py 输出获取）")
    parser.add_argument("credential", help="支付凭证（payCredential）")
    parser.add_argument("--slug", "-s", choices=SERVICES.keys(), default="hot-ranks",
                        help="服务类型: hot-ranks / publish / full-auto（默认: hot-ranks）")
    args = parser.parse_args()

    result = get_service_result(args.question, args.order_no, args.credential, args.slug)
    print(result)
    print("PAY_STATUS: SUCCESS")


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