使用Python向GitHub仓库推送w.txt后文件为空,求排查原因
问题原因及解决办法
核心问题:更新已有文件时缺少sha参数
GitHub的Contents API在更新已有文件时,必须提供该文件当前的SHA-1哈希值。如果不传入sha参数,API无法确认你要更新的是哪个版本的文件,会导致操作异常,出现看似成功但文件内容为空的情况。
解决步骤
先获取目标文件的当前SHA值
在执行PUT请求前,先发送GET请求到同一个API地址,获取文件的sha字段:import requests # 获取文件当前的sha值 get_api = "https://api.github.com/repos/Ixonblitz-MatOS/Worm/contents/w.txt" get_headers = {"Authorization": f"Bearer {token}"} get_r = requests.get(get_api, headers=get_headers) file_sha = get_r.json()["sha"] if get_r.status_code == 200 else None在PUT请求的data中添加
sha参数
修改你的data字典,加入sha字段:data = { "message": msg, "content": text.decode("utf-8") } if file_sha: data["sha"] = file_sha额外确认:文件读取与编码流程
虽然你提到print(aa)能看到内容,但建议显式指定编码避免潜在问题:# 显式指定utf-8编码读取文件 aa = open(fileName, 'r', encoding='utf-8').read() print(aa) # 直接完成base64编码并转字符串 text = base64.b64encode(aa.encode("utf-8")).decode("utf-8") data["content"] = text
完整修正后的代码示例
import requests import base64 fileName = "w.txt" token = "你的有效token" msg = "更新w.txt文件" # 获取文件当前sha值(文件不存在则为None) get_api = "https://api.github.com/repos/Ixonblitz-MatOS/Worm/contents/w.txt" get_headers = {"Authorization": f"Bearer {token}"} get_r = requests.get(get_api, headers=get_headers) file_sha = get_r.json()["sha"] if get_r.status_code == 200 else None # 读取文件并编码 aa = open(fileName, 'r', encoding='utf-8').read() print(aa) text = base64.b64encode(aa.encode("utf-8")).decode("utf-8") # 构造请求并发送 api = "https://api.github.com/repos/Ixonblitz-MatOS/Worm/contents/w.txt" headers = { "Authorization": f"Bearer {token}", "Content-type": "application/vnd.github+json" } data = { "message": msg, "content": text } if file_sha: data["sha"] = file_sha r = requests.put(api, headers=headers, json=data) print(r.text)
内容的提问来源于stack exchange,提问作者user19926715
相关产品推荐
相关产品推荐

