繁体   English   中英

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

[英]How to download a GitHub release asset from a private repository in python?

我正在使用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

现在,我可以通过在我的浏览器(已经登录到 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 进行身份验证的一些内容。

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

我最终通过首先从 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)

我认为 Github 更新了 API 对用户身份验证的要求。 因此 Github('username', 'password') 不再用于获取有关私有存储库的信息。 相反,使用个人访问令牌 ( https://github.com/settings/tokens ) 并为您的应用程序生成一个。 这样,您也不必将登录数据保存在脚本中,这样更安全。

这稍微简化了代码。 我有一个下载数据并将其安全到路径并写入局部变量的示例。 但是我不知道如何将非基于文本的文件(如pickle)下载到局部变量。

import requests
import os
from github import Github
from io import StringIO
import pandas as pd
import logging
from pathlib import Path   

rawtoken = "githubtoken"
repository = "owner/reponame"

token = os.getenv('GITHUB_TOKEN', rawtoken)
g = Github(token)
headers = {'Authorization': 'token ' + rawtoken,
          'Accept': 'application/octet-stream'}
session = requests.Session()

# asset_one: arbitrary file for 
asset_one = g.get_repo(repository).get_latest_release().get_assets()[0]
response = session.get(r_regress.url, stream = True, headers=headers)
dest = Path() / "downloads" / asset_one.name
with open(dest, 'wb') as f:
    for chunk in response.iter_content(1024*1024): 
        f.write(chunk)

# second asset: pandas dataframe -> safe in variable df
asset_two = g.get_repo(repository).get_latest_release().get_assets()[1]
df_response = session.get(asset_two.url, headers=headers)
data = StringIO(df_response.text)
df = pd.read_csv(data)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM