Как скачать ресурс релиза GitHub из частного репозитория на python? - PullRequest
0 голосов
/ 06 ноября 2019

Я использую pygithub и получаю нужные ресурсы, которые хочу загрузить, но не могу понять, как их получить, потому что они находятся в частном хранилище. Я нашел похожие вопросы здесь и здесь , но я ищу решение Python (3.7).

Это код, который я использую для полученияинформация об активе, который я хочу:

from github import Github
g = Github('username', 'password')
asset = g.get_repo('user/repo').get_latest_release().get_assets()[0]
url = asset.browser_download_url

Теперь я могу проверить правильность url, посетив его в моем браузере (который уже вошел в GitHub) и загрузив правильный файлнемедленно начинается. Поскольку pygithub не имеет возможности загрузки ресурсов, я пытался использовать requests для достижения той же цели:

import requests
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
sess = requests.Session()
sess.auth = 'username', 'password'
response = sess.get(url, headers={'user-agent': user_agent})

И на этом этапе response всегда<Response [404]>. Поскольку я уверен, что URL-адрес работает нормально в моем браузере, я предполагаю, что мне чего-то не хватает в аутентификации с GitHub перед попыткой загрузки файла.

Буду признателен за любую помощь (даже если для этого нужны другие пакеты)

1 Ответ

1 голос
/ 07 ноября 2019

Я решил, что сначала получил «токен аутентификации» со страницы входа в GitHub, а затем опубликовал его:

import requests
from pathlib import Path
from github import Github
from bs4 import BeautifulSoup as bs

auth = 'username', 'password'
asset = Github(*auth).get_repo('user/repo').get_latest_release().get_assets()[0]
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
headers = {'user-agent': user_agent}
login_url = 'https://github.com/session'
session = requests.Session()
response = session.get(login_url, headers=headers)
authenticity_token = bs(response.text, 'lxml').find('input', attrs={'name': 'authenticity_token'})['value']
session.post(
    login_url,
    headers=headers,
    data=dict(
        commit='Sign in',
        utf8='%E2%9C%93',
        login=auth[0],
        password=auth[1],
        authenticity_token=authenticity_token
    )
)
# Now I'm logged in properly, I can download the private repository assets
response = session.get(asset.browser_download_url, headers=headers)
save_to = Path.home() / 'Downloads' / asset.name
save_to.write_bytes(response.content)
...