如何从python中的私有存储库下载GitHub发布资产?

2024-04-19 19:05:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pygithub并获取想要下载的适当资产,但我不知道如何实际获取它们,因为它们位于私有存储库中。我发现了类似的问题herehere,但我正在寻找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

现在,我可以通过在我的浏览器(已经登录到GitHub)中访问它来验证url是否正确,并且立即开始下载正确的文件。因为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进行身份验证的信息。你知道吗

任何帮助都将不胜感激(即使它需要安装其他软件包)


Tags: importgithub信息urlgethereusernamepassword
1条回答
网友
1楼 · 发布于 2024-04-19 19:05:04

我首先从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)

相关问题 更多 >