# web.rest.iLinkClient 库模块帮助文档

[▶ 微信 iLink 接口文档](https://github.com/Tencent/openclaw-weixin/blob/main/README.zh_CN.md) [▶ 登录与发送消息范例](https://www.aardio.com/zh-cn/docs/examples/Web/REST/iLink/login.html) [▶ 发送文件范例](https://www.aardio.com/zh-cn/docs/examples/Web/REST/iLink/download-media.html)

## web.rest 成员列表 <a id="web.rest" href="#web.rest">&#x23;</a>

### web.rest.iLinkClient <a id="web.rest.iLinkClient" href="#web.rest.iLinkClient">&#x23;</a>
微信 iLink Bot API 客户端。  
基于 web.rest.jsonClient，请求与返回数据均为 JSON。  
用于合规的微信个人账号 Bot 开发，  
支持扫码登录、长轮询接收消息、发送消息、  
发送图片/视频/文件、下载接收到的媒体文件等。  

授权方式：  
- 初始使用 AuthorizationType: ilink_bot_token + 随机 X-WECHAT-UIN  
- 扫码确认后自动切换为 Authorization: Bearer <bot_token>

创建 iLink Bot 客户端。

### web.rest.iLinkClient() <a id="web.rest.iLinkClient" href="#web.rest.iLinkClient">&#x23;</a>
[返回对象:webRestILinkClientObject](#webRestILinkClientObject)

### web.rest.iLinkClient(config) <a id="web.rest.iLinkClient" href="#web.rest.iLinkClient">&#x23;</a>
创建 iLink Bot 客户端。  
config 可选指定以下字段：  
- userAgent,proxy,proxyBypass,httpFlags 等 HTTP 客户端参数  
- tokenPath: Bot token 持久化路径  
- cdnBaseUrl: CDN 基址（默认 "https://novac2c.cdn.weixin.qq.com/c2c"）  
- channelVersion: 渠道版本号（默认 "1.0.3"）  
- botAgent: Bot 标识（默认 "aardio-iLinkClient/1.0.0"）  
- ilinkAppId: iLink-App-Id 头（可选）  
- ilinkAppClientVersion: iLink-App-ClientVersion 头（可选）  
- routeTag: SKRouteTag 头（可选）

### web.rest.iLinkClient(iLinkClient) <a id="web.rest.iLinkClient" href="#web.rest.iLinkClient">&#x23;</a>
可将界面线程的 web.rest.iLinkClient 作为参数，  
在工作线程中重建具有相同构造参数与认证令牌的 iLink Bot 客户端。\

## webRestILinkClientObject 成员列表 <a id="webRestILinkClientObject" href="#webRestILinkClientObject">&#x23;</a>

### webRestILinkClientObject._http <a id="webRestILinkClientObject._http" href="#webRestILinkClientObject._http">&#x23;</a>
inet.http客户端，用于执行 http 请求  

[返回对象:inetHttpObject](https://www.aardio.com/zh-cn/docs/library-reference/inet/http.html#inetHttpObject)

### webRestILinkClientObject.aesEcbDecrypt(ciphertext,key) <a id="webRestILinkClientObject.aesEcbDecrypt" href="#webRestILinkClientObject.aesEcbDecrypt">&#x23;</a>
AES-128-ECB 解密

### webRestILinkClientObject.aesEcbEncrypt(plaintext,key) <a id="webRestILinkClientObject.aesEcbEncrypt" href="#webRestILinkClientObject.aesEcbEncrypt">&#x23;</a>
AES-128-ECB 加密（用于 CDN）

### webRestILinkClientObject.aesEcbPaddedSize(plaintextSize) <a id="webRestILinkClientObject.aesEcbPaddedSize" href="#webRestILinkClientObject.aesEcbPaddedSize">&#x23;</a>
计算 AES-128-ECB PKCS7 填充后大小

### webRestILinkClientObject.checkQrCodeStatus(qrcode) <a id="webRestILinkClientObject.checkQrCodeStatus" href="#webRestILinkClientObject.checkQrCodeStatus">&#x23;</a>
检查二维码扫码状态。  
扫码确认后自动绑定 bot_token

### webRestILinkClientObject.close() <a id="webRestILinkClientObject.close" href="#webRestILinkClientObject.close">&#x23;</a>
关闭对象释放资源

### webRestILinkClientObject.defaultHeaders <a id="webRestILinkClientObject.defaultHeaders" href="#webRestILinkClientObject.defaultHeaders">&#x23;</a>
替换所有请求默认添加的HTTP头  
请求结束时不会清空此属性  
该值可以是一个字符串,也可以是键值对组成的table对象

### webRestILinkClientObject.downloadMedia(media,savePath) <a id="webRestILinkClientObject.downloadMedia" href="#webRestILinkClientObject.downloadMedia">&#x23;</a>
下载并解密 CDN 媒体。  
@media CDNMedia 对象（含 encrypt_query_param, aes_key 字段）  
@savePath 可选保存路径。不指定则返回 buffer

### webRestILinkClientObject.downloadMsgMedia(fromMsg,itemIndex,savePath) <a id="webRestILinkClientObject.downloadMsgMedia" href="#webRestILinkClientObject.downloadMsgMedia">&#x23;</a>
从接收消息中提取并下载媒体。  
@fromMsg 接收的消息对象  
@itemIndex 消息项索引（默认 1）  
@savePath 可选保存路径

### webRestILinkClientObject.get(网址,参数表) <a id="webRestILinkClientObject.get" href="#webRestILinkClientObject.get">&#x23;</a>
使用该GET方法提交请求,获取资源  
请求参数将会自动转换为URL附加参数,  
请求参数可以指定表或字符串,如果是表请求前会转换为字符串  
成功返回数据,失败返回空值,错误信息,错误代码

### webRestILinkClientObject.getAuthToken() <a id="webRestILinkClientObject.getAuthToken" href="#webRestILinkClientObject.getAuthToken">&#x23;</a>
获取认证令牌（token）。  
扫码登录或创建对象的参数表指定了 tokenPath 字段都会自动设置令牌

### webRestILinkClientObject.getConfig(fromMsg) <a id="webRestILinkClientObject.getConfig" href="#webRestILinkClientObject.getConfig">&#x23;</a>
获取账号配置（含 typing_ticket）。  
返回值可作为 sendTyping 的第一个参数

### webRestILinkClientObject.getQrCode(botType) <a id="webRestILinkClientObject.getQrCode" href="#webRestILinkClientObject.getQrCode">&#x23;</a>
获取登录二维码。  
@botType 可选，默认为 3（个人账号）。  
成功返回包含 qrcode_url 字段的对象

### webRestILinkClientObject.getUpdates(buf) <a id="webRestILinkClientObject.getUpdates" href="#webRestILinkClientObject.getUpdates">&#x23;</a>
长轮询获取最新消息。  
成功返回包含 msgs 数组的对象

### webRestILinkClientObject.getUploadUrl(params) <a id="webRestILinkClientObject.getUploadUrl" href="#webRestILinkClientObject.getUploadUrl">&#x23;</a>
获取 CDN 上传预签名参数。  
一般使用 uploadFile 方法即可，无需直接调用此方法

### webRestILinkClientObject.lastRequestUrl <a id="webRestILinkClientObject.lastRequestUrl" href="#webRestILinkClientObject.lastRequestUrl">&#x23;</a>
获取最后一次请求的 URL。  
允许的 beforeRequestHeaders 事件中修改此属性以改变请求地址。

### webRestILinkClientObject.lastResponse() <a id="webRestILinkClientObject.lastResponse" href="#webRestILinkClientObject.lastResponse">&#x23;</a>
获取最后一次服务器返回的数据。  
如果控制台已打开或在开发环境中导入 console 库则在控制台输出数据  
下载文件时该值为空

### webRestILinkClientObject.lastResponseError() <a id="webRestILinkClientObject.lastResponseError" href="#webRestILinkClientObject.lastResponseError">&#x23;</a>
返回服务器最后一次返回的错误响应，并转换为错误对象。  
与调用 API 时转换响应数据一样，支持相同的服务器响应格式 。  
如果错误来自本地（lastStatusCode 属性为 null）则此函数返回 null 。  
如果最后一次发生请求成功，则此函数返回 null 。  

如果在参数 @1 中指定返回字段，且错误对象包含该字段则使用直接下标获取并返回字段值。  
获取字段失败返回 null 而非抛出异常

### webRestILinkClientObject.lastResponseObject() <a id="webRestILinkClientObject.lastResponseObject" href="#webRestILinkClientObject.lastResponseObject">&#x23;</a>
获取最后一次服务器返回的对象（已将响应文本解析为对象）。  
请求失败，或者下载文件时此属性值为空。

### webRestILinkClientObject.lastResponseString() <a id="webRestILinkClientObject.lastResponseString" href="#webRestILinkClientObject.lastResponseString">&#x23;</a>
获取最后一次服务器返回的原始数据  
请求失败，或者下载文件时此属性值为空

### webRestILinkClientObject.lastStatusCode <a id="webRestILinkClientObject.lastStatusCode" href="#webRestILinkClientObject.lastStatusCode">&#x23;</a>
获取最近一次请求返回的HTTP状态码  
100 ~ 101 为信息提示  
200 ~ 206 表示请求成功  
300 ~ 305 表示重定向  
400 ~ 415 表求客户端请求出错  
500 ~ 505 表示服务端错误

### webRestILinkClientObject.lastStatusMessage() <a id="webRestILinkClientObject.lastStatusMessage" href="#webRestILinkClientObject.lastStatusMessage">&#x23;</a>
获取最近返回的HTTP状态码文本描述  
第二个返回值为状态码

### webRestILinkClientObject.notifyStart() <a id="webRestILinkClientObject.notifyStart" href="#webRestILinkClientObject.notifyStart">&#x23;</a>
通知微信服务器客户端正在启动（可选调用）

### webRestILinkClientObject.notifyStop() <a id="webRestILinkClientObject.notifyStop" href="#webRestILinkClientObject.notifyStop">&#x23;</a>
通知微信服务器客户端正在停止（可选调用）

### webRestILinkClientObject.ok() <a id="webRestILinkClientObject.ok" href="#webRestILinkClientObject.ok">&#x23;</a>
最后一次请求是否成功  
服务器应答并且状态码为2XX该函数返回真

### webRestILinkClientObject.post(网址,参数表) <a id="webRestILinkClientObject.post" href="#webRestILinkClientObject.post">&#x23;</a>
使用该POST方法提交请求,新增或修改资源  
请求参数可以指定表或字符串,如果是表请求前会转换为字符串  
成功返回数据,失败返回空值,错误信息,错误代码

### webRestILinkClientObject.sendFile(fromMsg,filePath,fileName,text) <a id="webRestILinkClientObject.sendFile" href="#webRestILinkClientObject.sendFile">&#x23;</a>
发送文件消息。  
@fileName 可选，默认使用文件名

### webRestILinkClientObject.sendImage(fromMsg,filePath,text) <a id="webRestILinkClientObject.sendImage" href="#webRestILinkClientObject.sendImage">&#x23;</a>
发送图片消息。  
@fromMsg 接收的消息对象  
@filePath 图片文件路径  
@text 可选附带文本（有文本时文本与图片分开发送）

### webRestILinkClientObject.sendMediaByPath(fromMsg,filePath,text,fileName) <a id="webRestILinkClientObject.sendMediaByPath" href="#webRestILinkClientObject.sendMediaByPath">&#x23;</a>
发送媒体文件（自动根据扩展名检测类型）

### webRestILinkClientObject.sendMessage(fromMsg,content) <a id="webRestILinkClientObject.sendMessage" href="#webRestILinkClientObject.sendMessage">&#x23;</a>
发送消息。  
@content 可为字符串（支持 Markdown）或数组。  
同一个 @fromMsg 可多次回复

### webRestILinkClientObject.sendTyping(linkConfig,status) <a id="webRestILinkClientObject.sendTyping" href="#webRestILinkClientObject.sendTyping">&#x23;</a>
发送输入状态。  
@linkConfig getConfig 方法获取，省略则自动获取。  
可使用   
@status 为 1 表示正在输入，2 表示取消输入

### webRestILinkClientObject.sendVideo(fromMsg,filePath,text) <a id="webRestILinkClientObject.sendVideo" href="#webRestILinkClientObject.sendVideo">&#x23;</a>
发送视频消息

### webRestILinkClientObject.setHeaders <a id="webRestILinkClientObject.setHeaders" href="#webRestILinkClientObject.setHeaders">&#x23;</a>
设置所有请求默认添加的HTTP头

### webRestILinkClientObject.setHeaders(headers) <a id="webRestILinkClientObject.setHeaders" href="#webRestILinkClientObject.setHeaders">&#x23;</a>
参数 @headers 必须指定一个表中,  
用该表中的键值对更新 defaultHeaders 属性中的键值  
如果addHeaders的原属性值不是一个表,则先清空该属性

### webRestILinkClientObject.setTimeouts(连接超时,请求超时,接收超时) <a id="webRestILinkClientObject.setTimeouts" href="#webRestILinkClientObject.setTimeouts">&#x23;</a>
设置超时,以亳秒为单位（1秒为1000毫秒）。

### webRestILinkClientObject.uploadFile(filePath,toUserId,mediaType) <a id="webRestILinkClientObject.uploadFile" href="#webRestILinkClientObject.uploadFile">&#x23;</a>
上传文件到微信 CDN。  
@filePath 文件路径  
@toUserId 目标用户 ID  
@mediaType 媒体类型: 1=IMAGE, 2=VIDEO, 3=FILE, 4=VOICE  
成功返回 {filekey,downloadEncryptedQueryParam,aeskey,fileSize,fileSizeCiphertext}

### webRestILinkClientObject.waitQrCodeStatus(qrcode,maxRetries,pollInterval) <a id="webRestILinkClientObject.waitQrCodeStatus" href="#webRestILinkClientObject.waitQrCodeStatus">&#x23;</a>
阻塞式等待扫码登录成功

## webRestILinkClientObject 事件列表 <a id="webRestILinkClientObjectEvent" href="#webRestILinkClientObjectEvent">&#x23;</a>

### webRestILinkClientObject.onQrCodeScanned <a id="webRestILinkClientObject.onQrCodeScanned" href="#webRestILinkClientObject.onQrCodeScanned">&#x23;</a>
function(qrcode){  
    __/*已扫码但未确认时回调此事件*/  
}
