You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python调用GitHub REST API更新文件内容时遇400错误及JSON解析问题

解决GitHub Update File Contents API返回400(Problems parsing JSON)的问题

问题根源

你的代码存在两个关键问题导致JSON解析失败:

  1. Base64编码结果处理错误:base64.b64encode返回的是bytes类型,直接用f-string转换会保留b''前缀(比如b'dGVzdA=='变成"b'dGVzdA=='"),这会让GitHub无法识别合法的base64内容。
  2. 请求体格式错误:使用requests.put的data参数传字典时,requests会自动将其编码为application/x-www-form-urlencoded格式,但GitHub API要求的是application/json格式的请求体。

修复方案

1. 修正Base64编码的返回值

将bytes类型的编码结果解码为纯字符串:

def convert_to_base64(md_payload):
    encoded_payload = base64.b64encode(md_payload.encode('utf-8'))
    # 解码为UTF-8字符串,移除bytes类型的b''标识
    return encoded_payload.decode('utf-8')

2. 改用json参数传递请求体

把data替换为json,让requests自动将字典序列化为JSON格式并设置正确的请求头:

def log_todo(username, repo_name, filename, api_key, sha, encoded_payload):
    response= requests.put(
        f'https://api.github.com/repos/{username}/{repo_name}/contents/{filename}',
        headers = {
            'Accept': 'application/vnd.github+json',
            'Authorization': f'Bearer {api_key}'
        },
        # 替换data为json参数,自动处理JSON序列化
        json = {
            "sha": sha,
            "message": "TEST",
            "committer": {
                "name": "TEST",
                "email": "test@test.rocks"
            },
            "content": encoded_payload
        }
    )
    logging.error(f'##### Was TODO Logged in VCS?: {response.text}')
    return response.status_code

额外优化提示

  • 无需用f-string包裹sha和encoded_payload变量,直接传入字典即可,避免不必要的字符串转换。
  • 确保sha参数是目标文件当前的有效SHA值,否则后续可能会触发409冲突错误。

内容的提问来源于stack exchange,提问作者SeaDude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:25:29