赞
踩
github作为一个稳定的代码托管库其实是可以当做免费数据中转站使用,实现数据的存储、自动更新、访问等等。
更为可喜的是,目前有现成的python库完成了github api的封装,我们直接使用 已经封装好的库就可以了。
本人使用的是:Pygithub, 项目使用文档:https://pygithub.readthedocs.io/en/latest/introduction.html
这个方法也可以用来做github的爬虫,自动化访问github的公开项目的内容。
pip3 install pygithub
要使用github API,首先需要拥有github的账号,或者github的access token。github账号密码是比较好获取的,但是这个不安全,很容易不小心把用户名密码泄露给其他人;因此,我们还是推荐使用access token来访问gitHub API,而且这个 access_token也好管理。
首先进入github的设置界面,点击“Developper setting”
然后选择 personal access token,
点击“Generate new token”,创建新的access_token。
选择所需的权限,然后给它起个名字,这里我们就只选择代码仓库的全部权限。
选择好后点击最下面的生成按钮,然后就可以看到生成的access_token了。
把这个access_token保存好,再次刷新github后这个串就不再显示了,如果遗忘的话只能重新申请了。
__author__ = 'jmh081701'
from github import Github
import config
git = Github(login_or_token=config.config['access_token'])
##得到指定仓库
repo = git.get_repo("jmhIcoding/datastore")
##输出仓库的一些信息
##输出主题
print(repo.get_topics())
##显示这个仓库的stars数目
print(repo.stargazers_count)
contents= repo.get_contents(path="README.md")
如果文件不存在,执行这个函数会抛出异常:
github.GithubException.UnknownObjectException: 404 {"message": "Not Found", "documentation_url": "https://docs.github.com/rest/reference/repos#get-repository-content"}
否则,返回是一个github.ContentFile.ContentFile
对象。
这个对象里面的一些重要的方法和属性:
属性名 | 含义 |
---|---|
type | 文件类型,取值:file或dir |
size | 文件大小 |
name | 文件名 |
path | 文件的路径 |
content | 文件内容,被base64编码后的结果 |
decoded_content | 文件内容,经过base64解码后的结果 |
download_url | 文件的下载链接 |
访问一下:
print(contents.type)
print(contents.size)
print(contents.name)
print(contents.path)
print(contents.content)
print(contents.decoded_content)
print(contents.download_url)
输出结果:
file
40
README.md
README.md
IyBkYXRhc3RvcmUK5Z+65LqOZ2l0aHVi55qE5pWw5o2u5Lit6L2sCg==
b'# datastore\n\xe5\x9f\xba\xe4\xba\x8egithub\xe7\x9a\x84\xe6\x95\xb0\xe6\x8d\xae\xe4\xb8\xad\xe8\xbd\xac\n'
https://raw.githubusercontent.com/jmhIcoding/datastore/main/README.md?token=AESR3WOCTZT5A4OAY5637W27TDPYK
如果文件的内容是中文的话,base64解码后,注意使用utf在解码一次。
print(base64.b64decode(contents.content).decode('utf8'))
输出:
# datastore
基于github的数据中转
填上文件路径path,提交的信息:message,和内容就可以了。
注意message最好不要有空格
repo.create_file(path="test.txt",message="commit_msg",content='test content')
执行后,我们看到仓库已经有这个文件了:
另外 文件路径,不支持新建文件夹。
先获取文件,然后再调用update_file函数。
content = repo.get_contents('test.txt')
repo.update_file(path=content.path,message='update_msg',content='new content',sha=content.sha)
注意里面的sha参数,使用content.sha来获取,这个sha填被替换文件的哈希值,这是在做进一步的确认。
先获取文件,再删除
content = repo.get_contents("text.txt")
repo.delete_file(path=content.path,message='delete',sha=content.sha)
上面的get_contents函数,都可以接“ref”参数,这个参数的作用是指明这个文件是那个分支、tag的, 默认是master分支。
The name of the commit/branch/tag. Default: the repository’s default branch (usually master)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。