Use Github Api Commit

Sence

  • 使用 github 提供的 API 操作 repo
  • 之后可利用该操作,对仓库项目提交,结合 github action 进行自动化部署

Solution

Read / Input

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) # 允许跨域请求

    @pic.route("/", methods=["POST"])
    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

Other

< - 僕らは知らない - >