ai_member_xiaokui/memory/2026-04-02-openid-fix.md
2026-04-03 08:30:01 +08:00

5.5 KiB
Raw Blame History

Session: 2026-04-02 04:30:09 UTC

  • Session Key: agent:xiaokui:feishu:direct:ou_088ee79216826be4a24af44f7268f880
  • Session ID: f349d404-f8a9-45e4-81cd-a55e9b4fc8f4
  • Source: feishu

Conversation Summary

assistant: 遇到了跨应用 open_id 的问题。这说明张昆鹏在 USER.md 中记录的 open_id 是另一个应用下的。我需要先用小葵自己的应用身份查找张昆鹏的 open_id assistant: 搜索用户只支持 user 身份。让我换个思路,用 bot 身份直接获取用户信息,或者用消息上下文中当前发送者的 open_id 来间接定位。

让我先查看小葵应用自己能获取到的信息: assistant: 当前发送者的 open_id ou_088ee79216826be4a24af44f7268f880 也可能是另一个应用的。问题的核心在于 open_id 是跨应用不通用的。

让我用 feishu_search_user 工具(它是当前飞书插件提供的)来获取张昆鹏在当前上下文的信息: assistant: 用户身份的 API 需要授权。不过既然目标是用 Bot 身份发消息,我应该直接用 Bot 的凭证来查找张昆鹏。让我看看 lark-cli 的原始 API 调用方式: assistant: 确认了——USER.md 中的 open_id 是在另一个飞书应用下生成的,与小葵的应用不通用。我需要用其他方式获取张昆鹏在小葵应用下的 open_id。

可以通过邮箱或手机号来查: assistant: lark-cli 的 contact 命令有限。让我试试直接用当前消息上下文里的发送者 open_id 给他自己发消息验证 bot 是否能发消息,同时用另一种方式找到张昆鹏——通过飞书 API 的 batch_get_id assistant: Bot 身份发消息成功了!当前用户的 open_id ou_088ee79216826be4a24af44f7268f880 在小葵的应用下是有效的。

现在需要找到张昆鹏在小葵应用下的 open_id。USER.md 中的 ou_978d9e5c3ee53e6b8a9b68d37cad545f 是跨应用无效的。让我通过 lark-cli 直接调用飞书原始 API 来搜索: assistant: 搜索 API 需要 user_access_tokenbot 身份不行。让我换一种方式——用 bot 可用的通讯录 API assistant: 我不知道张昆鹏的邮箱。不过还有一种方法——通过小葵所在的群找到张昆鹏。让我看看小葵和张昆鹏是否在同一个群中(比如 AI_member 群): assistant: 找到了!在小葵应用下,张昆鹏的 open_id 是 ou_db6ae9aca715cd47cef77ab565eba596。现在用 Bot 身份给他发消息: assistant: 已成功以 Bot 身份给张昆鹏发送了一条测试消息

总结:

  • 使用 lark-cli im +messages-send 以小葵的应用Bot身份发送
  • 消息内容:你好张昆鹏这是一条来自小葵Bot身份的测试消息 🌻
  • 张昆鹏那边会看到这条消息来自"小葵"应用

过程中发现一个问题: USER.md 中记录的张昆鹏 open_idou_978d9e5c3ee53e6b8a9b68d37cad545f)和小葵应用下的 open_idou_db6ae9aca715cd47cef77ab565eba596)不一致,说明 USER.md 中的 open_id 来自另一个飞书应用。如果后续需要用 Bot 身份操作,需要使用小葵应用下的 open_id。要不要我更新 USER.md 或记录下这个映射关系? user: System: [2026-04-02 11:18:48 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53ea4fb1d0acb22ba0b4cbd9658]

Conversation info (untrusted metadata):

{
  "message_id": "om_x100b53ea4fb1d0acb22ba0b4cbd9658",
  "sender_id": "ou_088ee79216826be4a24af44f7268f880",
  "sender": "ou_088ee79216826be4a24af44f7268f880",
  "timestamp": "Thu 2026-04-02 11:18 GMT+8"
}

Sender (untrusted metadata):

{
  "label": "ou_088ee79216826be4a24af44f7268f880",
  "id": "ou_088ee79216826be4a24af44f7268f880",
  "name": "ou_088ee79216826be4a24af44f7268f880"
}

很棒! 两个问题: 1. 如果 给你一个 你不在其中的飞书群聊 你能看到群里有哪些人 进而查到 open id 吗 2. 是否有办法 获取到用户的唯一id 所有的 bot 都基于这个 唯一id 来给对应的用户发消息 assistant:

两个好问题,我分别回答:

1. 不在群中能否查到群成员?

不能。飞书 API 的 获取群成员列表 接口要求调用者Bot 或用户必须是该群的成员。如果小葵不在那个群里API 会返回权限错误。

刚才能查到张昆鹏,正是因为小葵在 AI_member 群里。

2. 是否有跨应用的唯一用户 ID

有,飞书提供了两个层级的 ID

ID 类型 作用域 说明
open_id 单个应用 每个应用看到的同一用户 open_id 不同(刚才踩的坑)
union_id 同一开发者下的所有应用 如果多个 Bot 属于同一个开发者union_id 是一致的
user_id 租户级别 企业内部的员工 ID所有应用通用但需要通讯录权限

推荐方案:用 user_id(员工 ID作为统一标识。

所有 Bot 都可以通过 user_id 来发消息,只需要把 receive_id_type 设为 user_id 即可。

我来验证一下能否获取到张昆鹏的 user_id assistant: 拿到了。再验证一下用 user_id 发消息是否可行: assistant: 验证成功

结论:

user_id 是租户级别的唯一标识,所有 Bot 都可以用它发消息。对应关系:

姓名 user_id 说明
李若松 4aagb443
张昆鹏 7f5cd711

建议方案: 在 USER.md 中统一用 user_id 作为主标识,各 Bot 发消息时指定 receive_id_type=user_id,这样就不用每个 Bot 单独维护一份 open_id 映射了。

要我现在更新 USER.md 吗?