飞书客户端界面(电脑 / 手机)不能直接手动把机器人设为群管理员,只能通过开放平台 API 接口把**应用机器人(自建应用,不是 Webhook 自定义机器人)**设置成群管理员,只有群主可以调用接口执行这个操作。
一、前置条件
- 当前调用身份,必须是这个群的群主;对于外部群来说,群主必须是某个飞书真人帐号;
- 自建应用已开启【机器人能力】,且机器人已经加入这个群
- 应用权限:申请
im:resource(获取和更新群信息、添加移除群管理员)权限; - 获取:
chat_id(群 ID)、机器人的open_id; - 机器人使用
app_id作为 manager_ids,不是 open_id(这是最容易踩坑点!);
二、关键几个参数
APP_ID / APP_SECRET:飞书开放平台 → 自建应用 → 凭证与基础信息;CHAT_ID:飞书群内,打开群设置,拉到最下方获取会话 ID,格式oc_xxxx;BOT_APP_ID:就是自建应用的 AppID;
三、开放平台配置
- 自建应用 → 安全设置 → 添加重定向 URL:
http://127.0.0.1:8080/callback - 权限管理申请权限:
- 飞书开放平台 → 你的自建应用 → 权限管理 → 添加权限;
- 搜索:
im:chat.managers:write_only(添加、删除群管理员),添加; - 提交审批,企业管理员审批通过(必须审批!);
- 机器人已经加入目标飞书群;
- 打开浏览器访问 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日,文章初稿;研究飞书推送消失时,用豆包生成的代码;
