使用bash从Github V3 API获取文件的文本。
使用bash从Github V3 API获取文件的文本。
我正试图使用GitHub的获取内容 API从我们的GitHub获取配置文件。
这会返回一个包含以base64字符串编码的文件内容的JSON。
我想要获取文本格式
我已经采取的步骤
- 获取初始API响应:
curl -H 'Authorization: token MY_TOKEN' \ https://github.com/api/v3/repos/MY_OWNER/MY_REPO/contents/MY_FILE
这会返回一个包含字段
"content": "encoded content ..."
的JSON响应。 - 获取编码字符串:
添加
| grep -F "content\":" 这会获取到内容,但仍然有
"content":
字符串,"
字符和末尾的逗号。 - 去除多余部分:
| cut -d ":" -f 2 | cut -d "\"" -f 2 - 解码:
最终命令:
curl -H 'Authorization: token MY_TOKEN' \ https://github.com/api/v3/repos/MY_OWNER/MY_REPO/contents/MY_FILE | \ grep -F "content\":" | cut -d ":" -f 2 | cut -d "\"" -f 2 | base64 --decode
问题:
- 在一个在线解码器中(不好 -> 参见下一条),结果字符串(在
base64 --decode
之前)解码成功,但在bash中无法解码。响应为"Invalid character in input stream."
- 在在线解码器中解码字符串时,一些(不是全部)文件内容是乱码,而不是原始文本。我已尝试了所有可用的字符集。
注意事项:
- 我尝试使用
sed 's/..$//'
删除最后2个(换行)字符,但效果不明显。 - 如果我用鼠标选择输出并将其粘贴到
echo MY_ECODED_STRING_PASTED_HERE | base64 --decode
命令中,它的效果与在线工具相同,即解码为乱码。
问题的出现原因是没有在GET请求中添加正确的header信息。
解决方法是在GET请求中添加header信息:Accept: application/vnd.github.VERSION.raw
。这是控制所需内容的推荐方式,可以参考文档:developer.github.com/v3/media/#git-blob-properties。
问题:使用bash从Github V3 API获取文件作为文本的原因是脚本的stdout不会刷新,只能得到文件的前几行。
解决方法:使用jq
提取方法,并不需要使用临时文件。
文章:
使用bash从Github V3 API获取文件作为文本是一个常见的需求。然而,有一个问题是在脚本中运行时,stdout不会刷新,只能得到文件的前几行。
为了解决这个问题,可以采用以下方法:
首先,根据tripleee的建议,我们将提取方法切换到jq
。下面是使用jq
的示例代码:
file=randomFileName74894031264.txt curl -H 'Authorization: token MY_TOKEN' https://github.com/api/v3/repos/MY_OWNER/MY_REPO/contents/MY_FILE > "$file" encoded_str=($(jq -r '.content' "$file")) echo "$encoded_str" | base64 -D rm -f "$file"
上述代码在命令行中运行时是有效的,但是在脚本中运行时,stdout不会刷新,只能得到文件的前几行。
为了解决这个问题,我们可以使用curl | jq -r .content | base64 -D
的方法,这样就不需要使用临时文件了。
以上就是从Github V3 API获取文件作为文本的原因以及解决方法。通过使用jq
提取方法,并不需要使用临时文件,就能够实现获取完整文件内容的需求。