Skip to content

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 }]
参数类型说明
multipleboolean多选(默认单选:点一位即返回)
selectedstring[]打开时预选中的 user_id
titlestring选人窗口标题
maxnumber多选最多可选人数(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()

机灵兔开放平台 · 组织应用开发者文档