Фильтр JQ и api github

#bash #api #jq #github-api

Вопрос:

У меня есть простая задача написать скрипт с curl и jq, который будет печатать количество запросов на вытягивание, созданных каждым участником с помощью меток. Я смог отфильтровать запросы на вытягивание по участникам:

 curl -H "Accept: application/vnd.github.v3 json" https://api.github.com/repos/jina-ai/jina/pulls?state=opened | jq '. [] | .user.login, .labels'
 

Но как быть дальше, может быть, ты сможешь что-нибудь придумать.

Спасибо

Комментарии:

1. Покажите нам образец ввода и вывода.

Ответ №1:

API GitHub сообщает, есть ли в заголовке больше страниц результатов link .

Вы можете получить последнюю страницу результатов, проанализировав заголовок, например, следующим образом link awk :

Это сделано для того per_page=1 , чтобы заставить чрезмерную подкачку результатов для демонстрации того, как анализировать link заголовок API GitHub.

НЕ ДЕЛАЙТЕ ЭТОГО НА ПРОИЗВОДСТВЕ, так как это было бы очень неэффективно

 #!/usr/bin/env bash

API='https://api.github.com'

# DO NOT SET IT TO 1 IN PRODUCTION
per_page=1

# Get the last page
last_page=$(
  curl 
    --silent 
    --head 
    --header "Accept: application/vnd.github.v3 json" 
    --url "${API}/repos/jina-ai/jina/pulls?per_page=${per_page}amp;state=opened" |
      awk -F',' '
/^link:/{
  for(i=1; i <= NF; i  ) {
    if(match($i, "[amp;?]page=([0-9] ).*rel="last"", a)) print a[1]
  }
}'
)

# In case there is no paging, we need to set this to 1)
last_page=${last_page:-1}

for ((page=1; page <= last_page; page  )); do
  curl 
    --silent 
    --header "Accept: application/vnd.github.v3 json" 
    --url "${API}/repos/jina-ai/jina/pulls?per_page=${per_page}amp;page=${page}amp;state=opened" |
    jq '.[] | (.user.login, .labels)'
done
 

Комментарии:

1. Привет, это не сработает, в нем будут отображаться только имена участников с пустыми ярлыками, например: «декайлала» [] «МузафферДеде» [] «хендрасоб» [] Какие-либо другие идеи?

2. Да, вы можете условно отображать метки jq . Я позволил тебе немного поискать, как if then end jq это сделать .