尝试将curl的日期特定提交历史记录转换为原始json文本文件。关于Since,Until和Pagination的问题?

时间:2017-07-23 20:22:40

标签: curl github github-api

所以我在终端上运行它:

curl https://api.github.com/repos/d3/d3/commits?since=2016-07-23T00:00:00Z&until=2017-07-23T23:59:59Z

我认为我得到了我想要的东西,但结果并不完整。我想我只是第一页。我的下一步行动是将其支持到我能够提供的最早的条目:

curl https://api.github.com/repos/d3/d3/commits?since=2016-07-23T00:00:00Z&until=2017-01-26T21:07:19Z

我认为这会给我一组单独的结果(和手动连接),但它与第一​​行完全相同。添加?page = 1,2,3 ...也没有改变我的结果。

另外:我尝试将此请求导入文本文件,但是当我打开并且命令在终端中运行时它是空白的。

curl (url) > YearCommits.txt

我做错了什么?

1 个答案:

答案 0 :(得分:1)

在您的网址周围添加引号,否则您的shell将解释第一个&并将&左侧的命令在后台运行(因此忽略您在右侧添加的所有参数它):

curl "https://api.github.com/repos/d3/d3/commits?since=2016-07-23T00:00:00Z&until=2017-07-23T23:59:59Z" 

请参阅this link以遍历分页。

以下请求将检索第2页:

curl "https://api.github.com/repos/d3/d3/commits?since=2016-07-23T00:00:00Z&until=2017-07-23T23:59:59Z&page=2" 

这是一个bash脚本,它使用curl和jq JSON解析器将每个请求的JSON结果连接到文件commit_list.json

#!/bin/bash

repo=d3/d3
output_file=commit_list.json

loop=0
index=1
tmp_file=tmpfile.txt
per_page=100
access_token=12345666799897950400303332323

rm -f $tmp_file
echo "[]" > $output_file

while [ "$loop" -ne 1 ]
do
    data=$(curl -s "https://api.github.com/repos/$repo/commits?access_token=$access_token&since=2014-07-23T00:00:00Z&until=2017-07-23T23:59:59Z&page=$index&per_page=$per_page")

    check_error=$(echo "$data"  | jq 'type!="array" or length == 0')

    if [ "$check_error" == "true" ]; then
        exit 1
    fi

    if [ "$data" == "[]" ]; then
        loop=1
    else
        echo "$data" > $tmp_file
        concat=$(jq -s add $tmp_file $output_file)
        echo "$concat" > $output_file
        size=$(jq '. | length' $output_file)
        echo "computed $index page - fetched total commit array size of : $size"
        index=$((index+1))
    fi
done