{"id":"ae28810f-e343-482c-b3b7-2ab9afc7e4f4","entityType":"agent","slug":"clawhub-alichor-openclaw-weixin","name":"OpenClaw Weixin Channel","canonicalUrl":"https://www.xpersona.co/agent/clawhub-alichor-openclaw-weixin","canonicalPath":"/agent/clawhub-alichor-openclaw-weixin","generatedAt":"2026-10-09T22:11:05.795Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T06:18:42.255Z","emptyReason":null},"description":"OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。 Skill: OpenClaw Weixin Channel Owner: alichor Summary: OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。 Tags: latest:2.0.1 Version history: v2.0.1 | 2026-03-26T04:49:11.302Z | user Initial release: Weixin channel plugin with QR login and message support Archive index: Archive v2.0.1: 45 files, 145143 bytes Files: CHANGELOG.md (130b), CHANGELOG.zh_CN.md (90b), index.ts (1273b), openclaw.plugin.json (190b","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 4K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17frgzvbpkmy8e37y88qtv3a983m2ys:openclaw-weixin","sourceUrl":"https://clawhub.ai/alichor/openclaw-weixin","homepage":"https://clawhub.ai/alichor/skills/openclaw-weixin","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/alichor/openclaw-weixin","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/alichor/skills/openclaw-weixin","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。 Skill: OpenClaw Weixin Channel Owner: alichor Summary: OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:18:42.255Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:18:42.255Z","emptyReason":null},"stars":null,"forks":null,"downloads":3953,"packageName":null,"latestVersion":"2.0.1","tractionLabel":"4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:18:42.254Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T06:18:42.255Z","lastCrawledAt":"2026-10-09T06:18:42.254Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T06:18:42.254Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.1","createdAt":"2026-03-26T04:49:11.302Z","changelog":"Initial release: Weixin channel plugin with QR login and message support","fileCount":45,"zipByteSize":145143}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17frgzvbpkmy8e37y88qtv3a983m2ys:openclaw-weixin","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T22:11:05.794Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alichor-openclaw-weixin/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T06:18:42.255Z","emptyReason":null},"readme":"Skill: OpenClaw Weixin Channel\n\nOwner: alichor\n\nSummary: OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。\n\nTags: latest:2.0.1\n\nVersion history:\n\nv2.0.1 | 2026-03-26T04:49:11.302Z | user\n\nInitial release: Weixin channel plugin with QR login and message support\n\nArchive index:\n\nArchive v2.0.1: 45 files, 145143 bytes\n\nFiles: CHANGELOG.md (130b), CHANGELOG.zh_CN.md (90b), index.ts (1273b), openclaw.plugin.json (190b), package-lock.json (336283b), package.json (1384b), README.md (8821b), README.zh_CN.md (8150b), skill-card.md (2127b), SKILL.md (1056b), src/api/api.ts (7686b), src/api/config-cache.ts (2496b), src/api/session-guard.ts (1885b), src/api/types.ts (5467b), src/auth/accounts.ts (13400b), src/auth/login-qr.ts (11367b), src/auth/pairing.ts (4142b), src/cdn/aes-ecb.ts (877b), src/cdn/cdn-upload.ts (2980b), src/cdn/cdn-url.ts (663b), src/cdn/pic-decrypt.ts (3057b), src/cdn/upload.ts (5038b), src/channel.ts (17450b), src/compat.ts (2610b), src/config/config-schema.ts (920b), src/log-upload.ts (5385b), src/media/media-download.ts (5482b), src/media/mime.ts (2541b), src/media/silk-transcode.ts (2256b), src/messaging/debug-mode.ts (1985b), src/messaging/error-notice.ts (1045b), src/messaging/inbound.ts (9480b), src/messaging/process-message.ts (17993b), src/messaging/send-media.ts (2729b), src/messaging/send.ts (8268b), src/messaging/slash-commands.ts (3250b), src/monitor/monitor.ts (8271b), src/runtime.ts (2181b), src/storage/state-dir.ts (331b), src/storage/sync-buf.ts (2692b), src/util/logger.ts (4328b), src/util/random.ts (562b), src/util/redact.ts (1894b), src/vendor.d.ts (722b), _meta.json (134b)\n\nFile v2.0.1:SKILL.md\n\n---\nname: openclaw-weixin\ndescription: OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。\nmetadata:\n  {\n    \"openclaw\": {\n      \"requires\": { \"bins\": [\"openclaw\"] },\n      \"install\": [\n        {\n          \"id\": \"node\",\n          \"kind\": \"node\",\n          \"package\": \"@tencent-weixin/openclaw-weixin\",\n          \"label\": \"Install Weixin Channel Plugin (npm)\"\n        }\n      ]\n    }\n  }\n---\n\n# OpenClaw Weixin Channel\n\n微信 channel 插件，支持扫码登录 + 消息收发。\n\n## 安装\n\n```bash\nnpm install -g @tencent-weixin/openclaw-weixin\n```\n\n## 配置\n\n```bash\nopenclaw plugins install \"@tencent-weixin/openclaw-weixin\"\nopenclaw config set plugins.entries.openclaw-weixin.enabled true\n```\n\n## 扫码登录\n\n```bash\nopenclaw channels login --channel openclaw-weixin\n```\n\n## 兼容性\n\n| 插件版本 | OpenClaw 版本 |\n|---------|--------------|\n| 2.0.x   | >=2026.3.22  |\n| 1.0.x   | >=2026.1.0  |\n\n## 来源\n\n腾讯微信团队出品 · MIT License\n\nFile v2.0.1:README.md\n\n# WeChat\n\n[简体中文](./README.zh_CN.md)\n\nOpenClaw's WeChat channel plugin, supporting login authorization via QR code scanning.\n\n## Compatibility\n\n| Plugin Version | OpenClaw Version       | npm dist-tag | Status      |\n|---------------|------------------------|--------------|-------------|\n| 2.0.x         | >=2026.3.22            | `latest`     | Active      |\n| 1.0.x         | >=2026.1.0 <2026.3.22  | `legacy`     | Maintenance |\n\n> The plugin checks the host version at startup and will refuse to load if the\n> running OpenClaw version is outside the supported range.\n\n## Prerequisites\n\n[OpenClaw](https://docs.openclaw.ai/install) must be installed (the `openclaw` CLI needs to be available).\n\nCheck your version: `openclaw --version`\n\n## Quick Install\n\n```bash\nnpx -y @tencent-weixin/openclaw-weixin-cli install\n```\n\n## Manual Installation\n\nIf the quick install doesn't work, follow these steps manually:\n\n### 1. Install the plugin\n\n```bash\nopenclaw plugins install \"@tencent-weixin/openclaw-weixin\"\n```\n\n### 2. Enable the plugin\n\n```bash\nopenclaw config set plugins.entries.openclaw-weixin.enabled true\n```\n\n### 3. QR code login\n\n```bash\nopenclaw channels login --channel openclaw-weixin\n```\n\nA QR code will appear in the terminal. Scan it with your phone and confirm the authorization. Once confirmed, the login credentials will be saved locally automatically — no further action is needed.\n\n### 4. Restart the gateway\n\n```bash\nopenclaw gateway restart\n```\n\n## Adding More WeChat Accounts\n\n```bash\nopenclaw channels login --channel openclaw-weixin\n```\n\nEach QR code login creates a new account entry, supporting multiple WeChat accounts online simultaneously.\n\n## Multi-Account Context Isolation\n\nBy default, all channels share the same AI conversation context. To isolate conversation context for each WeChat account:\n\n```bash\nopenclaw config set agents.mode per-channel-per-peer\n```\n\nThis gives each \"WeChat account + message sender\" combination its own independent AI memory, preventing context cross-talk between accounts.\n\n## Backend API Protocol\n\nThis plugin communicates with the backend gateway via HTTP JSON API. Developers integrating with their own backend need to implement the following interfaces.\n\nAll endpoints use `POST` with JSON request and response bodies. Common request headers:\n\n| Header | Description |\n|--------|-------------|\n| `Content-Type` | `application/json` |\n| `AuthorizationType` | Fixed value `ilink_bot_token` |\n| `Authorization` | `Bearer <token>` (obtained after login) |\n| `X-WECHAT-UIN` | Base64-encoded random uint32 |\n\n### Endpoint List\n\n| Endpoint | Path | Description |\n|----------|------|-------------|\n| getUpdates | `getupdates` | Long-poll for new messages |\n| sendMessage | `sendmessage` | Send a message (text/image/video/file) |\n| getUploadUrl | `getuploadurl` | Get CDN upload pre-signed URL |\n| getConfig | `getconfig` | Get account config (typing ticket, etc.) |\n| sendTyping | `sendtyping` | Send/cancel typing status indicator |\n\n### getUpdates\n\nLong-polling endpoint. The server responds when new messages arrive or on timeout.\n\n**Request body:**\n\n```json\n{\n  \"get_updates_buf\": \"\"\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `get_updates_buf` | `string` | Sync cursor from the previous response; empty string for the first request |\n\n**Response body:**\n\n```json\n{\n  \"ret\": 0,\n  \"msgs\": [...],\n  \"get_updates_buf\": \"<new cursor>\",\n  \"longpolling_timeout_ms\": 35000\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `ret` | `number` | Return code, `0` = success |\n| `errcode` | `number?` | Error code (e.g., `-14` = session timeout) |\n| `errmsg` | `string?` | Error description |\n| `msgs` | `WeixinMessage[]` | Message list (structure below) |\n| `get_updates_buf` | `string` | New sync cursor to pass in the next request |\n| `longpolling_timeout_ms` | `number?` | Server-suggested long-poll timeout for the next request (ms) |\n\n### sendMessage\n\nSend a message to a user.\n\n**Request body:**\n\n```json\n{\n  \"msg\": {\n    \"to_user_id\": \"<target user ID>\",\n    \"context_token\": \"<conversation context token>\",\n    \"item_list\": [\n      {\n        \"type\": 1,\n        \"text_item\": { \"text\": \"Hello\" }\n      }\n    ]\n  }\n}\n```\n\n### getUploadUrl\n\nGet CDN upload pre-signed parameters. Call this endpoint before uploading a file to obtain `upload_param` and `thumb_upload_param`.\n\n**Request body:**\n\n```json\n{\n  \"filekey\": \"<file identifier>\",\n  \"media_type\": 1,\n  \"to_user_id\": \"<target user ID>\",\n  \"rawsize\": 12345,\n  \"rawfilemd5\": \"<plaintext MD5>\",\n  \"filesize\": 12352,\n  \"thumb_rawsize\": 1024,\n  \"thumb_rawfilemd5\": \"<thumbnail plaintext MD5>\",\n  \"thumb_filesize\": 1040\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `media_type` | `number` | `1` = IMAGE, `2` = VIDEO, `3` = FILE |\n| `rawsize` | `number` | Original file plaintext size |\n| `rawfilemd5` | `string` | Original file plaintext MD5 |\n| `filesize` | `number` | Ciphertext size after AES-128-ECB encryption |\n| `thumb_rawsize` | `number?` | Thumbnail plaintext size (required for IMAGE/VIDEO) |\n| `thumb_rawfilemd5` | `string?` | Thumbnail plaintext MD5 (required for IMAGE/VIDEO) |\n| `thumb_filesize` | `number?` | Thumbnail ciphertext size (required for IMAGE/VIDEO) |\n\n**Response body:**\n\n```json\n{\n  \"upload_param\": \"<original image upload encrypted parameters>\",\n  \"thumb_upload_param\": \"<thumbnail upload encrypted parameters>\"\n}\n```\n\n### getConfig\n\nGet account configuration, including the typing ticket.\n\n**Request body:**\n\n```json\n{\n  \"ilink_user_id\": \"<user ID>\",\n  \"context_token\": \"<optional, conversation context token>\"\n}\n```\n\n**Response body:**\n\n```json\n{\n  \"ret\": 0,\n  \"typing_ticket\": \"<base64-encoded typing ticket>\"\n}\n```\n\n### sendTyping\n\nSend or cancel the typing status indicator.\n\n**Request body:**\n\n```json\n{\n  \"ilink_user_id\": \"<user ID>\",\n  \"typing_ticket\": \"<obtained from getConfig>\",\n  \"status\": 1\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `status` | `number` | `1` = typing, `2` = cancel typing |\n\n### Message Structure\n\n#### WeixinMessage\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `seq` | `number?` | Message sequence number |\n| `message_id` | `number?` | Unique message ID |\n| `from_user_id` | `string?` | Sender ID |\n| `to_user_id` | `string?` | Receiver ID |\n| `create_time_ms` | `number?` | Creation timestamp (ms) |\n| `session_id` | `string?` | Session ID |\n| `message_type` | `number?` | `1` = USER, `2` = BOT |\n| `message_state` | `number?` | `0` = NEW, `1` = GENERATING, `2` = FINISH |\n| `item_list` | `MessageItem[]?` | Message content list |\n| `context_token` | `string?` | Conversation context token, must be passed back when replying |\n\n#### MessageItem\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `type` | `number` | `1` TEXT, `2` IMAGE, `3` VOICE, `4` FILE, `5` VIDEO |\n| `text_item` | `{ text: string }?` | Text content |\n| `image_item` | `ImageItem?` | Image (with CDN reference and AES key) |\n| `voice_item` | `VoiceItem?` | Voice (SILK encoded) |\n| `file_item` | `FileItem?` | File attachment |\n| `video_item` | `VideoItem?` | Video |\n| `ref_msg` | `RefMessage?` | Referenced message |\n\n#### CDN Media Reference (CDNMedia)\n\nAll media types (image/voice/file/video) are transferred via CDN using AES-128-ECB encryption:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `encrypt_query_param` | `string?` | Encrypted parameters for CDN download/upload |\n| `aes_key` | `string?` | Base64-encoded AES-128 key |\n\n### CDN Upload Flow\n\n1. Calculate the file's plaintext size, MD5, and ciphertext size after AES-128-ECB encryption\n2. If a thumbnail is needed (image/video), calculate the thumbnail's plaintext and ciphertext parameters as well\n3. Call `getUploadUrl` to get `upload_param` (and `thumb_upload_param`)\n4. Encrypt the file content with AES-128-ECB and PUT upload to the CDN URL\n5. Encrypt and upload the thumbnail in the same way\n6. Use the returned `encrypt_query_param` to construct a `CDNMedia` reference, include it in the `MessageItem`, and send\n\n> For complete type definitions, see [`src/api/types.ts`](src/api/types.ts). For API call implementations, see [`src/api/api.ts`](src/api/api.ts).\n\n## Uninstall\n\n```bash\nopenclaw openclaw-weixin uninstall\n```\n\n## Troubleshooting\n\n### \"requires OpenClaw >=2026.3.22\" error\n\nYour OpenClaw version is too old for this plugin version. Check with:\n\n```bash\nopenclaw --version\n```\n\nInstall the legacy plugin line instead:\n\n```bash\nopenclaw plugins install @tencent-weixin/openclaw-weixin@legacy\n```\n\n### Channel shows \"OK\" but doesn't connect\n\nEnsure `plugins.entries.openclaw-weixin.enabled` is `true` in `~/.openclaw/openclaw.json`:\n\n```bash\nopenclaw config set plugins.entries.openclaw-weixin.enabled true\nopenclaw gateway restart\n```\n\nFile v2.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7727exgbsr4gdpc0zd5q141183mhg1\",\n  \"slug\": \"openclaw-weixin\",\n  \"version\": \"2.0.1\",\n  \"publishedAt\": 1774500551302\n}\n\nFile v2.0.1:CHANGELOG.md\n\n# Changelog\n\n[简体中文](CHANGELOG.zh_CN.md)\n\nThis project follows the [Keep a Changelog](https://keepachangelog.com/) format.\n\nFile v2.0.1:CHANGELOG.zh_CN.md\n\n# 变更日志\n\n本项目遵循 [Keep a Changelog](https://keepachangelog.com/) 格式。\n\nFile v2.0.1:README.zh_CN.md\n\n# 微信\n\n[English](./README.md)\n\nOpenClaw 的微信渠道插件，支持通过扫码完成登录授权。\n\n## 兼容性\n\n| 插件版本 | OpenClaw 版本            | npm dist-tag | 状态   |\n|---------|--------------------------|--------------|--------|\n| 2.0.x   | >=2026.3.22              | `latest`     | 活跃   |\n| 1.0.x   | >=2026.1.0 <2026.3.22    | `legacy`     | 维护中 |\n\n> 插件在启动时会检查宿主版本，如果运行的 OpenClaw 版本超出支持范围，插件将拒绝加载。\n\n## 前提条件\n\n已安装 [OpenClaw](https://docs.openclaw.ai/install)（需要 `openclaw` CLI 可用）。\n\n查看版本：`openclaw --version`\n\n## 一键安装\n\n```bash\nnpx -y @tencent-weixin/openclaw-weixin-cli install\n```\n\n## 手动安装\n\n如果一键安装不适用，可以按以下步骤手动操作：\n\n### 1. 安装插件\n\n```bash\nopenclaw plugins install \"@tencent-weixin/openclaw-weixin\"\n```\n\n### 2. 启用插件\n\n```bash\nopenclaw config set plugins.entries.openclaw-weixin.enabled true\n```\n\n### 3. 扫码登录\n\n```bash\nopenclaw channels login --channel openclaw-weixin\n```\n\n终端会显示一个二维码，用手机扫码并在手机上确认授权。确认后，登录凭证会自动保存到本地，无需额外操作。\n\n### 4. 重启 gateway\n\n```bash\nopenclaw gateway restart\n```\n\n## 添加更多微信账号\n\n```bash\nopenclaw channels login --channel openclaw-weixin\n```\n\n每次扫码登录都会创建一个新的账号条目，支持多个微信号同时在线。\n\n## 多账号上下文隔离\n\n默认情况下，所有渠道的 AI 会话共享同一个上下文。如果希望每个微信账号的对话上下文相互隔离：\n\n```bash\nopenclaw config set agents.mode per-channel-per-peer\n```\n\n这样每个「微信账号 + 发消息用户」组合都会拥有独立的 AI 记忆，账号之间不会串台。\n\n## 后端 API 协议\n\n本插件通过 HTTP JSON API 与后端网关通信。二次开发者若需对接自有后端，需实现以下接口。\n\n所有接口均为 `POST`，请求和响应均为 JSON。通用请求头：\n\n| Header | 说明 |\n|--------|------|\n| `Content-Type` | `application/json` |\n| `AuthorizationType` | 固定值 `ilink_bot_token` |\n| `Authorization` | `Bearer <token>`（登录后获取） |\n| `X-WECHAT-UIN` | 随机 uint32 的 base64 编码 |\n\n### 接口列表\n\n| 接口 | 路径 | 说明 |\n|------|------|------|\n| getUpdates | `getupdates` | 长轮询获取新消息 |\n| sendMessage | `sendmessage` | 发送消息（文本/图片/视频/文件） |\n| getUploadUrl | `getuploadurl` | 获取 CDN 上传预签名 URL |\n| getConfig | `getconfig` | 获取账号配置（typing ticket 等） |\n| sendTyping | `sendtyping` | 发送/取消输入状态指示 |\n\n### getUpdates\n\n长轮询接口。服务端在有新消息或超时后返回。\n\n**请求体：**\n\n```json\n{\n  \"get_updates_buf\": \"\"\n}\n```\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `get_updates_buf` | `string` | 上次响应返回的同步游标，首次请求传空字符串 |\n\n**响应体：**\n\n```json\n{\n  \"ret\": 0,\n  \"msgs\": [...],\n  \"get_updates_buf\": \"<新游标>\",\n  \"longpolling_timeout_ms\": 35000\n}\n```\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `ret` | `number` | 返回码，`0` = 成功 |\n| `errcode` | `number?` | 错误码（如 `-14` = 会话超时） |\n| `errmsg` | `string?` | 错误描述 |\n| `msgs` | `WeixinMessage[]` | 消息列表（结构见下方） |\n| `get_updates_buf` | `string` | 新的同步游标，下次请求时回传 |\n| `longpolling_timeout_ms` | `number?` | 服务端建议的下次长轮询超时（ms） |\n\n### sendMessage\n\n发送一条消息给用户。\n\n**请求体：**\n\n```json\n{\n  \"msg\": {\n    \"to_user_id\": \"<目标用户 ID>\",\n    \"context_token\": \"<会话上下文令牌>\",\n    \"item_list\": [\n      {\n        \"type\": 1,\n        \"text_item\": { \"text\": \"你好\" }\n      }\n    ]\n  }\n}\n```\n\n### getUploadUrl\n\n获取 CDN 上传预签名参数。上传文件前需先调用此接口获取 `upload_param` 和 `thumb_upload_param`。\n\n**请求体：**\n\n```json\n{\n  \"filekey\": \"<文件标识>\",\n  \"media_type\": 1,\n  \"to_user_id\": \"<目标用户 ID>\",\n  \"rawsize\": 12345,\n  \"rawfilemd5\": \"<明文 MD5>\",\n  \"filesize\": 12352,\n  \"thumb_rawsize\": 1024,\n  \"thumb_rawfilemd5\": \"<缩略图明文 MD5>\",\n  \"thumb_filesize\": 1040\n}\n```\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `media_type` | `number` | `1` = IMAGE, `2` = VIDEO, `3` = FILE |\n| `rawsize` | `number` | 原文件明文大小 |\n| `rawfilemd5` | `string` | 原文件明文 MD5 |\n| `filesize` | `number` | AES-128-ECB 加密后的密文大小 |\n| `thumb_rawsize` | `number?` | 缩略图明文大小（IMAGE/VIDEO 时必填） |\n| `thumb_rawfilemd5` | `string?` | 缩略图明文 MD5（IMAGE/VIDEO 时必填） |\n| `thumb_filesize` | `number?` | 缩略图密文大小（IMAGE/VIDEO 时必填） |\n\n**响应体：**\n\n```json\n{\n  \"upload_param\": \"<原图上传加密参数>\",\n  \"thumb_upload_param\": \"<缩略图上传加密参数>\"\n}\n```\n\n### getConfig\n\n获取账号配置，包括 typing ticket。\n\n**请求体：**\n\n```json\n{\n  \"ilink_user_id\": \"<用户 ID>\",\n  \"context_token\": \"<可选，会话上下文令牌>\"\n}\n```\n\n**响应体：**\n\n```json\n{\n  \"ret\": 0,\n  \"typing_ticket\": \"<base64 编码的 typing ticket>\"\n}\n```\n\n### sendTyping\n\n发送或取消输入状态指示。\n\n**请求体：**\n\n```json\n{\n  \"ilink_user_id\": \"<用户 ID>\",\n  \"typing_ticket\": \"<从 getConfig 获取>\",\n  \"status\": 1\n}\n```\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `status` | `number` | `1` = 正在输入，`2` = 取消输入 |\n\n### 消息结构\n\n#### WeixinMessage\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `seq` | `number?` | 消息序列号 |\n| `message_id` | `number?` | 消息唯一 ID |\n| `from_user_id` | `string?` | 发送者 ID |\n| `to_user_id` | `string?` | 接收者 ID |\n| `create_time_ms` | `number?` | 创建时间戳（ms） |\n| `session_id` | `string?` | 会话 ID |\n| `message_type` | `number?` | `1` = USER, `2` = BOT |\n| `message_state` | `number?` | `0` = NEW, `1` = GENERATING, `2` = FINISH |\n| `item_list` | `MessageItem[]?` | 消息内容列表 |\n| `context_token` | `string?` | 会话上下文令牌，回复时需回传 |\n\n#### MessageItem\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `type` | `number` | `1` TEXT, `2` IMAGE, `3` VOICE, `4` FILE, `5` VIDEO |\n| `text_item` | `{ text: string }?` | 文本内容 |\n| `image_item` | `ImageItem?` | 图片（含 CDN 引用和 AES 密钥） |\n| `voice_item` | `VoiceItem?` | 语音（SILK 编码） |\n| `file_item` | `FileItem?` | 文件附件 |\n| `video_item` | `VideoItem?` | 视频 |\n| `ref_msg` | `RefMessage?` | 引用消息 |\n\n#### CDN 媒体引用 (CDNMedia)\n\n所有媒体类型（图片/语音/文件/视频）通过 CDN 传输，使用 AES-128-ECB 加密：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `encrypt_query_param` | `string?` | CDN 下载/上传的加密参数 |\n| `aes_key` | `string?` | base64 编码的 AES-128 密钥 |\n\n### CDN 上传流程\n\n1. 计算文件明文大小、MD5，以及 AES-128-ECB 加密后的密文大小\n2. 如需缩略图（图片/视频），同样计算缩略图的明文和密文参数\n3. 调用 `getUploadUrl` 获取 `upload_param`（和 `thumb_upload_param`）\n4. 使用 AES-128-ECB 加密文件内容，PUT 上传到 CDN URL\n5. 缩略图同理加密并上传\n6. 使用返回的 `encrypt_query_param` 构造 `CDNMedia` 引用，放入 `MessageItem` 发送\n\n> 完整的类型定义见 [`src/api/types.ts`](src/api/types.ts)，API 调用实现见 [`src/api/api.ts`](src/api/api.ts)。\n\n## 卸载\n\n```bash\nopenclaw openclaw-weixin uninstall\n```\n\n## 故障排查\n\n### \"requires OpenClaw >=2026.3.22\" 报错\n\n你的 OpenClaw 版本太旧，不兼容当前插件版本。检查版本：\n\n```bash\nopenclaw --version\n```\n\n安装旧版插件线：\n\n```bash\nopenclaw plugins install @tencent-weixin/openclaw-weixin@legacy\n```\n\n### Channel 显示 \"OK\" 但未连接\n\n确保 `~/.openclaw/openclaw.json` 中 `plugins.entries.openclaw-weixin.enabled` 为 `true`：\n\n```bash\nopenclaw config set plugins.entries.openclaw-weixin.enabled true\nopenclaw gateway restart\n```\n\nFile v2.0.1:skill-card.md\n\n## Description:\n\nOpenClaw Weixin Channel connects OpenClaw agents to WeChat through QR-code login, inbound message polling, and outbound text, image, video, voice, and file replies.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[alichor](https://clawhub.ai/user/alichor)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers and OpenClaw operators use this skill to let an agent receive WeChat messages and respond with text, rich media, and files after a QR-code account authorization flow.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: File upload, URL download, log upload, and token logging behavior could expose local files, logs, credentials, or context tokens.\n\nMitigation: Review the plugin before installation, run it in an isolated OpenClaw environment, avoid debug logging during login, and treat stored Weixin credentials and context-token files as secrets.\n\nRisk: The log-upload command can send local log files to a remote endpoint.\n\nMitigation: Use the log-upload command only with a trusted HTTPS endpoint and confirm the target URL before running it.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/alichor/skills/openclaw-weixin)\n- [OpenClaw install documentation](https://docs.openclaw.ai/install)\n- [README.md](artifact/README.md)\n- [API type definitions](artifact/src/api/types.ts)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Files, Shell commands, Configuration]\n\n**Output Format:** [WeChat channel messages, media attachments, file transfers, and Markdown setup guidance with shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires the OpenClaw CLI and QR-code WeChat login; plugin line 2.0.x supports OpenClaw >=2026.3.22.]\n\n## Skill Version(s):\n\n2.0.1 (source: server release metadata and package.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.0.1:openclaw.plugin.json\n\n{\n  \"id\": \"openclaw-weixin\",\n  \"version\": \"2.0.0\",\n  \"channels\": [\"openclaw-weixin\"],\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {}\n  }\n}\n\nFile v2.0.1:package.json\n\n{\n  \"name\": \"@tencent-weixin/openclaw-weixin\",\n  \"version\": \"2.0.1\",\n  \"description\": \"OpenClaw Weixin channel\",\n  \"license\": \"MIT\",\n  \"author\": \"Tencent\",\n  \"type\": \"module\",\n  \"files\": [\n    \"src/\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/node_modules/\",\n    \"index.ts\",\n    \"openclaw.plugin.json\",\n    \"README.md\",\n    \"README.zh_CN.md\",\n    \"CHANGELOG.md\",\n    \"CHANGELOG.zh_CN.md\"\n  ],\n  \"scripts\": {\n    \"test\": \"vitest run --coverage\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"build\": \"tsc\",\n    \"prepublishOnly\": \"npm run typecheck && npm run build\"\n  },\n  \"engines\": {\n    \"node\": \">=22\"\n  },\n  \"dependencies\": {\n    \"qrcode-terminal\": \"0.12.0\",\n    \"zod\": \"4.3.6\"\n  },\n  \"peerDependencies\": {\n    \"openclaw\": \">=2026.3.22\"\n  },\n  \"devDependencies\": {\n    \"@vitest/coverage-v8\": \"^3.1.0\",\n    \"openclaw\": \"2026.3.23\",\n    \"silk-wasm\": \"^3.7.1\",\n    \"typescript\": \"^5.8.0\",\n    \"vitest\": \"^3.1.0\"\n  },\n  \"openclaw\": {\n    \"extensions\": [\n      \"./index.ts\"\n    ],\n    \"channel\": {\n      \"id\": \"openclaw-weixin\",\n      \"label\": \"openclaw-weixin\",\n      \"selectionLabel\": \"openclaw-weixin\",\n      \"docsPath\": \"/channels/openclaw-weixin\",\n      \"docsLabel\": \"openclaw-weixin\",\n      \"blurb\": \"Weixin channel\",\n      \"order\": 75\n    },\n    \"install\": {\n      \"npmSpec\": \"@tencent-weixin/openclaw-weixin\",\n      \"defaultChoice\": \"npm\",\n      \"minHostVersion\": \">=2026.3.22\"\n    }\n  }\n}","readmeExcerpt":"Skill: OpenClaw Weixin Channel Owner: alichor Summary: OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。 Tags: latest:2.0.1 Version history: v2.0.1 | 2026-03-26T04:49:11.302Z | user Initial release: Weixin channel plugin with QR login and message support Archive index: Archive v2.0.1: 45 files, 145143 bytes Files: CHANGELOG.md (130b), CHANGELOG.zh_CN.md (90b), index.ts (1273b), openclaw.plugin.json (190b","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"npm install -g @tencent-weixin/openclaw-weixin"},{"language":"bash","snippet":"openclaw plugins install \"@tencent-weixin/openclaw-weixin\"\nopenclaw config set plugins.entries.openclaw-weixin.enabled true"},{"language":"bash","snippet":"openclaw channels login --channel openclaw-weixin"},{"language":"bash","snippet":"npx -y @tencent-weixin/openclaw-weixin-cli install"},{"language":"bash","snippet":"openclaw plugins install \"@tencent-weixin/openclaw-weixin\""},{"language":"bash","snippet":"openclaw config set plugins.entries.openclaw-weixin.enabled true"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: openclaw-weixin\ndescription: OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。\nmetadata:\n  {\n    \"openclaw\": {\n      \"requires\": { \"bins\": [\"openclaw\"] },\n      \"install\": [\n        {\n          \"id\": \"node\",\n          \"kind\": \"node\",\n          \"package\": \"@tencent-weixin/openclaw-weixin\",\n          \"label\": \"Install Weixin Channel Plugin (npm)\"\n        }\n      ]\n    }\n  }\n---\n\n# OpenClaw Weixin Channel\n\n微信 channel 插件，支持扫码登录 + 消息收发。\n\n## 安装\n\n```bash\nnpm install -g @tencent-weixin/openclaw-weixin\n```\n\n## 配置\n\n```bash\nopenclaw plugins install \"@tencent-weixin/openclaw-weixin\"\nopenclaw config set plugins.entries.openclaw-weixin.enabled true\n```\n\n## 扫码登录\n\n```bash\nopenclaw channels login --channel openclaw-weixin\n```\n\n## 兼容性\n\n| 插件版本 | OpenClaw 版本 |\n|---------|--------------|\n| 2.0.x   | >=2026.3.22  |\n| 1.0.x   | >=2026.1.0  |\n\n## 来源\n\n腾讯微信团队出品 · MIT License"},{"path":"README.md","content":"# WeChat\n\n[简体中文](./README.zh_CN.md)\n\nOpenClaw's WeChat channel plugin, supporting login authorization via QR code scanning.\n\n## Compatibility\n\n| Plugin Version | OpenClaw Version       | npm dist-tag | Status      |\n|---------------|------------------------|--------------|-------------|\n| 2.0.x         | >=2026.3.22            | `latest`     | Active      |\n| 1.0.x         | >=2026.1.0 <2026.3.22  | `legacy`     | Maintenance |\n\n> The plugin checks the host version at startup and will refuse to load if the\n> running OpenClaw version is outside the supported range.\n\n## Prerequisites\n\n[OpenClaw](https://docs.openclaw.ai/install) must be installed (the `openclaw` CLI needs to be available).\n\nCheck your version: `openclaw --version`\n\n## Quick Install\n\n```bash\nnpx -y @tencent-weixin/openclaw-weixin-cli install\n```\n\n## Manual Installation\n\nIf the quick install doesn't work, follow these steps manually:\n\n### 1. Install the plugin\n\n```bash\nopenclaw plugins install \"@tencent-weixin/openclaw-weixin\"\n```\n\n### 2. Enable the plugin\n\n```bash\nopenclaw config set plugins.entries.openclaw-weixin.enabled true\n```\n\n### 3. QR code login\n\n```bash\nopenclaw channels login --channel openclaw-weixin\n```\n\nA QR code will appear in the terminal. Scan it with your phone and confirm the authorization. Once confirmed, the login credentials will be saved locally automatically — no further action is needed.\n\n### 4. Restart the gateway\n\n```bash\nopenclaw gateway restart\n```\n\n## Adding More WeChat Accounts\n\n```bash\nopenclaw channels login --channel openclaw-weixin\n```\n\nEach QR code login creates a new account entry, supporting multiple WeChat accounts online simultaneously.\n\n## Multi-Account Context Isolation\n\nBy default, all channels share the same AI conversation context. To isolate conversation context for each WeChat account:\n\n```bash\nopenclaw config set agents.mode per-channel-per-peer\n```\n\nThis gives each \"WeChat account + message sender\" combination its own independent AI memory, preventing context cross-talk between accounts.\n\n## Backend API Protocol\n\nThis plugin communicates with the backend gateway via HTTP JSON API. Developers integrating with their own backend need to implement the following interfaces.\n\nAll endpoints use `POST` with JSON request and response bodies. Common request headers:\n\n| Header | Description |\n|--------|-------------|\n| `Content-Type` | `application/json` |\n| `AuthorizationType` | Fixed value `ilink_bot_token` |\n| `Authorization` | `Bearer <token>` (obtained after login) |\n| `X-WECHAT-UIN` | Base64-encoded random uint32 |\n\n### Endpoint List\n\n| Endpoint | Path | Description |\n|----------|------|-------------|\n| getUpdates | `getupdates` | Long-poll for new messages |\n| sendMessage | `sendmessage` | Send a message (text/image/video/file) |\n| getUploadUrl | `getuploadurl` | Get CDN upload pre-signed URL |\n| getConfig | `getconfig` | Get account config (typing ticket, etc.) |\n| sendTyping | `sendtyping` | Send/cancel typing status indicator |\n\n### get"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7727exgbsr4gdpc0zd5q141183mhg1\",\n  \"slug\": \"openclaw-weixin\",\n  \"version\": \"2.0.1\",\n  \"publishedAt\": 1774500551302\n}"},{"path":"CHANGELOG.md","content":"# Changelog\n\n[简体中文](CHANGELOG.zh_CN.md)\n\nThis project follows the [Keep a Changelog](https://keepachangelog.com/) format."},{"path":"CHANGELOG.zh_CN.md","content":"# 变更日志\n\n本项目遵循 [Keep a Changelog](https://keepachangelog.com/) 格式。"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。 Skill: OpenClaw Weixin Channel Owner: alichor Summary: OpenClaw 微信 channel 插件，支持扫码登录授权。接收微信消息、回复图文/文字/文件，提供完整的微信通道集成。 Tags: latest:2.0.1 Version history: v2.0.1 | 2026-03-26T04:49:11.302Z | user Initial release: Weixin channel plugin with QR login and message support Archive index: Archive v2.0.1: 45 files, 145143 bytes Files: CHANGELOG.md (130b), CHANGELOG.zh_CN.md (90b), index.ts (1273b), openclaw.plugin.json (190b","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":732,"uniquenessScore":62,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T06:18:42.255Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T06:18:42.255Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:11:05.795Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}