使用bash从Github V3 API获取文件的文本。

13 浏览
0 Comments

使用bash从Github V3 API获取文件的文本。

我正试图使用GitHub的获取内容 API从我们的GitHub获取配置文件。

这会返回一个包含以base64字符串编码的文件内容的JSON。

我想要获取文本格式

我已经采取的步骤

  1. 获取初始API响应:

    curl -H 'Authorization: token MY_TOKEN' \
    https://github.com/api/v3/repos/MY_OWNER/MY_REPO/contents/MY_FILE

    这会返回一个包含字段"content": "encoded content ..."的JSON响应。

  2. 获取编码字符串:

    添加

    | grep -F "content\":"

    这会获取到内容,但仍然有"content":字符串,"字符和末尾的逗号。

  3. 去除多余部分:

    | cut -d ":" -f 2 | cut -d "\"" -f 2

  4. 解码:

最终命令:

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

问题:

  1. 在一个在线解码器中(不好 -> 参见下一条),结果字符串(在base64 --decode之前)解码成功,但在bash中无法解码。响应为

    "Invalid character in input stream."

  2. 在线解码器中解码字符串时,一些(不是全部)文件内容是乱码,而不是原始文本。我已尝试了所有可用的字符集。

注意事项:

  1. 我尝试使用sed 's/..$//'删除最后2个(换行)字符,但效果不明显。
  2. 如果我用鼠标选择输出并将其粘贴到echo MY_ECODED_STRING_PASTED_HERE | base64 --decode命令中,它的效果与在线工具相同,即解码为乱码。
0
0 Comments

问题的出现原因是没有在GET请求中添加正确的header信息。

解决方法是在GET请求中添加header信息:Accept: application/vnd.github.VERSION.raw。这是控制所需内容的推荐方式,可以参考文档:developer.github.com/v3/media/#git-blob-properties

0
0 Comments

问题:使用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提取方法,并不需要使用临时文件,就能够实现获取完整文件内容的需求。

0