用友 iKM 知识服务 · 登录与访问
一、技能维护边界(最高优先级)
本技能只沉淀通用的用友系站点登录方法、登录方式统一口径、iKM 平台操作要点(含登录后检索 / 批量下载 / 文档解析)与环境注意事项,绝不收录:
- 登录凭证(账号、手机号、密码、短信验证码、cookie、token、验签头)——一律现取现用,绝不写进技能知识或脚本常量、绝不随包外发。
- 某条具体知识库内容 / 检索结论(运行产物,由用户自行归档)——包括某次检索到的具体文档 pk、清单、下载链接。
- 客户具体信息(客户名、集团编码、业务单元 code、数据量等)。
- 其它技能包的名称、目录或功能对比。
> 本规则优先级高于下方所有章节。红线只在此声明一次。
二、何时使用
- 定位:把「登录 iKM(ikm.yonyou.com)并访问用友知识服务」做成标准、可复用的动作。核心产出之一是《用友系 CAS 登录方式统一口径》:登录类技能各自持一份、靠人工维护一致。
- 触发:用户要「登录 iKM」「访问用友知识库」「查 iKM 上的知识文档」,或需要「用友系网站登录方式」的统一口径时调用;也包括「登录后按关键词检索 iKM 文档、批量下载、解析 .doc/.docx 大纲」这类登录后平台操作(方法见第九章与
references/retrieve_download.md)。
三、驱动路径自动路由(最高优先 · 每次任务先看这条)
> 执行前的最小加载集(省时关键):跑一次常规任务,只读——本文件的 §三(驱动路由)、§四(登录方式统一口径)、§九(检索 / 下载 / 解析要点),加上 references/retrieve_download.md 的对应小节。不要通读 references/faq.md,也不要读逐步命令:references/workflow.md 是必读层(路径速决 + 指针)、references/manual-steps.md 是按需层(仅排错与定制时读)、references/faq.md 是排错层(按「症状 / 检索关键词」定位到单条再读)。
>
> 同理,取数与产出不要逐轮往返搬运:检索 → 批量下载 → 解析一次做完(见 §九),收尾只报结论与产物路径。浏览器驱动本身已接近下限,会话时长的可压缩部分主要在文档加载量、profile 残留清场、结果搬运与收尾陈述四处。
本技能同时覆盖两条驱动路径,由环境自动选择,你下命令不用指定 pc/cli:
- 路径 A · MCP(默认):实调探测到 MCP 可用(调一次
mcp__playwright__browser_tabs,返回正常即判定可用)→ 走 MCP 路径,逐步操作见references/manual-steps.md§A。 - 路径 B · CLI(无 MCP 环境):手机端 / 未安装或不可信 playwright MCP / 你显式说「用 cli / playwright-cli / 手机端 / 没 MCP」→ 走
playwright-cli路径,iKM 登录逐步操作见references/manual-steps.md§B;先就绪 playwright-cli(需先有 Node.js ≥ 18;安装独立包@playwright/cli并生成.playwright/cli.config.jsonno-sandbox,见 §B.0),就绪脚本scripts/setup_cli.sh装包失败即 [FAIL] 退出、收尾另做就绪自检。首次安装(换源提速 / 装对包 / 内核镜像 / 离线复用 / 版本纪律)见references/install_quickstart.md。 - 不得凭连接器列表推断:连接器状态列表未列出 playwright、或工具清单里看不到
browser_*,均不构成「无 MCP」的判据——一律以实调结果为准(MCP 配了却静默起不来时会呈现此症状,误判会平白降级 CLI)。 - 工具可用、却返回「profile 被占用」:
browser_*工具能调通但返回Browser is already in use for <profile>—— 属通道可用、profile 被上一轮残留的浏览器占住:按references/manual-steps.md第 1 节先清场、再重试一次即可,不得据此判「没有 MCP」而误切路径 B(两条路径 profile 与登录态不互通,误切等于白付一次清场 + 重新登录)。 - 手动覆盖:你显式点名路径时,以你的指令为准(如「用 cli 跑」强制 B)。
> 两条路径能力对等:导航 / 快照 / 填表 / 点击 / 下拉 / 二维码出码 / 下载 / 解析一一对应,仅工具形态不同(browser_* 工具 vs playwright-cli 命令)。控件 target(A) / ref(B) 每次会话重分配,均须现读、禁写死。检索与下载的接口方法见 references/retrieve_download.md(两种路径下 fetch / page 上下文写法一致)。
>
> 本技能直接驱动 playwright MCP 连接器或 playwright-cli,CAS 登录与检索 / 下载步骤已内联于 references/manual-steps.md 与 references/retrieve_download.md,不依赖其它技能即可独立运行。
四、登录方式统一口径(核心 · 通用)
> ## 标准登录 SOP(端到端 · 必成路径)——先照这一条走
>
> 必定能登录成功:本链路的兜底是 ⑤ F12 取凭证——它不依赖账密、不触发验证码、不受风控影响,只要用户自己能在浏览器里登进去,把 Cookie / 令牌交出来就一定能注入成功。注意:必定成功 ≠ 必定免交互,③ 与 ⑤ 需要用户做一个动作。
>
> 阶段 0 · 环境就绪(只做一次):装 @playwright/cli(换源 npmmirror)→ 下载内核(判据=实开成功,不认「目录存在」)→ 跑环境探测确认可用通道。
> 阶段 1 · 定通道(实调,不推断):调一次浏览器工具看返回来判有没有 MCP,不得凭连接器状态列表判断;批量取数走 CLI(产物能直接落盘),交互 / 单步走 MCP。
> 阶段 2 · 清场与 profile:清场脚本清掉残留锁;profile 落用户级状态目录(与工作区解耦);路径一律 winpath() 转型。
> 阶段 3 · 登录前准备(缺一步必卡):① 现读快照、点掉 cookie 同意浮层再点「登录」;② 登录页多为嵌套 iframe,其中控件照常定位,target / ref 现读快照取,禁止写死、禁止跨轮复用。
> 阶段 4 · 登录执行(逐级下沉,走到成功即停):
> ① 复用已登录会话 → 判据:受保护 URL 直达、未跳 CAS。失败转 ②。
> ② 账密自动填充(凭据取本机配置文件)→ 判据:URL 离开 cas/login。
> └ 报「账号或密码错误」=凭据问题:错误账密的重试本身会诱发滑块,故核配置后不要反复重试(越试越易被判成风控);修好后重跑 ②。
> └ 页面要求交互的验证码=风控:验证码由服务端风控按需下发,已验维度(客户端指纹:全新 profile / 换浏览器实体 / 换移动端)不是其触发源,未验维度为出口 IP / 网络位置、账号维度;② 走不通 → 转 ③。
> ③ 二维码扫码(不触发验证码)→ CLI 路径必须单命令闭环(出码 + 轮询等扫写在同一条命令内)。失败转 ⑤。
> ⑤ F12 取凭证:用户自登后交 Cookie / 令牌 → 注入固化 → 兜底,必成。
> 阶段 5 · 校验与固化(不可省):回读 location.href 确认已离开 cas/login——禁止只看命令退出码(失败会被静默当成成功);固化登录态供复用;跨天 / 长期闲置失效属服务端会话时效,是预期行为、不是故障,届时重走阶段 4。
>
> 「为什么 / 坑 / 反例 / 归因」见本技能 references/faq.md(按症状定位到单条,不要从头读)。
4.1 五种方式对照
用友系站点共用用友统一认证 CAS(euc.* 域;主机由入口 302 决定、不得写死)。登录方式统一为五种,按「是否需要一次认证动作」分两类。
> 编号按【优先级从高到低】排列:① 复用已登录会话(免登录)> ② 账号密码自动填充 > ③ 二维码 > ④ 短信验证码 > ⑤ F12 取凭证。编号顺序即优先级,不再另行标注优先级。
| 编号·方式 | 谁操作 | 前提 | 说明 |
|---|---|---|---|
| ① 复用已登录会话(免登录) | 自动 | profile 内持久化的登录态仍有效(CAS 凭据为会话级:浏览器关闭即丢,跨天或长期闲置亦失效) | 登录一次后由 profile 持久化登录态复用;会话时效由服务端决定,过期则回退 ②/③/④ |
| ② 账号密码登录 | 我输入 | 用户提供账号密码 | 走 CAS「普通登录」;若弹出图形 / 行为验证码,无法自动跳过 |
| ③ 二维码扫码登录 | 我出码、用户扫码 | 用户手机装「友空间」App;驱动路径影响实现方式(MCP 天然长驻;CLI 须把出码与等待放进同一条命令,见下) | 走 CAS「二维码登录」;扫码授权不触发图形验证码,最稳;CLI 路径须单命令闭环(出码 + 轮询等扫) |
| ④ 短信验证码登录 | 我输入 | 用户自取验证码,提供手机号 + 验证码 | 走 CAS「短信登录」;同样可能被图形 / 行为验证码挡住 |
| ⑤ F12 取会话凭证 | 用户操作 | 用户自行网页登录后 F12 提供凭证 | 广义是 Cookie 或 Authorization / 验签头,本质「把登录态借给我」 |
4.2 选择原则(编号即优先级)
- 首选 ① 复用已登录会话(最省事,零交互)。
- 会话过期需重新登录时:优先 ② 账号密码自动填充(凭据取自本机配置文件;②/④ 仅当 CAS 未弹图形 / 行为验证码时可用);其次 ③ 二维码(无图形验证码干扰);⑤ 作为用户主动提供凭证的兜底。
- 无论哪种方式登录成功后,都要落到「用 playwright 独立 profile 的登录态」或「把凭证(cookie / token)交给脚本」,供后续复用。
- ③/④ 的通道依赖(回退前先判当前驱动路径):③ 二维码与 ④ 短信都需要「出码 / 发码 → 等人操作 → 页面自动跳转」这段跨时等待,要求浏览器实例在等待期间持续存活——MCP 路径下浏览器由宿主常驻,③④ 均可行;CLI 路径下浏览器的存续范围是发起它的那一条 Bash 命令,故 ③ 仍可行(把「出码 → 轮询等扫 → 校验落地 → 固化登录态」整段放进同一条命令:二维码截图落盘后呈现给用户,命令内循环等人工扫码——人工动作在手机端、无需回填浏览器),④ 一般不可行(其人工动作是把验证码回填进登录页,跨命令即丢会话;除非显式改用命名会话
playwright-cli -s=<唯一名>后台长驻承接)。故 ② 被验证码挡住后按路径选回退目标:MCP 路径 → ③ > ④ > ⑤;CLI 路径 → ③ > ⑤。判据是「人工动作发生在浏览器之外还是之内」,不是「哪个方式更稳」。
4.3 账号密码登录的本地存储约定(跨技能通用)
② 账号密码方法的通用实现:将凭据落本地配置文件,而非每次重输或硬编码进技能。
- 占位模板随包、真实凭据不进包:技能包内发布
config/*_config.example.json(< >占位符);真实账号密码写入本机config/*_config.json,该文件被.gitignore忽略、被打包白名单排除、绝不随包外发 / 提交 git、绝不硬编码进 SKILL.md / references / scripts。 - 首次缺失时索取并写入:配置缺失或仍为占位符时,向用户索取账号密码并写入本机配置文件;之后直接读取,不再重复索要。
- 具体文件名各技能自定:各技能用各自的
config/*_config.json(占位模板*_config.example.json随包、真实文件不进包)。
> 此约定是 ② 方法的通用实现纪律,由各技能落地;本技能(ikm)只沉淀口径、不绑定具体文件名、不收录任何真实凭据。
4.4 验证码的触发源与失败归因(跨技能通用)
- 触发源(已验 / 未验维度):图形 / 行为验证码由服务端风控按需下发——已验维度(客户端指纹:profile 全新空白 / 浏览器实体 Chromium→Edge / 设备类别 桌面→移动端)不是其触发源(实测三类变量全部变动,② 账号密码自动登录均一次通过、无验证码);未验维度为出口 IP / 网络位置、账号维度。登录页内验证码容器常驻但默认隐藏,故不能凭「页面上有验证码 / 滑块元素」判定被挡——须看它是否要求交互(出现「请依次点击 / 拖动滑块完成拼图」等提示)。旧表述「与客户端指纹无关」过强、易被读成「永远不会被挡」,已废止。
- 失败归因(先排账密、再判风控):错误账密的重试本身会诱发滑块,故出现「滑块 / 验证码」字样 ≠ 被风控拦——须先排除账密错误(看是否出现「账号或密码错误」等明确文案),再判风控;并不要在 ② 上反复重试(越试越易触发,会形成「账密错 → 出滑块 → 被判成风控」的闭环,归因彻底反向)。带
reason输出的登录实现须把两类原因分开、先判账密错误、后判风控,不得合并成单一值。
五、iKM 登录方式要点
优先级与其它用友系站点一致,不因平台另设例外:通则可直接套用统一口径的 ②/④ 仅当 CAS 未弹图形 / 行为验证码时可用(见 §4.1);③ 二维码 不触发该验证码。注意:③ 的「最稳 / 最省事」仅指其不受行为验证码干扰,属定性描述,不改变优先级排序——优先级一律以 §4.2「② > ③」为准。
六、二维码登录实操
> 两条路径均可实现,差别只在实现方式:扫码需要「出码 → 等人扫 → 页面自动跳转」这段跨时等待,依赖浏览器实例在等待期间持续存活——MCP 路径的浏览器由宿主常驻,天然满足;CLI 路径下浏览器只在本条 Bash 命令内存活,故须把「出码 → 轮询等扫 → 校验落地 → 固化登录态」整段放进同一条命令(二维码截图落盘呈现给用户、命令内循环等扫,人工动作在手机端、无需回填浏览器),本轮命令跑完即完成登录。若该路径下改走 ④ 短信则不可行(验证码要回填进登录页,跨命令即丢会话),见 §4.2 第 4 条。
browser_navigate→https://ikm.yonyou.com/,自动停在登录页(登录表单在嵌套 iframe 内,属用友 CAS)。browser_snapshot→ 找登录方式切换控件:普通登录/短信登录/二维码登录(三者并列)。browser_click→ 点「二维码登录」→ 页面出二维码。browser_take_screenshot截图 → 呈现给用户,提示用「友空间」App 扫一扫登录。- 用户扫码 → 页面自动跳转入库;
browser_snapshot确认登录成功(URL 离开/login)。 - 二维码有时效,超时需重取(重点「二维码登录」刷新二维码)。
> 注意:CAS 登录页是嵌套 iframe(title 形如 yonbip_login),playwright 控件 target 每次会话会变,须现读快照、禁止写死 id。
> 路径 B(CLI)的等价实操见 references/manual-steps.md §B。
>
> 路径 B 的效率铁律(CLI 冷启动):playwright-cli 单条约 3.5 s、open 冷启动约 15 s,-s= 复用不减免;多步批量流程一律合并进一次 run-code,勿逐条敲命令——本技能的「检索 → 批量下载 → 解析」属多步批量流程,故路径 B 把整段流程合并进一次 playwright-cli run-code --filename <流程文件>(见 references/manual-steps.md §B),冷启动只付一次。
七、登录后访问知识库
登录成功后进入 iKM 主页,按用户实际需求检索 / 浏览知识文档(检索词、领域等按当时需求)。检索结论是本次查询的运行产物,不写进本技能。
八、环境与操作纪律
playwright未信任(路径 A):MCP 工具不可用,先在连接器页信任;或切路径 B(CLI)照references/manual-steps.md§B。- 工具可用但返回
Browser is already in use for <profile>(profile 残留占用):通道本身可用,按references/manual-steps.md第 1 节清场后重试即可,不要判成「没有 MCP」;每轮收尾务必close,否则下一轮要为残留浏览器多付一段清场时间(详见references/faq.mdQ1.3 / Q3.3)。 - CAS 登录页 cookie 同意浮层拦截登录点击:登录页底部的 cookie 同意浮层(拒绝/同意)若不先关闭,会遮挡「登录」按钮、使
playwright-cli点击无效,自动登录静默失败、停在登录页。登录前先现读快照、点掉该浮层再点「登录」,并按落地 URL 轮询校验(遇验证码/行为验证即改用 ③二维码/⑤F12)。 - 禁止事项(操作纪律):
- 不为临时登录写一次性 CAS 脚本,登录统一走 Playwright(MCP 或 CLI);
- 不绕过 Playwright 直接裸开浏览器自动化;
- 不把账号密码 / cookie / token 硬编码进任何技能文件。
> 常见问题排查(FAQ)见 references/faq.md(含 profile 被占用等环境类问题)。
九、登录后检索、批量下载与解析文档(方法总览)
登录成功后,常需「按关键词检索文档 → 批量下载 → 解析大纲」。完整接口、参数、playwright 内下载代码范式、aspose 解析细节见 references/retrieve_download.md,此处只给要点与注意事项。
9.1 检索(取候选 + 下载 pk)
POST /assetdetail/searchAssetDetail,body{pageIndex:1, pageSize:50, searchTerm:'<关键词>'}。- 在已登录 playwright 会话内用
browser_evaluate(路径 A)或playwright-cli run-code+page.evaluate(...)(路径 B)打(cookie 自动带),不要用裸 HTTP 客户端。 - 返回
data.list(或rows/records)每条含pkKnowledgeDetail(下载主键)、title、filename。 - 候选清单按相关度 / 时间取前 N 份,由用户确认后再下载;不把具体 pk 写进技能。
9.2 批量下载(接口与写法)
GET /file/downloadFileSingle?pkDetatil=<pkKnowledgeDetail>&actionloctype=&actionlocid=&module=&moduleobjid=&moduleobjname=- 可选预校验
GET /file/checkExistDownloads?pkDetatil=<pk>→{"flag":"success"}表示可下载。 - 在 playwright 会话内用
browser_run_code_unsafe(路径 A)或playwright-cli run-code(路径 B):page.waitForEvent('download')+download.saveAs(...)。该环境无require/fetch,只用浏览器全局 API。 - 落盘后校验文件头:
docx→50 4B(PK)、doc(OLE2)→D0 CF 11 E0。 - 批量下载的两个必注意点(
module必填可空串、主键用pkKnowledgeDetail而非pkKnowledgeAsset)见references/faq.md。
9.3 解析(.doc / .docx 大纲)
- 统一用
aspose-words(同时支持.doc与.docx,python-docx 读不了.doc)。 - 必须用 WorkBuddy 托管的隔离 Python 环境运行(全局 python 无 aspose):即 skills 隔离 venv 的 python 解释器,路径随安装环境而定、不要写死本机绝对路径。
- 通用脚本见
scripts/doc_outline.py(参数化输入目录与输出路径,提取标题骨架 / 表 / 图 / 页眉页脚)。
9.4 一次成型与收尾
- 一次成型:检索 → 批量下载 → 解析在同一轮内做完,不逐轮往返;下载与解析结果只回传「文件路径 + 头校验结论 + 大纲摘要」,不把文档正文整段搬进上下文。
- 收尾只报结论:回报给出「检索命中数 / 下载份数 / 校验结果 / 大纲要点 / 产物路径」即可,不逐份复述正文。
十、出包前自检
本技能含 .package_allowlist.txt(本机凭据相关文件不进包)。出包前须按打包治理规范跑双检(结构自洽 + 发布合规)——自带白名单在打包与目录核对两种模式下均自动生效、无需显式传入;零 FAIL 才放行。
文件清单
yonyou-js-djw-ikm/
├── SKILL.md 本文件:维护边界 / 何时使用 / 驱动路由 / 登录方式统一口径 + 登录方式要点 + 二维码实操 + 检索下载解析总览 + 出包自检
├── config/
│ ├── ikm_config.example.json ② 账号密码登录的占位模板(随包)
│ └── ikm_config.json 本机真实配置(本机生成、含本地凭据;公开包不进包,自用包随包搬运)
├── references/
│ ├── workflow.md 必读层:路径速决(两条路径各在哪)+ 阅读顺序指针
│ ├── manual-steps.md 按需层(仅排错与定制时读):§A MCP 逐步(`1.`–`9.`)/ §B CLI 逐步(§B.0–§B.5)+ 快照读取要点
│ ├── retrieve_download.md 检索接口 / 批量下载接口 / aspose 解析 详细方法(含注意事项与代码范式)
│ ├── install_quickstart.md Playwright 快速安装说明(换源提速/装对包/内核镜像/离线复用/版本纪律)
│ └── faq.md 技能问题题库(试错归此,正文不重述)
├── scripts/
│ ├── doc_outline.py 通用 .doc/.docx 大纲提取器(须用隔离 Python 环境运行)
│ └── setup_cli.sh CLI 路径一键就绪(装 playwright-cli + 换源+镜像 + 生成 no-sandbox 配置;装包失败即 [FAIL] 退出,收尾做就绪自检)
├── .gitignore 排除敏感 / 重型文件;本机治理产物,不进包
└── .package_allowlist.txt 白名单:仅安全文件进包;本机治理产物,不进包