You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在可从Bitbucket拉取指定信息的Python代码?

Python拉取Bitbucket指定数据实现方案

可以直接用成熟的Python库对接Bitbucket接口拉取你需要的所有数据,不需要从零手写HTTP请求逻辑,具体实现如下。

依赖安装

执行以下命令安装对接用的开源库:
pip install atlassian-python-api

可覆盖的获取字段

  • 图纸编号:通过匹配Commit备注、PR标题/描述中符合你们命名规则的编号提取,如果编号存在仓库自定义属性中,可在拿到基础数据后追加字段拉取
  • 全量Commit记录:包含Commit哈希、提交备注、提交人、提交时间、关联变更内容
  • 全量Pull Request记录:包含PR编号、标题、描述、状态、创建/合入时间、关联Commit列表
  • 创建人信息:包含账号ID、显示名称、公开邮箱(权限范围内可获取)

可直接运行的参考代码

import re
import time
from atlassian import Bitbucket

# -------------------------- 配置项 按需修改 --------------------------
# Bitbucket Cloud 初始化配置
bitbucket = Bitbucket(
    url='https://api.bitbucket.org/',
    username='你的Bitbucket登录用户名',
    password='你的Bitbucket App专用密码(在账号安全设置中生成,不要用日常登录密码)'
)
WORKSPACE = '目标仓库所属工作空间名'
REPO_NAME = '目标仓库名'
# 图纸编号匹配正则,按你们实际的编号规则修改,示例为匹配DRAW-开头+层级数字的编号格式
DRAWING_NO_PATTERN = re.compile(r'DRAW-\d{3,}-\d{2,}')
# 分页拉取的单页大小,不建议调太大避免触发接口限制
PAGE_LIMIT = 50
# 拉取间隔 单位秒,数据量大的时候建议保留避免限流
REQUEST_INTERVAL = 1
# --------------------------------------------------------------------

def get_all_commits():
    """分页拉取仓库全量Commit记录"""
    all_commits = []
    page_start = 0
    while True:
        resp = bitbucket.get_commits(
            workspace=WORKSPACE,
            repo_slug=REPO_NAME,
            start=page_start,
            limit=PAGE_LIMIT
        )
        commit_list = resp.get('values', [])
        if not commit_list:
            break
        for commit in commit_list:
            # 从提交备注中提取关联的图纸编号
            match_draw_nos = DRAWING_NO_PATTERN.findall(commit.get('message', ''))
            # 提取提交人信息
            author_info = commit.get('author', {})
            commit_data = {
                'commit_hash': commit['hash'],
                'commit_msg': commit.get('message', ''),
                'author_name': author_info['user']['display_name'] if author_info.get('user') else author_info.get('raw', '未知提交人'),
                'author_account': author_info['user']['nickname'] if author_info.get('user') else '',
                'create_time': commit['date'],
                'related_drawing_nos': list(set(match_draw_nos))
            }
            all_commits.append(commit_data)
        page_start += PAGE_LIMIT
        time.sleep(REQUEST_INTERVAL)
        if len(commit_list) < PAGE_LIMIT:
            break
    return all_commits

def get_all_pull_requests():
    """分页拉取仓库全量状态的PR记录"""
    all_prs = []
    page_start = 0
    while True:
        resp = bitbucket.get_pull_requests(
            workspace=WORKSPACE,
            repo_slug=REPO_NAME,
            start=page_start,
            limit=PAGE_LIMIT,
            state=''  # 传空值拉取所有状态的PR,可按需指定为OPEN/MERGED/DECLINED
        )
        pr_list = resp.get('values', [])
        if not pr_list:
            break
        for pr in pr_list:
            # 从PR标题和描述中提取关联图纸编号
            pr_content = pr.get('title', '') + '\n' + pr.get('description', '')
            match_draw_nos = DRAWING_NO_PATTERN.findall(pr_content)
            # 拉取当前PR关联的所有Commit
            pr_commits_resp = bitbucket.get_pull_request_commits(
                workspace=WORKSPACE,
                repo_slug=REPO_NAME,
                pull_request_id=pr['id']
            )
            pr_data = {
                'pr_id': pr['id'],
                'pr_title': pr.get('title', ''),
                'pr_desc': pr.get('description', ''),
                'creator_name': pr['author']['display_name'],
                'creator_account': pr['author']['nickname'],
                'create_time': pr['created_on'],
                'pr_status': pr['state'],
                'related_drawing_nos': list(set(match_draw_nos)),
                'related_commit_hashs': [c['hash'] for c in pr_commits_resp.get('values', [])]
            }
            all_prs.append(pr_data)
        page_start += PAGE_LIMIT
        time.sleep(REQUEST_INTERVAL)
        if len(pr_list) < PAGE_LIMIT:
            break
    return all_prs

if __name__ == '__main__':
    total_commits = get_all_commits()
    total_prs = get_all_pull_requests()
    # 后续可自行添加存储到CSV/数据库的逻辑
    print(f"拉取完成,共获取{len(total_commits)}条Commit记录,{len(total_prs)}条PR记录")

适配说明

  • 如果使用公司自建的Bitbucket Server/Data Center版本,初始化客户端时将url参数替换为自建站点的访问地址,认证信息替换为个人访问令牌即可,核心拉取逻辑基本一致,仅少量接口参数名需要根据库的提示调整
  • 代码里的图纸编号匹配正则需要根据你们实际的编号规则修改,比如编号是TZ-2024-XXXX格式,就把正则改成对应匹配规则
  • 所用账号需要拥有目标仓库的读取权限,否则会拉取失败或者拿不全用户相关字段

内容的提问来源于stack exchange,提问作者davidk3698

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:06:22