使用Python调用GitHub REST API更新文件内容时遇400错误及JSON解析问题
解决GitHub Update File Contents API返回400(Problems parsing JSON)的问题
问题根源
你的代码存在两个关键问题导致JSON解析失败:
- Base64编码结果处理错误:
base64.b64encode返回的是bytes类型,直接用f-string转换会保留b''前缀(比如b'dGVzdA=='变成"b'dGVzdA=='"),这会让GitHub无法识别合法的base64内容。 - 请求体格式错误:使用
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
相关产品推荐
相关产品推荐

