python请求库到github api - 对同一个url的不一致响应

时间:2017-10-04 13:39:12

标签: python git api curl

感谢任何帮助 - 第一次使用Django和Github API。我有一个简单的URL,我从repo的pull请求中获取api请求。我正在遍历它们到达我想要检查的diff_url属性。

在Chrome浏览器中,它工作正常,我正在显示拉动代码差异的文本输出。查看网络流量,网络呼叫将302给另一个包含令牌的URL。

隐身镀铬以及卷曲,我收到404错误。

我正在使用github3.py来获取拉模型,并请求(使用简单的身份验证)尝试从拉模型属性访问diff_url。

我想知道为什么浏览器可以工作,代码和curl都不会起作用。

这是Python代码:

def getAllPullRequestsForRepo(self, repo_name):
    ''' Return pull request and tag object for repository 
    Github: Every pull request is an issue, but not every issue is a pull request
    For each pull request = issue - get associated labels
    '''
    # TODO look at repo array to get repository (save as object)
    repoOwner = self.org_name + '/' + repo_name
    github = Github(self.username, self.password)
    repository = github.get_repo(repoOwner)
    pullDict = []
    pulls = repository.get_pulls('all')
    pullDatum = {}

    for pull in pulls:
        assigneeName = ''
        assigneeLogin = ''
        if pull.assignee:
            assigneeName = pull.assignee.name
            assigneeLogin = pull.assignee.login

        pullDatum = {
            'id': pull.id,
            'assignee': assigneeName,
            'assignee_login': assigneeLogin,
            'title': pull.title,
            'body': pull.body,
            'state': pull.state,
            'created': pull.created_at,
            'diff_url': pull.diff_url,
            'diff_content': '',
            'issues_url': pull.issue_url,
            'issues_content': '',
            'commits_url': pull.commits_url,
            'commits_content': '',               
        }

        # Get the code differences and load into diff data
        diff_url_data = requests.get(pull.diff_url, auth=(self.username, self.password))

1 个答案:

答案 0 :(得分:0)

我向github api伸出手,很高兴他们得到了很大的支持,很快就找到了解决这个问题的解决方案。谢谢伊万!以下是他们的答复,我希望能帮助其他人。

感谢您与我们联系。因此,失败的原因是diff_url指向github.com(网站)上的资源,而不是api.github.com(API)上的资源。请参阅此处的文档:

https://developer.github.com/v3/pulls/#get-a-single-pull-request

“diff_url”:“https://github.com/octocat/Hello-World/pull/1347.diff”,

由于API不提供资源,因此您无法使用API​​支持的身份验证机制(https://developer.github.com/v3/#authentication)。

网站和API不共享这样的身份验证机制 - 网站使用会话,API通过基本身份验证和令牌等使用无状态身份验证。

所以,这就是你能做的。你想为拉取请求获取差异,对吧?你也可以通过API获取它,如下所示:

https://developer.github.com/v3/pulls/#custom-media-types

换句话说,如果您在通过API获取拉取请求时在接受标头中包含特殊媒体类型 - 您将获得该拉取请求的原始差异。

这是一个卷曲的例子:

curl https://api.github.com/repos/rails/rails/pulls/30744 -H“接受:application / vnd.github.v3.diff”

希望这有帮助。

最佳, 伊万