飞书中,如何设置机器人为群管理员?

飞书客户端界面(电脑 / 手机)不能直接手动把机器人设为群管理员,只能通过开放平台 API 接口把**应用机器人(自建应用,不是 Webhook 自定义机器人)**设置成群管理员,只有群主可以调用接口执行这个操作。

一、前置条件

  1. 当前调用身份,必须是这个群的群主;对于外部群来说,群主必须是某个飞书真人帐号;
  2. 自建应用已开启【机器人能力】,且机器人已经加入这个群
  3. 应用权限:申请 im:resource(获取和更新群信息、添加移除群管理员)权限;
  4. 获取:chat_id(群 ID)、机器人的open_id;
  5. 机器人使用 app_id 作为 manager_ids,不是 open_id(这是最容易踩坑点!);

二、关键几个参数

  1. APP_ID / APP_SECRET:飞书开放平台 → 自建应用 → 凭证与基础信息;
  2. CHAT_ID:飞书群内,打开群设置,拉到最下方获取会话 ID,格式 oc_xxxx;
  3. BOT_APP_ID:就是自建应用的 AppID;

三、开放平台配置

  1. 自建应用 → 安全设置 → 添加重定向 URL:http://127.0.0.1:8080/callback
  2. 权限管理申请权限:
    • 飞书开放平台 → 你的自建应用 → 权限管理 → 添加权限;
    • 搜索:im:chat.managers:write_only(添加、删除群管理员),添加;
    • 提交审批,企业管理员审批通过(必须审批!);
  3. 机器人已经加入目标飞书群;
  4. 打开浏览器访问 http://127.0.0.1:8080 ,由【这个群的群主本人】完成飞书授权登录;

四、完整代码

以下代码,实现了添加机器人为群管理员,以及移除机器人为管理员。

import requests
import json
from flask import Flask, request, redirect

# ====================== 【请修改这里的配置】 ======================
APP_ID = "cli_xxxxxxxxxxxx"        # 自建应用 AppID
APP_SECRET = "xxxxxxxxxxxxxxxx"    # 自建应用 AppSecret
REDIRECT_URI = "http://127.0.0.1:8080/callback"
CHAT_ID = "oc_xxxxxxxxxxxx"        # 目标群 chat_id(下划线oc_)
BOT_APP_ID = "cli_xxxxxxxxxxxx"    # 机器人AppID
BASE_API = "https://open.feishu.cn/open-apis" # 国内飞书
# =================================================================

app = Flask(__name__)


def add_bot_as_group_admin(user_access_token: str, chat_id: str, bot_app_id: str):
    """将机器人设置成群管理员【修复正确路径 add_managers】"""
    url = f"{BASE_API}/im/v1/chats/{chat_id}/managers/add_managers?member_id_type=app_id"
    headers = {
        "Authorization": f"Bearer {user_access_token}",
        "Content-Type": "application/json"
    }
    payload = {
        "manager_ids": [bot_app_id]
    }
    resp = requests.post(url, headers=headers, json=payload)
    print("\n===== add 状态码 =====", resp.status_code)
    print("===== add 原始文本 =====", resp.text)
    try:
        ret = resp.json()
    except Exception as e:
        print(f"❌ JSON解析失败:{e}")
        return None
    print("\n======== 【添加机器人群管理员】返回结果 ========")
    print(json.dumps(ret, ensure_ascii=False, indent=2))
    if ret.get("code") == 0:
        print("✅ 添加成功")
    else:
        print(f"❌ 添加失败 code={ret.get('code')} msg={ret.get('msg')}")
    return ret


def remove_bot_as_group_admin(user_access_token: str, chat_id: str, bot_app_id: str):
    """移除机器人群管理员身份【修复正确路径 delete_managers】"""
    url = f"{BASE_API}/im/v1/chats/{chat_id}/managers/delete_managers?member_id_type=app_id"
    headers = {
        "Authorization": f"Bearer {user_access_token}",
        "Content-Type": "application/json"
    }
    payload = {
        "manager_ids": [bot_app_id]
    }
    resp = requests.post(url, headers=headers, json=payload)
    print("\n===== remove 状态码 =====", resp.status_code)
    print("===== remove 原始文本 =====", resp.text)

    try:
        ret = resp.json()
    except Exception as e:
        print(f"❌ JSON解析失败:{e}")
        return None

    print("\n======== 【移除机器人群管理员】返回结果 ========")
    print(json.dumps(ret, ensure_ascii=False, indent=2))
    if ret.get("code") == 0:
        print("✅ 移除成功,机器人变为普通群成员")
    else:
        print(f"❌ 移除失败 code={ret.get('code')} msg={ret.get('msg')}")
        code = ret.get("code")
        if code == 230001:
            print("提示:调用者不是群主")
        elif code == 230005:
            print("提示:该机器人本来就不是群管理员,无需移除")
        elif code == 99991679:
            print("提示:权限scope不足,确认im:chat.managers:write_only已审批并且重新授权")
    return ret


@app.route("/")
def login():
    auth_host = "https://accounts.feishu.cn/open-apis/authen/v1/authorize"
    auth_url = (
        f"{auth_host}"
        f"?client_id={APP_ID}"
        f"&response_type=code"
        f"&redirect_uri={REDIRECT_URI}"
        f"&scope=im:chat.managers:write_only"
    )
    return redirect(auth_url)


@app.route("/callback")
def callback():
    code = request.args.get("code")
    if not code:
        return "<h2>获取授权code失败</h2>"

    token_url = f"{BASE_API}/authen/v1/access_token"
    body = {
        "grant_type": "authorization_code",
        "code": code,
        "app_id": APP_ID,
        "app_secret": APP_SECRET
    }
    resp = requests.post(token_url, json=body)
    token_resp = resp.json()

    if token_resp.get("code") != 0:
        return f"<h2>换取token失败</h2><pre>{json.dumps(token_resp, ensure_ascii=False, indent=2)}</pre>"

    data = token_resp["data"]
    user_access_token = data["access_token"]
    refresh_token = data["refresh_token"]
    expires_in = data["expires_in"]

    print("\n======== 获取到用户token ========")
    print(f"user_access_token: {user_access_token}")
    print(f"refresh_token: {refresh_token}")
    print(f"有效期(秒): {expires_in}")

    # ============在这里切换你要执行的动作============
    # add_bot_as_group_admin(user_access_token, CHAT_ID, BOT_APP_ID)  # 添加管理员
    remove_bot_as_group_admin(user_access_token, CHAT_ID, BOT_APP_ID)   # 移除管理员

    html = f"""
    <h2>执行完毕,请查看控制台输出</h2>
    <pre>user_access_token:{user_access_token}</pre>
    """
    return html


if __name__ == "__main__":
    print("===================== 服务启动 =====================")
    print("BASE_API:", BASE_API)
    print("访问: http://127.0.0.1:8080")
    print("⚠️  使用群群主账号授权登录")
    print("⚠️  scope权限 im:chat.managers:write_only 需要审批通过")
    print("====================================================")
    app.run(host="127.0.0.1", port=8080, debug=False)

五、常见错误排查

  • code:230001:不是群主!只有群主能调用添加管理员接口;
  • code:230004:机器人不在群里,先把机器人拉进群;
  • code:10012:权限没申请,去开放平台申请 im:resource;
  • code:200012:ID 类型错误,机器人必须用 member_id_type=app_id,不能填 open_id;

2026年10月04日,文章初稿;研究飞书推送消失时,用豆包生成的代码;

给TA打赏
共{{data.count}}人
人已打赏
Obsidian应用

Note Publisher使用手册

2026-6-2 15:14:01

Obsidian应用

Note Publisher使用手册

2026-6-2 15:14:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
❯
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索