Appearance
接入代码与配置项
一段 script 标签装上聊天窗,一个就绪回调拿到全部命令。这是网页接入渠道全部的接入层配置。
接入代码
从工作台 设置 > 渠道管理 > 选择渠道 > 安装代码 复制,贴到页面 </body> 之前:
html
<script async
src="https://assets.aihecong.com/sdk/hecong.js"
data-channel-id="0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a5b">
</script>聊天窗读取 script 标签上的 data-* 属性自行完成初始化,你这边不用写初始化代码。
可配的属性只有两个
| 属性 | 必填 | 说明 |
|---|---|---|
data-channel-id | ✅ | 渠道编号,工作台复制出来的代码里已经填好 |
data-language | 访客界面语言,BCP 47 标记如 zh-CN / en / ja |
多语言站点在每个语言版本的页面上传对应的 data-language。填了不认识的值不会出问题,会自动回落到访客的浏览器语言。
其余配置都在工作台
按钮文案与位置、主题色、欢迎语、快捷按钮、询前表单、对话评价,全部在工作台里可视化配置。代码里传不进去,也不需要传 —— 运营改文案不用等发版。
拿到命令对象
要传客户身份、监听事件或者程序化开关聊天窗,在上面那段 script 之后加一段:
html
<script>
window.hecong = window.hecong || function (c) { (window.hecong.q = window.hecong.q || []).push(c) }
window.hecong(function (hc) {
hc.identify({ id: 'c9a1f0e2-7b34-4d58-9f61-0ab2d3c4e5f6', profile: { name: '张三' } })
})
</script>第一行是占位函数,照原样复制,不要改写。接入脚本带 async 异步加载,你的代码很可能先于它执行 —— 这一行保证 window.hecong 从一开始就存在,早调的回调先进队列,脚本就绪后依次执行。一个页面写一份就够,放在最早执行的那段脚本里;重复出现也无害,|| 守护会保留先写的那份,文档各页示例自带这一行只是为了能独立复制。
有了它,window.hecong(cb) 什么时机调都行:
- 脚本还没加载完就调用,回调排队,就绪后依次执行
- 已经就绪之后才调用,回调立即执行
- 所以紧跟接入代码写、在标签管理器里异步注入、在单页应用的
useEffect里、甚至路由切换之后再注册,都不会漏
回调参数 hc 就是命令对象,全部方法见接口速查。
更习惯用原生事件的话,也可以监听 hecong:ready:
js
window.addEventListener('hecong:ready', function (e) {
e.detail.open()
})e.detail 就是命令对象。注意它是一次性广播,监听要写在跟接入 script 标签同一处的内联脚本里,保证先于脚本加载执行;注册晚了就静默错过,不会报错。拿不准时序就用上面的 window.hecong(cb),它没有这个限制。
本地开发与域名限制
新建的渠道不限制域名,代码贴哪都能跑,本地 localhost 直接就能调通。
在工作台 设置 > 渠道管理 > 安全与隐私 里填了授权域名之后,才开始校验,没填进去的域名会拿到 401。填的时候注意:
| 要填的 | 怎么写 |
|---|---|
| 本地开发 | localhost —— 只匹配主机名,不要带端口和协议 |
| 局域网真机调试 | 填那台机器的 IP,如 192.168.1.7 |
| 一批子域 | *.example.com 匹配任意子域,但不包含 example.com 本身,裸域要另填一条 |
大小写不敏感。
内容安全策略
多数网站没有配 CSP,这一节可以跳过。配了的话,把合从的域名整体放行:
script-src https://*.aihecong.com
connect-src https://*.aihecong.com wss://*.aihecong.com
img-src https://*.aihecong.com data: blob:
style-src 'unsafe-inline'
media-src https://*.aihecong.com blob:connect-src 的 https 和 wss 两条都要写,只写 https 会表现为聊天窗能加载但收不到消息。style-src 需要 'unsafe-inline',聊天窗的样式注入在 Shadow DOM 内,作用域不会越出聊天窗。
服务端渲染的项目
聊天窗依赖 document 和 window,不能在服务端执行。在 Next.js、Nuxt 这类框架里,把 script 标签放在只在浏览器执行的位置:
jsx
// app/layout.tsx
import Script from 'next/script'
export default function RootLayout({ children }) {
return (
<html>
<body>
{children}
<Script
async
src="https://assets.aihecong.com/sdk/hecong.js"
data-channel-id="0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a5b"
strategy="afterInteractive"
/>
<Script id="hecong-stub" strategy="beforeInteractive">
{'window.hecong = window.hecong || function (c) { (window.hecong.q = window.hecong.q || []).push(c) }'}
</Script>
</body>
</html>
)
}vue
<!-- 放在 app.vue 这类整个应用只执行一次的位置,别放进会随路由反复挂载的组件 -->
<script setup>
onMounted(() => {
window.hecong = window.hecong || function (c) { (window.hecong.q = window.hecong.q || []).push(c) }
const s = document.createElement('script')
s.async = true
s.src = 'https://assets.aihecong.com/sdk/hecong.js'
s.dataset.channelId = '0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a5b'
document.body.appendChild(s)
})
</script>两个片段里那行占位函数来自上文拿到命令对象 —— 组件里的 window.hecong(cb) 可能先于接入脚本执行,有这一行就什么时机调都行。Next.js 里它用 beforeInteractive,是为了抢在所有业务代码之前执行;主脚本维持 afterInteractive 不变。
合从不提供 npm 包
聊天窗只有 script 标签这一种接入方式,npm registry 上没有任何 @hecong/* 包。React、Vue 项目同样用上面的 script 标签,在组件里调 window.hecong(cb),写法见 React 与 Vue 接入示例。
下一步
- 传客户资料给客服 —— 装上之后的第一件事
- React 与 Vue 接入示例 —— 框架项目的完整写法