首页 > 解决方案 > 通过 Bitbucket REST API 获取所有拉取请求评论

问题描述

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

Bitbucket REST API /评论文档

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

但这些参数究竟是什么?我觉得他们的描述一点用都没有。任何和所有的帮助将不胜感激!

标签: apibitbucket

解决方案


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

您可以通过/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 文档进行分页的,因此您必须做一些额外的工作来构建完整列表:设置一个令人讨厌的上限(脏)或继续发出请求,直到您获取所有内容。我强烈推荐后者。

您可以使用startlimit参数来控制获得的数据,您可以直接附加到 url(例如https://bla/asdasdasd/activity?start=25)或者 - 更干净 - 添加到paramsdict 中,如下所示:

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")])

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

最后,要按函数内部的操作进行过滤,您可以return values

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

推荐阅读