gitlab 获取所有用户有效期,权限等信息
#权限说明总结表格角色权限适用人群Guest创建 issue、发表评论不能读写版本库无Reporter克隆代码不能提交QA、PMDeveloper克隆代码、开发、提交、推送RDMaintainer维护项目、添加项目成员、编辑项目核心 RD 负责人Owner设置项目可见性、删除项目、迁移项目、管理组成员拥有所有权限。开发组 Leader10: Guest, 20: Reporter, 30: Developer, 40: Maintainer, 50: Owner####1.gitlab_permission_report.txt按项目维度输出用户权限到期时间2.soon_to_expire.txt输出用户到期时间少于30天3.user_projects.txt按用户维度显示所属项目及权限rootrke2-10-30:~/gitlabUserExpire# more getGitlabExpireUserMsg.py #!/usr/bin/python3 import requests import json from datetime import datetime, timedelta # GitLab API URL 和访问令牌 GITLAB_URL https://gitlab.umi.com/api/v4 PRIVATE_TOKEN glpat-X HEADERS {PRIVATE-TOKEN: PRIVATE_TOKEN} def fetch_all_projects(): 获取所有项目列表自动处理分页 page 1 projects [] while True: params { per_page: 100, page: page } response requests.get(f{GITLAB_URL}/projects, headersHEADERS, paramsparams) response.raise_for_status() current_page_projects response.json() if not current_page_projects: break projects.extend(current_page_projects) # 检查是否最后一页 if len(current_page_projects) 100: break page 1 return projects def fetch_project_members(project_id): 获取单个项目的所有成员信息包括继承成员 members_url f{GITLAB_URL}/projects/{project_id}/members/all response requests.get(members_url, headersHEADERS) if response.status_code 403: print(f项目 {project_id} 权限不足跳过) return [] response.raise_for_status() return response.json() def parse_date(date_str): 解析日期字符串 if date_str is None or date_str 永久有效: return None if T in date_str: # ISO 8601 格式 return datetime.strptime(date_str, %Y-%m-%dT%H:%M:%S.%fZ) else: # 简单日期格式 return datetime.strptime(date_str, %Y-%m-%d) def format_output(project, members): 格式化输出结果 output [] output.append(f项目名称: {project[name]}) output.append(f项目地址: {project[web_url]}) output.append(f最后活跃: {project[last_activity_at]}) output.append(\n成员列表:) output.append(f{用户名:15}{姓名:10}{权限等级:10}{到期时间:20}) output.append(- * 55) for member in members: expires_at member[expires_at] or 永久有效 access_level { 10: Guest, 20: Reporter, 30: Developer, 40: Maintainer, 50: Owner }.get(member[access_level], 未知) output.append( f{member[username]:15} f{member[name]:10} f{access_level:10} f{expires_at:20} ) return \n.join(output) def save_to_special_record(project, member): 保存到期时间在今天起30天内的用户信息和仓库到单独记录 expires_at parse_date(member[expires_at]) if expires_at is not None: today datetime.now() expires_in_one_month today timedelta(days30) if today expires_at expires_in_one_month: with open(soon_to_expire.txt, a) as f: f.write(f项目名称: {project[name]}\n) f.write(f项目地址: {project[web_url]}\n) f.write(f用户名: {member[username]}\n) f.write(f姓名: {member[name]}\n) f.write(f到期时间: {member[expires_at]}\n\n) def get_user_projects(all_projects, all_members): 获取用户的所有项目及权限含姓名 user_projects {} for project in all_projects: members fetch_project_members(project[id]) for member in members: username member[username] # 新增用户姓名字段 user_info { name: member[name], # 从API响应中获取姓名 projects: [] } if username not in user_projects: user_projects[username] user_info else: user_info user_projects[username] # 转换权限等级 access_level { 10: Guest, 20: Reporter, 30: Developer, 40: Maintainer, 50: Owner }.get(member[access_level], 未知) user_info[projects].append({ project_name: project[name], project_url: project[web_url], access_level: access_level }) return user_projects def main(): try: # 获取所有项目 all_projects fetch_all_projects() print(f发现 {len(all_projects)} 个项目) # 遍历处理每个项目 for project in all_projects: members fetch_project_members(project[id]) report format_output(project, members) # 输出到控制台并保存文件 print(\n *60) print(report) with open(gitlab_permission_report.txt, a) as f: f.write(report \n\n) # 保存到期时间在今天起30天内的用户信息 for member in members: save_to_special_record(project, member) # 获取用户所在的所有项目 user_projects get_user_projects(all_projects, []) # 输出或保存用户所在的项目信息 with open(user_projects.txt, w) as f: for username, data in user_projects.items(): f.write(f用户名: {username} ({data[name]})\n) # 新增姓名显示 for project in data[projects]: f.write(f - {project[project_name]} ({project[access_level]}): {project[project_url]}\n) f.write(\n) except requests.exceptions.HTTPError as e: print(fAPI 请求失败: {e.response.status_code} {e.response.text}) except Exception as e: print(f程序异常: {str(e)}) if __name__ __main__: main()执行python3 getGitlabExpireUserMsg.py

相关新闻

基于AI的爆款结构迁移引擎 部署说明文档

基于AI的爆款结构迁移引擎 部署说明文档

部署说明文档 系统要求 最低配置 CPU: 2核及以上内存: 4GB 及以上硬盘: 10GB 可用空间操作系统: Windows 10/Linux Ubuntu 20.04/macOS 12Python 版本: 3.9 ~ 3.12 推荐配置 CPU: 4核内存: 8GB硬盘: 50GB SSD网络: 可正常访问API服务 环境部署详细步骤 1. Python环境准备…

2026/7/23 22:05:10 阅读更多 →
海光 K100-AI (gfx928) 适配 YOLO26 推理 —— 逐步执行教程

海光 K100-AI (gfx928) 适配 YOLO26 推理 —— 逐步执行教程

海光 K100-AI (gfx928) 适配 YOLO26 推理 —— 逐步执行教程环境信息项目值DCU0,1: K100-AI架构gfx928DTK24.04.3HIP24.04.0步骤 1:环境已确认 — 三项检查通过 你执行了以下三条命令,已确认服务器环境: $ rocm-smiSystem Management Interfa…

2026/7/23 22:05:10 阅读更多 →
从“刷卡拥堵”到“秒级通行”:一张RFID电子校徽如何让校园管理有迹可循?

从“刷卡拥堵”到“秒级通行”:一张RFID电子校徽如何让校园管理有迹可循?

清晨7点30分,这往往是绝大多数中小学校园乃至高校一天中最繁忙的时刻。成百上千名学生如潮水般涌向校门,在传统的闸机前排起长龙。“滴——”伴随着一声声清脆却略显焦躁的刷卡声,学生们有的在翻找书包里的饭卡或学生证,有的因为卡…

2026/7/23 22:05:10 阅读更多 →

最新新闻

每日一Go-83、Cobra 使用实战:10 分钟打造专业级 CLI 工具

每日一Go-83、Cobra 使用实战:10 分钟打造专业级 CLI 工具

工程里 80% 的自动化,都可以用一个 CLI 工具解决。而 Go 生态里,Cobra 几乎是事实标准。 今天这篇「每日一 Go」,我们不讲概念、不背 API,只讲实战:从 0 到 1,手把手带你用 Cobra 打造一个生产可用的命令行…

2026/7/23 22:13:16 阅读更多 →
基于SpringBoot的医疗管理系统设计

基于SpringBoot的医疗管理系统设计

摘 要 当前医疗领域面临信息化转型压力,传统管理模式中数据分散、流程冗繁以及资源错配等问题日益严重,导致诊疗效率难以满足患者增长的需求。为了打破数据孤岛并优化就医流程,开发一套集成化、智能化的医疗管理系统显得尤为紧迫。该系统旨…

2026/7/23 22:13:16 阅读更多 →
2026 AIGV 商用落地指南:主流 AI 视频生成平台横向评测

2026 AIGV 商用落地指南:主流 AI 视频生成平台横向评测

一、前言:2026 企业 AI 视频商业化现状依据 2026 年 AIGC 影像行业调研数据,国内超 78% 市场部门、电商企业开始常态化使用 AI 视频工具制作营销素材;传统商业短视频单条外包成本 500–2000 元,采用 AI 生成可将成本压缩 70% 以上…

2026/7/23 22:13:16 阅读更多 →
基于智能体的英语课程问答微信小程序的设计

基于智能体的英语课程问答微信小程序的设计

摘 要 传统英语教学模式下答疑反馈存在明显的时空局限,学生在自主练习时遇到的知识盲点难以获得即时解答。随着移动互联网与人工智能技术的普及,开发一套能够提供全天候交互支持的数字化学习工具成为提升英语教学质量的迫切需求。 本项目设计并实现了…

2026/7/23 22:13:16 阅读更多 →
威廉顶底 同花顺期货通指标

威廉顶底 同花顺期货通指标

今天给大家带来是一款同花顺期货通指标,并且已经上架到同花顺期货通的指标广场上了。喜欢的朋友可以去指标广场安装试用!!友情提示:(指标只是辅助,不作建议)拼多多店铺:指标公式编写…

2026/7/23 22:13:15 阅读更多 →
基于YOLO与PySide6的植物病害检测系统开发指南

基于YOLO与PySide6的植物病害检测系统开发指南

1. 植物病害检测系统概述在农业生产中,植物病害是影响作物产量和品质的重要因素。传统的人工检测方法效率低下且依赖经验,而基于深度学习的视觉检测技术为解决这一问题提供了新思路。这个植物病害检测系统整合了YOLO系列算法的最新版本(v5-v8…

2026/7/23 22:12:13 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻