2016-07-01 1 views
0
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')) 

Это дает мнеМожет ли кто-нибудь дать python запрос на загрузку актива-релиза в github?

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

Где я буду неправильно?

+0

может быть ошибкой url, также может быть ошибкой auth согласно этой ссылке docs – nthall

ответ

2

Так я предварить это с советом, что если вы используете библиотеку, это так же просто, как:

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, вы можете также необходимо установить pyOpenSSL, pyasn1 и ndg-httpsclient от PyPI.

Я не уверен, что URL выглядит для случаев предприятия, но и для общественного GitHub, это выглядит следующим образом:

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

Таким образом, вы будете иметь, что, как url, плюс вы собираетесь для получения ваших учетных данных (в вашем случае вы, похоже, хотите использовать базовый auth). Тогда вы будете хотеть действительный медиа-типа в заголовках, например,

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

И ваш звонок будет выглядеть почти точно правильно:

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

Чтобы получить правильный URL, вы должны сделать:

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

Примечание это URITemplate. Вам нужно будет удалить шаблон или использовать библиотеку, например uritemplate.py, для ее анализа и использования для создания вашего URL-адреса для вас.

Последнее напоминание, github3.py (библиотека в оригинальном примере) заботится обо всем этом для вас.