Sence
Solution
Read / Input
- 查阅官方文档可见,接口说明 👉 Create or update file contents
- 鉴权说明 👉 Authentication
Do / Output
申请 token 👉 Settings/Developer settings/Personal access tokens
- 填写必要参数, 勾选需要的权限后, 点击 Generate token
- 这里需要注意保存一下 token 值, 只会显示一次 , 如果忘了再创建一个即可
- github 会扫描 github 所有用户的 repo , 如果某个文件包含了 “token 值”,都会在此文件中清除掉 , 并在该 token 的持有者配置中 delete 掉该配置 , 就是上图选项 “Personal access tokens” 里
利用 Flask 实现一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43# github_pic_api.py
import base64
from app.api import pic
from flask import request
from flask import jsonify
from flask_cors import CORS
from app.service import github_commit_service
CORS(pic, supports_credentials=True) # 允许跨域请求
def upload_pic_to_github():
f = request.files.get('file') # 获取前端传输过来的文件对象
# 配置仓库参数
github_repo_config = {
"token": "x", # 申请得到的 token
"repo": "asscet", # 公开的仓库名
"owner": "cat", # 仓库的拥有者
"email": "cat@gmail.com", # 仓库拥有者的邮箱
"base_url": "https://api.github.com/repos/", # github 基础接口地址
"repo_path": "ccc/", # 公开的仓库里的目录位置
"file": f # 要操作的文件对象
}
# 配置本次提交的参数
commit_data = {
"message": "use github api commit at ", # 提交 message
"committer": {
"name": github_repo_config.get("owner"), # 提交者名称
"email": github_repo_config.get("email") # 提交者邮箱
},
"content": base64.b64encode(f.read()).decode('utf-8'), # 需要把文件对象 base64 加密再转成 String
}
# 配置请求头参数,用于鉴权
headers = {
"Authorization": 'token ' + github_repo_config.get("token"),
"Accept": "application/vnd.github.v3+json"
}
result = github_commit_service.commit_file(github_repo_config, commit_data, headers)
return jsonify(result)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37# github_commit_service.py
import json
import requests
def commit_file(grc, commit_data, headers):
repo_url = grc.get("base_url") \
+ grc.get("owner") + "/" \
+ grc.get("repo") + "/contents/" \
+ grc.get("repo_path") \
+ grc.get("file").filename
fin_result = {
"req": "",
"res": ""
}
try:
res = requests.put(repo_url, data=json.dumps(commit_data), headers=headers)
fin_result["res"] = bytes.decode(res.content)
except:
fin_result["req"] = "commit fail! unknown exception!"
return fin_result
else:
# print(result.get("req")) .get 如果 key 不存在 'req' 不会报错
# print(result["req"]) [] 如果 key 不存在 'req' 会报错
if res.status_code == 201:
fin_result["req"] = "commit success! great!"
return fin_result
elif res.status_code == 422:
# 422 状态码,可能该文件名已经存在仓库中
fin_result.get("req", "commit fail! content maybe exists!?")
return fin_result
else:
fin_result["req"] = "commit fail! check the res message."
return fin_result