#!/bin/bash while getopts ":x:" opt do case $opt in x) export http_proxy=$OPTARG export https_proxy=$http_proxy echo "使用代理 $https_proxy" ;; ?) echo "未知参数" exit 1;; esac done jsonQ() { json=$(cat) awk -v json="$json" -v json_original="$json" -v key="$1" ' function strLastChar(s) { return substr(s, length(s), 1) } function startWith(s, c) { start = substr(s, 1, 1) return start == c } function endWith(s, c) { return strLastChar(s) == c } function innerStr(s) { # 取出括号/引号内的内容 return substr(s, 2, length(s)-2) } function strIndex(s, n) { # 字符串通过下标取值,索引是从1开始的 return substr(s, n, 1) } function trim(s) { sub("^[ \n]*", "", s); sub("[ \n]*$", "", s); return s } function findValueByKey(s, k) { if ("\""k"\"" != substr(s, 1, length(k)+2)) {exit 0} s = trim(s) start = 0; stop = 0; layer = 0 for (i = 2 + length(k) + 1; i <= length(s); ++i) { lastChar = substr(s, i - 1, 1) currChar = substr(s, i, 1) if (start <= 0) { if (lastChar == ":") { start = currChar == " " ? i + 1: i if (currChar == "{" || currChar == "[") { layer = 1 } } } else { if (currChar == "{" || currChar == "[") { ++layer } if (currChar == "}" || currChar == "]") { --layer } if ((currChar == "," || currChar == "}" || currChar == "]") && layer <= 0) { stop = currChar == "," ? i : i + 1 + layer break } } } if (start <= 0 || stop <= 0 || start > length(s) || stop > length(s) || start >= stop) { exit 0 } else { return trim(substr(s, start, stop - start)) } } function unquote(s) { if (startWith(s, "\"")) { s = substr(s, 2, length(s)-1) } if (endWith(s, "\"")) { s = substr(s, 1, length(s)-1) } return s } BEGIN{ if (match(key, /^\./) == 0) {exit 0;} sub(/\][ ]*\[/,"].[", key) split(key, ks, ".") if (length(ks) == 1) {print json; exit 0} for (j = 2; j <= length(ks); j++) { k = ks[j] if (startWith(k, "[") && endWith(k, "]") == 1) { # [n] idx = innerStr(k) currentIdx = -1 # 找匹配对 pairs = "" json = trim(json) if (startWith(json, "[") == 0) { exit 0 } start = 2 cursor = 2 for (; cursor <= length(json); cursor++) { current = strIndex(json, cursor) if (current == " " || current == "\n") {continue} # 忽略空白 if (current == "[" || current == "{") { if (length(pairs) == 0) {start = cursor} pairs = pairs""current } if (current == "]" || current == "}") { if ((strLastChar(pairs) == "[" && current == "]") || (strLastChar(pairs) == "{" && current == "}")) { pairs = substr(pairs, 1, length(pairs)-1) # 删掉最后一个字符 if (pairs == "") { # 匹配到了所有的左括号 currentIdx++ if (currentIdx == idx) { json = substr(json, start, cursor-start+1) break } } } else { pairs = pairs""current } } } } else { # 到这里,就只能是{"key": "value"}或{"key":{}}或{"key":[{}]} pairs = "" json = trim(json) if (startWith(json, "[")) {exit 0} #if (!startWith(json, "\"") || !startWith(json, "{")) {json="\""json} # 找匹配的键 start = 2 cursor = 2 noMatch = 0 for (; cursor <= length(json); cursor++) { current = strIndex(json, cursor) if (current == " " || current == "\n" || current == ",") {continue} # 忽略空白和逗号 if (substr(json, cursor, length(k)+2) == "\""k"\"") { json = findValueByKey(substr(json, cursor, length(json)-cursor+1), k) break } else { noMatch = 1 } if (noMatch) { pos = match(substr(json, cursor+1, length(json)-cursor), /[^(\\")]"/) ck = substr(substr(json, cursor+1, length(json)-cursor), 1, pos) t = findValueByKey(substr(json, cursor, length(json)-cursor+1), ck) tLen = length(t) sub(/\\/, "\\\\", t) pos = match(substr(json, cursor+1, length(json)-cursor), t) if (pos != 0) { cursor = cursor + pos + tLen } noMatch = 0 continue } } } } if (json_original == json) { print;exit 0 } print unquote(json) }' } month=2592000 timestamp=$(date +%s) lastMonth=$(( timestamp-month )) function isUpdated() { t1=`gdate -d "$1" +%s` if [ $t1 -gt $lastMonth ] then return 0 else return 1 fi } rm -rf result.log i=1 data=$(cat ../source/nodelist.txt) for url in $data; do if [[ $url == https://raw.githubusercontent.com* ]]; then i=$[$i+1] code=$(curl -o /dev/null -k -s -w %{http_code} $url) if [ $code -ne 404 ] then arr=(`echo $url | tr '/' ' '`) repository=${arr[2]}%2F${arr[3]} response=$(curl -s https://github.com/search?q=$repository&type=repositories) response=$(echo "$response" | jsonQ ".payload.results.[0].repo.repository.updated_at") response=${response: 0: 19} response=${response/T/' '} if isUpdated $response ; then echo $url >> result.log fi fi ix=`expr $i % 8` if [ $ix -eq 0 ] then echo stop sleep 120 fi fi done