【问题标题】:Can someone give a python requests example of uploading a release asset in github?有人可以给出在 github 中上传发布资产的 python 请求示例吗?
【发布时间】:2016-11-04 08:07:20
【问题描述】:
url = 'https://github.abc.defcom/api/v3/repos/abc/def/releases/401/assets?name=foo.sh'
r = requests.post(url, headers={'Content-Type':'application/binary'}, data=open('sometext.txt','r'), auth=('user','password'))

这是给我的

>>> r.text
u'{"message":"Not Found","documentation_url":"https://developer.github.com/enterprise/2.4/v3"}'

我哪里错了?

【问题讨论】:

  • 可能是 url 错误,也可能是根据该文档链接的身份验证错误

标签: python github github-api


【解决方案1】:

因此,我将在此之前提出建议,如果您使用库,它就像:

from github3 import GitHubEnterprise

gh = GitHubEnterprise(token=my_token)
repository = gh.repository('abc', 'def')
release = repository.release(id=401)
asset = release.upload_asset(content_type='application/binary', name='foo.sh', asset=open('sometext.txt', 'rb'))

考虑到这一点,我还会在前面加上“应用程序/二进制”不是真正的媒体类型(请参阅:https://www.iana.org/assignments/media-types/media-types.xhtml

接下来,如果您read the documentation,您会注意到 GitHub 需要具有真实 SNI(服务器名称指示)的客户端,因此根据您的 Python 版本,您可能还需要安装pyOpenSSLpyasn1ndg-httpsclient 来自 PyPI。

我不确定企业实例的 URL 是什么样的,但对于公共 GitHub,它看起来像:

https://uploads.github.com/repos/octocat/Hello-World/releases/1/assets?name=foo.sh

因此,您将拥有 url,并且您将需要您的身份验证凭据(在您的情况下,您似乎想要使用基本身份验证)。然后你会想要一个 valid 在标题中的媒体类型,例如,

headers = {'Content-Type': 'text/plain'}

而且你的调用看起来几乎完全正确:

requests.post(url, headers=headers, data=open('file.txt', 'rb'), auth=(username, password))

要获得正确的网址,您应该这样做:

release = requests.get(release_url, auth=(username, password))
upload_url = release.json().get('upload_url')

注意这是一个 URITemplate。您需要删除模板或使用 uritemplate.py 之类的库来解析它并使用它为您构建 URL。

最后提醒一下,github3.py(原始示例中的库)会为您处理所有这些。

【讨论】:

    【解决方案2】:

    没有任何外部依赖的 APIv3 上传示例

    用法:

    GITHUB_TOKEN=<token> ./create-release username/reponame <tag-name> <path-to-upload>
    

    脚本:

    #!/usr/bin/env python3
    
    import json
    import os
    import sys
    
    from urllib.parse import urlencode
    from urllib.request import Request, urlopen
    
    repo = sys.argv[1]
    tag = sys.argv[2]
    upload_file = sys.argv[3]
    
    token = os.environ['GITHUB_TOKEN']
    
    url_template = 'https://{}.github.com/repos/' + repo + '/releases'
    
    # Create.
    _json = json.loads(urlopen(Request(
        url_template.format('api'),
        json.dumps({
            'tag_name': tag,
            'name': tag,
            'prerelease': True,
        }).encode(),
        headers={
            'Accept': 'application/vnd.github.v3+json',
            'Authorization': 'token ' + token,
        },
    )).read().decode())
    release_id = _json['id']
    
    # Upload.
    with open(upload_file, 'br') as myfile:
        content = myfile.read()
    _json = json.loads(urlopen(Request(
        url_template.format('uploads') + '/' + str(release_id) + '/assets?' \
          + urlencode({'name': os.path.split(upload_file)[1]}),
        content,
        headers={
            'Accept': 'application/vnd.github.v3+json',
            'Authorization': 'token ' + token,
            'Content-Type': 'application/zip',
        },
    )).read().decode())
    

    任何语言的超集问题:How to release a build artifact asset on GitHub with a script?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多