Appearance
JSAPI
在你的页面(浏览器端)里引入:
html
<script src="https://<你的机灵兔部署域名>/api/open/jsapi/jlt.js"></script>方法速查
| 方法 | 需要能力 | 说明 |
|---|---|---|
ready(cb) / getContext() | — | 容器就绪/上下文(用户/组织/平台) |
requestAuthCode() | — | 重新取一次性免登码 |
selectUsers(opts?) | —(用户亲手挑即授权) | 系统选人组件 |
openChat({user_id}) | — | 跳到与该成员的单聊 |
alert / confirm / toast | — | 系统样式对话框/轻提示 |
setTitle / close | — | 窗口标题/关闭 |
localFetch({url…}) | local | 从用户电脑抓网页(桌面端 + 每次确认) |
browserExtract({url…}) | local | 无头浏览器提取(桌面端 + 每次确认) |
会挂载全局 window.jlt。也可以使用平台提供的 TypeScript 封装 @ai-im/org-app-sdk(纯类型 + Promise 化,协议实现仍是上面这份 JS,见 SDK 参考)。
平台差异
同一份 SDK 自动适配桌面与移动容器,所有方法两端行为一致;差异只有:
| 差异点 | 桌面端 | 移动端 |
|---|---|---|
getContext().platform | "desktop"(独立应用窗口) | "mobile"(内嵌 WebView 页) |
openChat | 聚焦主窗口并打开单聊,应用窗口保留 | 直接推入聊天页,返回键回到应用 |
| 对话框/选人 | 壳的原生 DOM 弹层 | 系统原生弹窗/选人页 |
| 窗口标题 | 设置独立窗口标题 | 设置页面导航栏标题 |
localFetch / browserExtract | ✅(需 local 能力 + 每次用户确认) | ❌ 返回“仅桌面端支持本地能力” |
在普通浏览器里打开时所有调用 15 秒超时 reject——务必先判断 window.jlt 做降级(完整对照见 Demo)。
API
jlt.ready(callback)
容器就绪后触发一次,参数是当前上下文。重复调用会立即用已缓存的上下文触发。
ts
jlt.ready((ctx) => {
console.log(ctx.user.nickname, ctx.org_id);
});jlt.getContext(): Promise<Context>
跟 ready 等价的 Promise 形式。
ts
interface Context {
app_id: string;
org_id: string;
user: { user_id: string; nickname: string; avatar_url: string };
locale: string; // "zh-CN" | "en" | "zh-TW" | "ja"
platform: string; // "desktop" | "mobile"
}jlt.requestAuthCode(): Promise<{ auth_code: string; expires_in: number }>
重新签发一枚一次性免登授权码(5 分钟有效),用于会话续期。
jlt.setTitle(title: string): Promise<void>
设置应用窗口标题。
jlt.close(): Promise<void>
关闭应用窗口。
jlt.selectUsers(opts?): Promise<{ users: User[] }>
系统选人组件——弹出客户端原生的成员选择窗(带搜索),用户挑选后返回:
ts
const { users } = await jlt.selectUsers({ multiple: true, max: 20 });
// users: [{ user_id, nickname, avatar_url, title }]| 参数 | 类型 | 说明 |
|---|---|---|
multiple | boolean | 多选(默认单选:点一位即返回) |
selected | string[] | 打开时预选中的 user_id |
title | string | 选人窗口标题 |
max | number | 多选最多可选人数(1–100,默认 100) |
用户取消时返回 { users: [] }。不需要任何能力(scope):成员由用户亲手 挑选,你的页面只会拿到被选中的那几位——用户挑选即用户授权。
jlt.openChat({ user_id }): Promise<void>
把用户带到 IM 里打开与该成员的单聊(桌面端聚焦主窗口;移动端直接推入聊天页); 应用窗口保持不动。适合「找 TA 催一下」这类跳转。
jlt.alert({ message, title?, button? }): Promise<void>
系统样式警告框,用户点掉按钮后 resolve。
jlt.confirm({ message, title?, okText?, cancelText? }): Promise<{ ok }>
系统样式确认框:
ts
const { ok } = await jlt.confirm({ message: "确认提交这份报销单?" });
if (!ok) return;jlt.toast({ message, type?, duration? }): Promise<void>
轻提示,自动消失且不遮挡页面交互。type: "info" | "success" | "error", duration 毫秒(500–6000,默认 2200)。
jlt.localFetch({ url, max_chars? }): Promise<{ url, text, truncated, length }>
从用户电脑抓取网页正文(走用户本机网络——能访问内网、带本地代理)。 需要应用被授予本地能力(local),且每次调用都会弹窗请用户确认 (弹窗把解析后的 协议://主机:端口 单独展示,用户拒绝即失败)。不跟随 重定向——目标返回 30x 直接报错,请自己拿规范地址来;URL 含 user@host 形式会被拒绝。仅桌面端。
jlt.browserExtract({ url, max_chars? }): Promise<{ url, text, truncated, length }>
无头浏览器打开页面并提取正文——JS 渲染的页面(SPA、动态表格)用这个。 隔离实例:临时浏览器配置、不带用户任何登录态、用完即杀,跟你日常浏览器 完全隔离;导航后校验最终地址与确认的地址同源,被重定向到其它站点会中止。 同样需要 local 能力 + 每次用户确认。仅桌面端。
尊重确认弹窗
本地能力的授权模型是「组织管理员开 scope + 用户逐次确认」双层设计——不要 高频调用把用户淹没在弹窗里;批量抓取应合并为少量请求,或在你的后端做缓存。
降级处理
不在机灵兔客户端里打开时(例如开发者直接用普通浏览器预览页面),所有调用会 在 15 秒后超时 reject。建议先判断:
ts
if (window.jlt) {
// 在客户端里
} else {
// 普通浏览器,降级展示
}使用 SDK 时对应 isInJltClient()。