wechat-link 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wechat_link-0.1.0/.github/workflows/publish.yml +52 -0
- wechat_link-0.1.0/.gitignore +8 -0
- wechat_link-0.1.0/CONTRIBUTING.md +183 -0
- wechat_link-0.1.0/LICENSE +21 -0
- wechat_link-0.1.0/PKG-INFO +117 -0
- wechat_link-0.1.0/README.assets/overview.svg +97 -0
- wechat_link-0.1.0/README.en.md +361 -0
- wechat_link-0.1.0/README.ja.md +361 -0
- wechat_link-0.1.0/README.md +357 -0
- wechat_link-0.1.0/README.pypi.md +80 -0
- wechat_link-0.1.0/examples/echo_bot.py +37 -0
- wechat_link-0.1.0/examples/relay_server.py +10 -0
- wechat_link-0.1.0/examples/send_media.py +36 -0
- wechat_link-0.1.0/pyproject.toml +53 -0
- wechat_link-0.1.0/src/wechat_link/__init__.py +25 -0
- wechat_link-0.1.0/src/wechat_link/cdn.py +75 -0
- wechat_link-0.1.0/src/wechat_link/client.py +306 -0
- wechat_link-0.1.0/src/wechat_link/crypto.py +47 -0
- wechat_link-0.1.0/src/wechat_link/headers.py +22 -0
- wechat_link-0.1.0/src/wechat_link/media.py +198 -0
- wechat_link-0.1.0/src/wechat_link/message_builders.py +197 -0
- wechat_link-0.1.0/src/wechat_link/models.py +136 -0
- wechat_link-0.1.0/src/wechat_link/relay.py +297 -0
- wechat_link-0.1.0/src/wechat_link/store.py +24 -0
- wechat_link-0.1.0/tests/test_cdn.py +73 -0
- wechat_link-0.1.0/tests/test_client.py +167 -0
- wechat_link-0.1.0/tests/test_crypto.py +40 -0
- wechat_link-0.1.0/tests/test_cursor_store.py +14 -0
- wechat_link-0.1.0/tests/test_headers.py +24 -0
- wechat_link-0.1.0/tests/test_media_client.py +453 -0
- wechat_link-0.1.0/tests/test_media_helpers.py +35 -0
- wechat_link-0.1.0/tests/test_message_builders.py +181 -0
- wechat_link-0.1.0/tests/test_relay.py +190 -0
- wechat_link-0.1.0/tests/test_relay_helpers.py +27 -0
- wechat_link-0.1.0/tests/test_relay_media.py +294 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
name: Build distributions
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- name: Check out repository
|
|
15
|
+
uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Set up Python
|
|
18
|
+
uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.12"
|
|
21
|
+
|
|
22
|
+
- name: Install build tool
|
|
23
|
+
run: python -m pip install --upgrade build
|
|
24
|
+
|
|
25
|
+
- name: Build sdist and wheel
|
|
26
|
+
run: python -m build
|
|
27
|
+
|
|
28
|
+
- name: Upload distributions
|
|
29
|
+
uses: actions/upload-artifact@v4
|
|
30
|
+
with:
|
|
31
|
+
name: python-package-distributions
|
|
32
|
+
path: dist/
|
|
33
|
+
|
|
34
|
+
publish:
|
|
35
|
+
name: Publish to PyPI
|
|
36
|
+
needs: build
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
environment:
|
|
39
|
+
name: pypi
|
|
40
|
+
url: https://pypi.org/project/wechat-link/
|
|
41
|
+
permissions:
|
|
42
|
+
id-token: write
|
|
43
|
+
|
|
44
|
+
steps:
|
|
45
|
+
- name: Download distributions
|
|
46
|
+
uses: actions/download-artifact@v4
|
|
47
|
+
with:
|
|
48
|
+
name: python-package-distributions
|
|
49
|
+
path: dist/
|
|
50
|
+
|
|
51
|
+
- name: Publish package distributions to PyPI
|
|
52
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Contributing to `wechat-link`
|
|
2
|
+
|
|
3
|
+
感谢你愿意为 `wechat-link` 做贡献。
|
|
4
|
+
|
|
5
|
+
这个项目欢迎协作,但它不是一个“什么都收”的大仓库。我们更重视 **协议正确性、SDK 边界清晰、媒体链路完整、Relay 保持轻薄**,而不是快速堆出一个复杂平台。
|
|
6
|
+
|
|
7
|
+
如果你准备提交 Issue 或 PR,请先花 3 分钟看完这份文档。这样能显著减少来回沟通,也能帮助我们把项目长期保持在正确方向上。
|
|
8
|
+
|
|
9
|
+
## 项目原则
|
|
10
|
+
|
|
11
|
+
`wechat-link` 的核心目标是:
|
|
12
|
+
|
|
13
|
+
> **把 iLink-compatible Weixin Bot 的关键协议整理成一个克制、可复用、可嵌入的 Python SDK,并提供一个可选的薄 Relay。**
|
|
14
|
+
|
|
15
|
+
这意味着:
|
|
16
|
+
|
|
17
|
+
- 欢迎让协议层更清晰、更稳定、更准确的改进
|
|
18
|
+
- 欢迎提升媒体链路、错误语义、测试覆盖和文档质量的改进
|
|
19
|
+
- 欢迎让 SDK 更容易被业务系统、LLM、工作流和服务端复用的改进
|
|
20
|
+
- 不欢迎把项目快速推向“平台化”“后台化”“大而全框架化”
|
|
21
|
+
|
|
22
|
+
## 我们特别欢迎的贡献
|
|
23
|
+
|
|
24
|
+
### 1. 协议验证与纠偏
|
|
25
|
+
|
|
26
|
+
例如:
|
|
27
|
+
|
|
28
|
+
- 请求 / 响应字段语义修正
|
|
29
|
+
- `context_token`、`get_updates_buf`、typing、media payload 等关键协议细节补充
|
|
30
|
+
- 与上游行为不一致时的最小修复
|
|
31
|
+
|
|
32
|
+
### 2. 媒体链路完善
|
|
33
|
+
|
|
34
|
+
例如:
|
|
35
|
+
|
|
36
|
+
- 图片 / 文件 / 视频 / 语音上传与发送流程的稳定性修复
|
|
37
|
+
- CDN / AES 相关细节改进
|
|
38
|
+
- 更清晰的参数校验、错误提示、边界处理
|
|
39
|
+
|
|
40
|
+
### 3. SDK 可维护性
|
|
41
|
+
|
|
42
|
+
例如:
|
|
43
|
+
|
|
44
|
+
- 去重、瘦身、边界收紧
|
|
45
|
+
- 更清楚的内部模块拆分
|
|
46
|
+
- 不改变行为前提下的结构性整理
|
|
47
|
+
|
|
48
|
+
### 4. 文档与示例
|
|
49
|
+
|
|
50
|
+
例如:
|
|
51
|
+
|
|
52
|
+
- README 勘误与补充
|
|
53
|
+
- 更贴近真实使用场景的最小示例
|
|
54
|
+
- 中英日文案一致性修正
|
|
55
|
+
|
|
56
|
+
### 5. 测试
|
|
57
|
+
|
|
58
|
+
例如:
|
|
59
|
+
|
|
60
|
+
- 为已有行为补充回归测试
|
|
61
|
+
- 为协议关键路径增加 fixture 或覆盖
|
|
62
|
+
- 修正文档与代码不一致导致的测试盲区
|
|
63
|
+
|
|
64
|
+
## 当前不建议提交的方向
|
|
65
|
+
|
|
66
|
+
除非先讨论并达成共识,否则不建议直接提交以下类型的 PR:
|
|
67
|
+
|
|
68
|
+
- 多账号管理平台
|
|
69
|
+
- 大规模群控 / 运营后台
|
|
70
|
+
- 营销自动化面板
|
|
71
|
+
- 与协议层强耦合的大型 Bot Runtime
|
|
72
|
+
- 过度抽象的插件系统
|
|
73
|
+
- 自动转码 / 自动抽帧 / ffmpeg 重依赖链路
|
|
74
|
+
- 没有明确上游依据的大面积“猜测式”协议扩展
|
|
75
|
+
|
|
76
|
+
一句话:**优先补核心,不优先扩边界。**
|
|
77
|
+
|
|
78
|
+
## 提交 Issue 之前
|
|
79
|
+
|
|
80
|
+
请尽量提供以下信息:
|
|
81
|
+
|
|
82
|
+
- 你使用的环境:Python 版本、安装方式、运行平台
|
|
83
|
+
- 涉及的接口或模块:如 `get_updates`、`send_image`、`relay` 等
|
|
84
|
+
- 复现步骤
|
|
85
|
+
- 实际行为
|
|
86
|
+
- 预期行为
|
|
87
|
+
- 如涉及协议问题,最好附上脱敏后的请求 / 响应样例
|
|
88
|
+
|
|
89
|
+
如果问题与媒体上传、CDN 或 AES 相关,附带文件类型、大小和调用参数会很有帮助。
|
|
90
|
+
|
|
91
|
+
## 提交 PR 之前
|
|
92
|
+
|
|
93
|
+
请先确认你的改动符合下面几个判断:
|
|
94
|
+
|
|
95
|
+
- 这个改动是否让 SDK 更清晰,而不是更重?
|
|
96
|
+
- 这个改动是否基于真实协议行为,而不是主观想象?
|
|
97
|
+
- 这个改动是否适合作为“基础件”存在,而不是只适合某一个业务?
|
|
98
|
+
- 这个改动是否保持 Relay 的薄封装定位?
|
|
99
|
+
|
|
100
|
+
如果四个问题里有两个以上回答为“否”,建议先开 Issue 讨论。
|
|
101
|
+
|
|
102
|
+
## 开发环境
|
|
103
|
+
|
|
104
|
+
### 安装
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
git clone https://github.com/syusama/wechat-link.git
|
|
108
|
+
cd wechat-link
|
|
109
|
+
pip install -e .[dev]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 运行测试
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
pytest -q
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 基本验证
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
python -m compileall src examples
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 代码与文档风格
|
|
125
|
+
|
|
126
|
+
### 代码改动
|
|
127
|
+
|
|
128
|
+
- 优先做小而清晰的改动
|
|
129
|
+
- 尽量修根因,不做表面补丁
|
|
130
|
+
- 不顺手重构无关模块
|
|
131
|
+
- 不为了“未来可能会用到”引入复杂抽象
|
|
132
|
+
- 保持现有 API 稳定,除非有充分理由
|
|
133
|
+
|
|
134
|
+
### 文档改动
|
|
135
|
+
|
|
136
|
+
- 中文文案默认作为主文案
|
|
137
|
+
- 英文和日文版本应保持信息结构一致
|
|
138
|
+
- 可以自然表达,但不要写成营销文案
|
|
139
|
+
- 协议边界要说清楚,能力边界也要说清楚
|
|
140
|
+
|
|
141
|
+
## 测试要求
|
|
142
|
+
|
|
143
|
+
如果你的 PR 修改了行为或修复了问题,原则上应该:
|
|
144
|
+
|
|
145
|
+
- 为该行为补测试,或补足已有测试
|
|
146
|
+
- 优先写最靠近改动点的测试
|
|
147
|
+
- 尽量使用最小复现,而不是构造过大的场景
|
|
148
|
+
|
|
149
|
+
如果只是文档修正或纯重构,在不改变行为的前提下,也至少应确保现有测试通过。
|
|
150
|
+
|
|
151
|
+
## PR Checklist
|
|
152
|
+
|
|
153
|
+
提交前请自查:
|
|
154
|
+
|
|
155
|
+
- [ ] 改动聚焦在一个清晰目标上
|
|
156
|
+
- [ ] 没有把项目推向平台化或过度抽象
|
|
157
|
+
- [ ] README / 示例 / 注释在必要时已同步
|
|
158
|
+
- [ ] `pytest -q` 已运行
|
|
159
|
+
- [ ] `python -m compileall src examples` 已运行(如适用)
|
|
160
|
+
- [ ] 协议相关改动有依据,且描述清楚
|
|
161
|
+
|
|
162
|
+
## 沟通约定
|
|
163
|
+
|
|
164
|
+
- 中文 Issue / PR 欢迎
|
|
165
|
+
- English Issues / PRs are also welcome
|
|
166
|
+
- 如果你准备做较大的方向性改动,先开 Issue 讨论会更高效
|
|
167
|
+
|
|
168
|
+
## 合规与边界
|
|
169
|
+
|
|
170
|
+
`wechat-link` 是一个 **非官方项目**。
|
|
171
|
+
|
|
172
|
+
请不要把它描述成腾讯官方产品、官方开放平台,或“官方替代品”。如果你的改动会影响这层定位,请在 PR 中明确说明。
|
|
173
|
+
|
|
174
|
+
## 最后
|
|
175
|
+
|
|
176
|
+
高质量贡献的标准,不是“功能更多”,而是:
|
|
177
|
+
|
|
178
|
+
- 边界更清楚
|
|
179
|
+
- 协议更准确
|
|
180
|
+
- SDK 更干净
|
|
181
|
+
- 使用者更容易接入
|
|
182
|
+
|
|
183
|
+
如果你的 PR 往这个方向推进,它大概率就是这个项目真正需要的贡献。
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 syusama
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: wechat-link
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Unofficial Python SDK for the iLink-compatible Weixin bot protocol.
|
|
5
|
+
Project-URL: Homepage, https://github.com/syusama/wechat-link
|
|
6
|
+
Project-URL: Repository, https://github.com/syusama/wechat-link
|
|
7
|
+
Project-URL: Issues, https://github.com/syusama/wechat-link/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/syusama/wechat-link#readme
|
|
9
|
+
Author: syusama
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: bot,fastapi,ilink,relay,sdk,wechat,weixin
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Internet
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: cryptography<47.0,>=46.0
|
|
23
|
+
Requires-Dist: httpx<1.0,>=0.28
|
|
24
|
+
Requires-Dist: pillow<12.0,>=11.3
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build<2.0,>=1.2; extra == 'dev'
|
|
27
|
+
Requires-Dist: fastapi<1.0,>=0.128; extra == 'dev'
|
|
28
|
+
Requires-Dist: pytest<9.0,>=8.3; extra == 'dev'
|
|
29
|
+
Requires-Dist: python-multipart<1.0,>=0.0.20; extra == 'dev'
|
|
30
|
+
Requires-Dist: twine<7.0,>=6.1; extra == 'dev'
|
|
31
|
+
Requires-Dist: uvicorn<1.0,>=0.35; extra == 'dev'
|
|
32
|
+
Provides-Extra: relay
|
|
33
|
+
Requires-Dist: fastapi<1.0,>=0.128; extra == 'relay'
|
|
34
|
+
Requires-Dist: python-multipart<1.0,>=0.0.20; extra == 'relay'
|
|
35
|
+
Requires-Dist: uvicorn<1.0,>=0.35; extra == 'relay'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
# wechat-link
|
|
39
|
+
|
|
40
|
+
Unofficial Python SDK for iLink-compatible Weixin Bot integration.
|
|
41
|
+
|
|
42
|
+
`wechat-link` 是一个面向 iLink-compatible Weixin Bot 集成的 Python SDK,重点放在协议层、媒体链路和一个可选的轻量 Relay 上,而不是去做一个大而全的 Bot 平台。
|
|
43
|
+
|
|
44
|
+
## What it currently provides
|
|
45
|
+
|
|
46
|
+
- QR login primitives: `get_bot_qrcode()` / `get_qrcode_status()`
|
|
47
|
+
- Long polling: `get_updates()`
|
|
48
|
+
- Text messaging: `send_text()`
|
|
49
|
+
- Typing support: `get_config()` / `send_typing()`
|
|
50
|
+
- Media workflow:
|
|
51
|
+
- `get_upload_url()`
|
|
52
|
+
- `upload_image()` / `send_image()`
|
|
53
|
+
- `upload_file()` / `send_file()`
|
|
54
|
+
- `upload_video()` / `send_video()`
|
|
55
|
+
- `upload_voice()` / `send_voice()`
|
|
56
|
+
- Optional FastAPI relay layer
|
|
57
|
+
|
|
58
|
+
## Installation
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install wechat-link
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Relay extras:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pip install "wechat-link[relay]"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Quick example
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
import time
|
|
74
|
+
|
|
75
|
+
from wechat_link import FileCursorStore, WeChatLinkClient
|
|
76
|
+
|
|
77
|
+
client = WeChatLinkClient(bot_token="your-bot-token")
|
|
78
|
+
store = FileCursorStore(".state/get_updates_buf.json")
|
|
79
|
+
cursor = store.load() or ""
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
while True:
|
|
83
|
+
updates = client.get_updates(cursor=cursor)
|
|
84
|
+
|
|
85
|
+
if updates.next_cursor:
|
|
86
|
+
cursor = updates.next_cursor
|
|
87
|
+
store.save(cursor)
|
|
88
|
+
|
|
89
|
+
for message in updates.messages:
|
|
90
|
+
text = message.text().strip()
|
|
91
|
+
if not text or not message.from_user_id or not message.context_token:
|
|
92
|
+
continue
|
|
93
|
+
|
|
94
|
+
client.send_text(
|
|
95
|
+
to_user_id=message.from_user_id,
|
|
96
|
+
text=f"echo: {text}",
|
|
97
|
+
context_token=message.context_token,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
time.sleep(1)
|
|
101
|
+
finally:
|
|
102
|
+
client.close()
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Project links
|
|
106
|
+
|
|
107
|
+
- Repository: <https://github.com/syusama/wechat-link>
|
|
108
|
+
- Issues: <https://github.com/syusama/wechat-link/issues>
|
|
109
|
+
- Chinese README: <https://github.com/syusama/wechat-link/blob/main/README.md>
|
|
110
|
+
- English README: <https://github.com/syusama/wechat-link/blob/main/README.en.md>
|
|
111
|
+
- Japanese README: <https://github.com/syusama/wechat-link/blob/main/README.ja.md>
|
|
112
|
+
|
|
113
|
+
## Notes
|
|
114
|
+
|
|
115
|
+
- This is an **unofficial** project.
|
|
116
|
+
- It should not be described as a Tencent official SDK or official platform replacement.
|
|
117
|
+
- The PyPI page keeps the package overview concise; the full documentation and examples live in the GitHub repository.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<svg width="1200" height="760" viewBox="0 0 1200 760" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect width="1200" height="760" rx="24" fill="#F8FAFC"/>
|
|
3
|
+
<rect x="32" y="32" width="1136" height="696" rx="20" fill="white" stroke="#E2E8F0" stroke-width="2"/>
|
|
4
|
+
|
|
5
|
+
<text x="72" y="96" fill="#0F172A" font-family="Segoe UI, Arial, sans-serif" font-size="34" font-weight="700">
|
|
6
|
+
wechat-link overview
|
|
7
|
+
</text>
|
|
8
|
+
<text x="72" y="132" fill="#475569" font-family="Segoe UI, Arial, sans-serif" font-size="18">
|
|
9
|
+
Protocol-first Python SDK for iLink-compatible Weixin Bot integration
|
|
10
|
+
</text>
|
|
11
|
+
|
|
12
|
+
<rect x="72" y="170" width="186" height="36" rx="18" fill="#EFF6FF"/>
|
|
13
|
+
<text x="103" y="193" fill="#1D4ED8" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="600">
|
|
14
|
+
SDK-first boundary
|
|
15
|
+
</text>
|
|
16
|
+
|
|
17
|
+
<rect x="274" y="170" width="176" height="36" rx="18" fill="#ECFDF5"/>
|
|
18
|
+
<text x="305" y="193" fill="#047857" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="600">
|
|
19
|
+
Thin relay only
|
|
20
|
+
</text>
|
|
21
|
+
|
|
22
|
+
<rect x="468" y="170" width="222" height="36" rx="18" fill="#F5F3FF"/>
|
|
23
|
+
<text x="500" y="193" fill="#6D28D9" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="600">
|
|
24
|
+
Media path included
|
|
25
|
+
</text>
|
|
26
|
+
|
|
27
|
+
<rect x="72" y="252" width="370" height="104" rx="22" fill="#F8FAFC" stroke="#CBD5E1" stroke-width="2"/>
|
|
28
|
+
<text x="108" y="298" fill="#0F172A" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="700">
|
|
29
|
+
Your App / LLM / Workflow
|
|
30
|
+
</text>
|
|
31
|
+
<text x="108" y="330" fill="#475569" font-family="Segoe UI, Arial, sans-serif" font-size="18">
|
|
32
|
+
Business logic, AI orchestration, internal services
|
|
33
|
+
</text>
|
|
34
|
+
|
|
35
|
+
<rect x="72" y="414" width="370" height="124" rx="22" fill="#EEF4FF" stroke="#93C5FD" stroke-width="2"/>
|
|
36
|
+
<text x="108" y="468" fill="#1D4ED8" font-family="Segoe UI, Arial, sans-serif" font-size="30" font-weight="700">
|
|
37
|
+
wechat-link SDK
|
|
38
|
+
</text>
|
|
39
|
+
<text x="108" y="500" fill="#1E40AF" font-family="Segoe UI, Arial, sans-serif" font-size="18">
|
|
40
|
+
Login primitives, polling, typing, media upload, sendmessage
|
|
41
|
+
</text>
|
|
42
|
+
|
|
43
|
+
<rect x="504" y="394" width="232" height="76" rx="18" fill="#F8FAFC" stroke="#CBD5E1" stroke-width="2"/>
|
|
44
|
+
<text x="549" y="439" fill="#0F172A" font-family="Segoe UI, Arial, sans-serif" font-size="24" font-weight="700">
|
|
45
|
+
Optional Relay
|
|
46
|
+
</text>
|
|
47
|
+
|
|
48
|
+
<rect x="72" y="594" width="256" height="92" rx="22" fill="#EFF6FF" stroke="#93C5FD" stroke-width="2"/>
|
|
49
|
+
<text x="108" y="645" fill="#1E3A8A" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="700">
|
|
50
|
+
iLink Bot API
|
|
51
|
+
</text>
|
|
52
|
+
|
|
53
|
+
<rect x="358" y="594" width="320" height="92" rx="22" fill="#ECFDF5" stroke="#86EFAC" stroke-width="2"/>
|
|
54
|
+
<text x="398" y="645" fill="#047857" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="700">
|
|
55
|
+
CDN Upload / Download
|
|
56
|
+
</text>
|
|
57
|
+
|
|
58
|
+
<rect x="712" y="594" width="216" height="92" rx="22" fill="#F5F3FF" stroke="#C4B5FD" stroke-width="2"/>
|
|
59
|
+
<text x="742" y="633" fill="#6D28D9" font-family="Segoe UI, Arial, sans-serif" font-size="24" font-weight="700">
|
|
60
|
+
AES-128-ECB
|
|
61
|
+
</text>
|
|
62
|
+
<text x="751" y="660" fill="#7C3AED" font-family="Segoe UI, Arial, sans-serif" font-size="16">
|
|
63
|
+
media encryption path
|
|
64
|
+
</text>
|
|
65
|
+
|
|
66
|
+
<rect x="804" y="252" width="302" height="80" rx="18" fill="#F8FAFC" stroke="#E2E8F0" stroke-width="2"/>
|
|
67
|
+
<circle cx="840" cy="292" r="8" fill="#2563EB"/>
|
|
68
|
+
<text x="862" y="299" fill="#0F172A" font-family="Segoe UI, Arial, sans-serif" font-size="20" font-weight="600">
|
|
69
|
+
QR login primitives
|
|
70
|
+
</text>
|
|
71
|
+
|
|
72
|
+
<rect x="804" y="350" width="302" height="80" rx="18" fill="#F8FAFC" stroke="#E2E8F0" stroke-width="2"/>
|
|
73
|
+
<circle cx="840" cy="390" r="8" fill="#0F766E"/>
|
|
74
|
+
<text x="862" y="397" fill="#0F172A" font-family="Segoe UI, Arial, sans-serif" font-size="20" font-weight="600">
|
|
75
|
+
Long polling + cursor store
|
|
76
|
+
</text>
|
|
77
|
+
|
|
78
|
+
<rect x="804" y="448" width="302" height="80" rx="18" fill="#F8FAFC" stroke="#E2E8F0" stroke-width="2"/>
|
|
79
|
+
<circle cx="840" cy="488" r="8" fill="#7C3AED"/>
|
|
80
|
+
<text x="862" y="495" fill="#0F172A" font-family="Segoe UI, Arial, sans-serif" font-size="20" font-weight="600">
|
|
81
|
+
Text, typing, context_token
|
|
82
|
+
</text>
|
|
83
|
+
|
|
84
|
+
<rect x="804" y="546" width="302" height="80" rx="18" fill="#F8FAFC" stroke="#E2E8F0" stroke-width="2"/>
|
|
85
|
+
<circle cx="840" cy="586" r="8" fill="#DC2626"/>
|
|
86
|
+
<text x="862" y="593" fill="#0F172A" font-family="Segoe UI, Arial, sans-serif" font-size="20" font-weight="600">
|
|
87
|
+
Image, file, video, voice
|
|
88
|
+
</text>
|
|
89
|
+
|
|
90
|
+
<path d="M256 356L256 414" stroke="#94A3B8" stroke-width="4" stroke-linecap="round"/>
|
|
91
|
+
<path d="M620 470L620 594" stroke="#94A3B8" stroke-width="4" stroke-linecap="round"/>
|
|
92
|
+
<path d="M256 538L256 594" stroke="#94A3B8" stroke-width="4" stroke-linecap="round"/>
|
|
93
|
+
<path d="M442 470L504 432" stroke="#94A3B8" stroke-width="4" stroke-linecap="round"/>
|
|
94
|
+
<path d="M736 432L804 432" stroke="#94A3B8" stroke-width="4" stroke-linecap="round"/>
|
|
95
|
+
<path d="M442 500L804 500" stroke="#94A3B8" stroke-width="4" stroke-linecap="round"/>
|
|
96
|
+
<path d="M678 640L712 640" stroke="#94A3B8" stroke-width="4" stroke-linecap="round"/>
|
|
97
|
+
</svg>
|