通过 Bitbucket REST 获取所有拉取请求评论 API

Fetch All Pull-Request Comments Via Bitbucket REST API

这是根据 bitbucket 的文档检索特定拉取请求的评论的方法:

虽然我确实有拉取请求 ID 并设置了正确的格式 URL,但我仍然收到 400 响应错误。我可以发出 POST 评论请求,但无法发出 GET。进一步阅读后,我注意到为该端点列出的六个参数没有说 'optional'。看起来需要提供这些才能检索所有评论。

但是这些参数到底是什么?我发现他们的描述丝毫没有帮助。任何帮助将不胜感激!

fromHashtoHash 仅在 diffType 未设置为 EFFECTIVE 时才需要。 state 对我来说似乎也是可选的(不包括它时没有给我一个错误),并且 anchorState 指定要获取哪种评论 - 你可能想要 ALL 那里。据我了解,path 包含要从中读取注释的文件的路径。 (例如:src/a.py 和 src/b.py 已更改 -> 指定要为其中的哪些获取评论) 但是,这可能不是您想要的。我假设您想获取所有评论。

您可以通过 /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/activities 执行此操作,其中还包括评论等其他活动,因此您必须进行一些过滤。

我不会粘贴文档中的示例数据或我测试过一次的 bitbucket 实例,因为 json 响应很长。正如我所说,链接页面上有一个示例响应。我还认为你会弄清楚如何在下载后获得你想要的数据,因为这是一个问答论坛而不是“为我编程”页面 :b

作为一个小的快速入门:你可以像这样使用 curl

curl -u <your_username>:<your_password> https://<bitbucket-url>/rest/api/1.0/projects/<project-key>/repos/<repo-name>/pull-requests/<pr-id>/activities

这将打印响应 json。

使用 requests 模块的 curl 代码段的

Python 版本:

import requests

url = "<your-url>"  # see above on how to assemble your url
r = requests.get(
    url,
    params={},  # you'll need this later
    auth=requests.auth.HTTPBasicAuth("your-username", "your-password")
)

请注意,结果是根据 api documentation 分页的,因此您必须做一些额外的工作来构建完整列表:要么设置一个令人讨厌的高限制(脏),要么继续发出请求直到你已经拿走了一切。我强烈推荐后者。

您可以使用 startlimit 参数控制获取哪些数据,您可以直接将这些参数附加到 url(例如 https://bla/asdasdasd/activity?start=25)或 - 更多干净地-像这样添加到 params 字典:

requests.get(
    url,
    params={
        "start": 25,
        "limit": 123
    }
)

综合起来:

def get_all_pr_activity(url):
    start = 0
    values = []
    while True:
        r = requests.get(url, params={
            "limit": 10,  # adjust this limit to you liking - 10 is probably too low
            "start": start
        }, auth=requests.auth.HTTPBasicAuth("your-username", "your-password"))
        values.extend(r.json()["values"])
        if r.json()["isLastPage"]:
            return values
        start = r.json()["nextPageStart"]


print([x["id"] for x in get_all_pr_activity("my-bitbucket-url")])

将打印 activity 个 ID 列表,例如[77190, 77188, 77123, 77136] 等等。当然,您可能不应该在那里硬编码您的用户名和密码 - 这只是一个例子,而不是生产就绪代码。

最后,要按函数内的操作进行过滤,您可以将 return values 替换为类似

的内容
return [activity for activity in values if activity["action"] == "COMMENTED"]